mirror of
https://github.com/drasko/codezero.git
synced 2026-02-26 16:53:14 +01:00
Added pager_map_file_page() which maps a file offset as a pointer.
This commit is contained in:
@@ -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__ */
|
||||
|
||||
@@ -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 *)
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user