From 906c8ac679d4281aaf2c347551a4827c9b7058f8 Mon Sep 17 00:00:00 2001 From: Bahadir Balban Date: Fri, 21 Nov 2008 23:27:43 +0200 Subject: [PATCH] Added pager_map_file_page() which maps a file offset as a pointer. --- tasks/mm0/include/memory.h | 3 ++- tasks/mm0/src/lib/elf/elf.c | 14 ++++++-------- tasks/mm0/src/memory.c | 18 ++++++++++++++++++ 3 files changed, 26 insertions(+), 9 deletions(-) diff --git a/tasks/mm0/include/memory.h b/tasks/mm0/include/memory.h index 33622d8..a04ff60 100644 --- a/tasks/mm0/include/memory.h +++ b/tasks/mm0/include/memory.h @@ -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__ */ diff --git a/tasks/mm0/src/lib/elf/elf.c b/tasks/mm0/src/lib/elf/elf.c index 5cc8c1f..140b215 100644 --- a/tasks/mm0/src/lib/elf/elf.c +++ b/tasks/mm0/src/lib/elf/elf.c @@ -3,6 +3,7 @@ * * Copyright (C) 2008 Bahadir Balban */ +#include #include #include #include @@ -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 *) diff --git a/tasks/mm0/src/memory.c b/tasks/mm0/src/memory.c index a46a330..bfa1049 100644 --- a/tasks/mm0/src/memory.c +++ b/tasks/mm0/src/memory.c @@ -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)); +}