/kernel/trunk/generic/include/mm/as.h |
---|
48,9 → 48,10 |
#define FLAG_AS_KERNEL (1 << 0) /**< Kernel address space. */ |
enum as_area_type { |
AS_AREA_TEXT = 1, AS_AREA_DATA, AS_AREA_STACK |
}; |
/** Address space area flags. */ |
#define AS_AREA_READ 1 |
#define AS_AREA_WRITE 2 |
#define AS_AREA_EXEC 4 |
/** Address space area structure. |
* |
60,7 → 61,7 |
struct as_area { |
SPINLOCK_DECLARE(lock); |
link_t link; |
as_area_type_t type; |
int flags; |
size_t size; /**< Size of this area in multiples of PAGE_SIZE. */ |
__address base; /**< Base address of this area. */ |
}; |
103,7 → 104,7 |
extern void as_init(void); |
extern as_t *as_create(int flags); |
extern as_area_t *as_area_create(as_t *as, as_area_type_t type, size_t size, __address base); |
extern as_area_t *as_area_create(as_t *as, int flags, size_t size, __address base); |
extern __address as_remap(as_t *as, __address address, size_t size, int flags); |
extern void as_set_mapping(as_t *as, __address page, __address frame); |
extern int as_page_fault(__address page); |
/kernel/trunk/generic/src/proc/task.c |
---|
122,7 → 122,7 |
/* |
* Create the data as_area. |
*/ |
a = as_area_create(as, AS_AREA_STACK, 1, USTACK_ADDRESS); |
a = as_area_create(as, AS_AREA_READ | AS_AREA_WRITE, 1, USTACK_ADDRESS); |
thread_ready(t); |
/kernel/trunk/generic/src/lib/elf.c |
---|
155,7 → 155,7 |
int load_segment(elf_segment_header_t *entry, elf_header_t *elf, as_t *as) |
{ |
as_area_t *a; |
int i, type = 0; |
int i, flags = 0; |
size_t segment_size; |
__u8 *segment; |
171,13 → 171,12 |
if (entry->p_vaddr + ALIGN_UP(entry->p_memsz, PAGE_SIZE) >= USER_ADDRESS_SPACE_END) |
return EE_MEMORY; |
if (entry->p_flags & PF_X) { |
type = AS_AREA_TEXT; |
} else if (entry->p_flags & PF_W) { |
type = AS_AREA_DATA; |
} else { |
return EE_UNSUPPORTED; |
} |
if (entry->p_flags & PF_X) |
flags |= AS_AREA_EXEC; |
if (entry->p_flags & PF_W) |
flags |= AS_AREA_WRITE; |
if (entry->p_flags & PF_R) |
flags |= AS_AREA_READ; |
/* |
* Check if the virtual address starts on page boundary. |
194,7 → 193,7 |
} else /* Map identically original data */ |
segment = ((void *) elf) + entry->p_offset; |
a = as_area_create(as, type, SIZE2FRAMES(entry->p_memsz), entry->p_vaddr); |
a = as_area_create(as, flags, SIZE2FRAMES(entry->p_memsz), entry->p_vaddr); |
if (!a) |
return EE_IRRECOVERABLE; |
/kernel/trunk/generic/src/mm/as.c |
---|
119,13 → 119,13 |
* The created address space area is added to the target address space. |
* |
* @param as Target address space. |
* @param type Type of area. |
* @param flags Flags of the area. |
* @param size Size of area in multiples of PAGE_SIZE. |
* @param base Base address of area. |
* |
* @return Address space area on success or NULL on failure. |
*/ |
as_area_t *as_area_create(as_t *as, as_area_type_t type, size_t size, __address base) |
as_area_t *as_area_create(as_t *as, int flags, size_t size, __address base) |
{ |
ipl_t ipl; |
as_area_t *a; |
145,7 → 145,7 |
spinlock_initialize(&a->lock, "as_area_lock"); |
link_initialize(&a->link); |
a->type = type; |
a->flags = flags; |
a->size = size; |
a->base = base; |
326,18 → 326,17 |
{ |
int flags; |
switch (a->type) { |
case AS_AREA_TEXT: |
flags = PAGE_EXEC | PAGE_READ | PAGE_USER | PAGE_PRESENT | PAGE_CACHEABLE; |
break; |
case AS_AREA_DATA: |
case AS_AREA_STACK: |
flags = PAGE_READ | PAGE_WRITE | PAGE_USER | PAGE_PRESENT | PAGE_CACHEABLE; |
break; |
default: |
panic("unexpected as_area_type_t %d", a->type); |
} |
flags = PAGE_USER | PAGE_PRESENT | PAGE_CACHEABLE; |
if (a->flags & AS_AREA_READ) |
flags |= PAGE_READ; |
if (a->flags & AS_AREA_WRITE) |
flags |= PAGE_WRITE; |
if (a->flags & AS_AREA_EXEC) |
flags |= PAGE_EXEC; |
return flags; |
} |