Added pager_map_file_page() which maps a file offset as a pointer.

This commit is contained in:
Bahadir Balban
2008-11-21 23:27:43 +02:00
parent 7d38243dff
commit 906c8ac679
3 changed files with 26 additions and 9 deletions

View File

@@ -28,5 +28,6 @@ void *pager_map_pages(struct vm_file *f, unsigned long page_offset, unsigned lon
void pager_unmap_pages(void *addr, unsigned long npages);
void *pager_map_page(struct vm_file *f, unsigned long page_offset);
void pager_unmap_page(void *addr);
void *pager_map_file_range(struct vm_file *f, unsigned long byte_offset,
` unsigned long size);
#endif /* __MEMORY_H__ */

View File

@@ -3,6 +3,7 @@
*
* Copyright (C) 2008 Bahadir Balban
*/
#include <memory.h>
#include <vm_area.h>
#include <lib/elf/elf.h>
#include <lib/elf/elfprg.h>
@@ -24,13 +25,6 @@ int elf_probe(struct elf_header *header)
return -1;
}
static inline void *pager_map_file_offset(struct vm_file *f, unsigned long f_offset)
{
void *page = pager_map_page(f, __pfn(f_offset));
return (void *)((unsigned long)page | (PAGE_MASK & f_offset));
}
/*
* Loading an ELF file:
*
@@ -48,6 +42,8 @@ int elf_parse_executable(struct tcb *task, struct vm_file *file,
struct elf_header *elf_header = pager_map_page(file, 0);
struct elf_program_header *prg_header_start, *prg_header_load;
struct elf_section_header *sect_header;
unsigned long sect_start, sect_end;
unsigned long prg_start, prg_end;
/* Test that it is a valid elf file */
if ((err = elf_probe(elf_header)) < 0)
@@ -66,7 +62,9 @@ int elf_parse_executable(struct tcb *task, struct vm_file *file,
}
/* Get the section header table */
if (__pfn(elf_header->e_shoff) > 0)
if (__pfn(elf_header->e_shoff) > 0) {
}
sect_header = pager_map_file_offset(file, elf_header->e_shoff);
else
sect_header = (struct elf_section_header *)

View File

@@ -168,8 +168,26 @@ void *pager_map_pages(struct vm_file *f, unsigned long page_offset, unsigned lon
/* Unmaps a page's virtual address from the pager's address space */
void pager_unmap_pages(void *addr, unsigned long npages)
{
/* Align to page if unaligned */
if (!is_page_aligned(addr))
addr = (void *)page_align(addr);
/* Unmap so many pages */
l4_unmap_helper(addr, npages);
/* Free the address range */
pager_delete_address(addr, npages);
}
/*
* Maps multiple pages on a contiguous virtual address range,
* returns pointer to byte offset in the file.
*/
void *pager_map_file_range(struct vm_file *f, unsigned long byte_offset,
` unsigned long size)
{
void *page = pager_map_pages(f, __pfn(byte_offset), __pfn(size));
return (void *)((unsigned long)page | (PAGE_MASK & f_offset));
}