//kernel/trunk/generic/include/elf.h |
---|
31,7 → 31,7 |
#include <arch/elf.h> |
#include <arch/types.h> |
#include <mm/as.h> |
#include <typedefs.h> |
/** |
* current ELF version |
//kernel/trunk/generic/include/mm/as.h |
---|
46,6 → 46,7 |
#include <synch/mutex.h> |
#include <adt/list.h> |
#include <adt/btree.h> |
#include <elf.h> |
/** Defined to be true if user address space and kernel address space shadow each other. */ |
#define KERNEL_ADDRESS_SPACE_SHADOWED KERNEL_ADDRESS_SPACE_SHADOWED_ARCH |
118,9 → 119,15 |
} mem_backend_t; |
/** Backend data stored in address space area. */ |
typedef struct backend_data { |
__native d1; |
__native d2; |
typedef union { |
struct { /**< elf_backend members */ |
elf_header_t *elf; |
elf_segment_header_t *segment; |
}; |
struct { /**< phys_backend members */ |
__address base; |
count_t frames; |
}; |
} mem_backend_data_t; |
/** Address space area structure. |
//kernel/trunk/generic/src/ddi/ddi.c |
---|
65,7 → 65,10 |
cap_t caps; |
task_t *t; |
int flags; |
mem_backend_data_t backend_data = { .d1 = (__native) pf, .d2 = (__native) pages }; |
mem_backend_data_t backend_data; |
backend_data.base = pf; |
backend_data.frames = pages; |
/* |
* Make sure the caller is authorised to make this syscall. |
//kernel/trunk/generic/src/lib/elf.c |
---|
162,7 → 162,10 |
{ |
as_area_t *a; |
int flags = 0; |
mem_backend_data_t backend_data = { .d1 = (__native) elf, .d2 = (__native) entry }; |
mem_backend_data_t backend_data; |
backend_data.elf = elf; |
backend_data.segment = entry; |
if (entry->p_align > 1) { |
if ((entry->p_offset % entry->p_align) != (entry->p_vaddr % entry->p_align)) { |
//kernel/trunk/generic/src/mm/backend_anon.c |
---|
51,9 → 51,6 |
static void anon_frame_free(as_area_t *area, __address page, __address frame); |
static void anon_share(as_area_t *area); |
/* |
* Anonymous memory backend. |
*/ |
mem_backend_t anon_backend = { |
.page_fault = anon_page_fault, |
.frame_free = anon_frame_free, |
//kernel/trunk/generic/src/mm/backend_phys.c |
---|
63,8 → 63,8 |
*/ |
int phys_page_fault(as_area_t *area, __address addr, pf_access_t access) |
{ |
__address base = (__address) area->backend_data.d1; |
count_t frames = (count_t) area->backend_data.d2; |
__address base = area->backend_data.base; |
count_t frames = area->backend_data.frames; |
if (!as_area_check_access(area, access)) |
return AS_PF_FAULT; |
//kernel/trunk/generic/src/mm/backend_elf.c |
---|
64,8 → 64,8 |
*/ |
int elf_page_fault(as_area_t *area, __address addr, pf_access_t access) |
{ |
elf_header_t *elf = (elf_header_t *) area->backend_data.d1; |
elf_segment_header_t *entry = (elf_segment_header_t *) area->backend_data.d2; |
elf_header_t *elf = area->backend_data.elf; |
elf_segment_header_t *entry = area->backend_data.segment; |
__address base, frame; |
index_t i; |
132,8 → 132,8 |
*/ |
void elf_frame_free(as_area_t *area, __address page, __address frame) |
{ |
elf_header_t *elf = (elf_header_t *) area->backend_data.d1; |
elf_segment_header_t *entry = (elf_segment_header_t *) area->backend_data.d2; |
elf_header_t *elf = area->backend_data.elf; |
elf_segment_header_t *entry = area->backend_data.segment; |
__address base; |
index_t i; |