Subversion Repositories HelenOS-historic

Compare Revisions

Ignore whitespace Rev 1025 → Rev 1026

/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;
}