/kernel/trunk/generic/include/mm/as.h |
---|
37,6 → 37,9 |
#include <synch/spinlock.h> |
#include <adt/list.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 |
#define KERNEL_ADDRESS_SPACE_START KERNEL_ADDRESS_SPACE_START_ARCH |
#define KERNEL_ADDRESS_SPACE_END KERNEL_ADDRESS_SPACE_END_ARCH |
#define USER_ADDRESS_SPACE_START USER_ADDRESS_SPACE_START_ARCH |
/kernel/trunk/generic/include/macros.h |
---|
39,7 → 39,7 |
#define min(a,b) ((a)<(b)?(a):(b)) |
#define max(a,b) ((a)>(b)?(a):(b)) |
/* Return true if the interlvals overlap */ |
/** Return true if the interlvals overlap. */ |
static inline int overlaps(__address s1,size_t sz1, __address s2, size_t sz2) |
{ |
__address e1 = s1+sz1; |
/kernel/trunk/generic/src/lib/elf.c |
---|
165,12 → 165,6 |
} |
} |
/* |
* Check if the segment doesn't interfere with kernel address space. |
*/ |
if (entry->p_vaddr + ALIGN_UP(entry->p_memsz, PAGE_SIZE) >= USER_ADDRESS_SPACE_END) |
return EE_MEMORY; |
if (entry->p_flags & PF_X) |
flags |= AS_AREA_EXEC; |
if (entry->p_flags & PF_W) |
195,7 → 189,7 |
a = as_area_create(as, flags, entry->p_memsz, entry->p_vaddr); |
if (!a) |
return EE_IRRECOVERABLE; |
return EE_MEMORY; |
for (i = 0; i < SIZE2FRAMES(entry->p_filesz); i++) { |
as_set_mapping(as, entry->p_vaddr + i*PAGE_SIZE, KA2PA(((__address) segment) + i*PAGE_SIZE)); |
/kernel/trunk/generic/src/mm/as.c |
---|
51,6 → 51,7 |
#include <arch/asm.h> |
#include <debug.h> |
#include <memstr.h> |
#include <macros.h> |
#include <arch.h> |
#include <print.h> |
537,9 → 538,15 |
link_t *cur; |
as_area_t *a; |
/* |
* We don't want any area to have conflicts with NULL page. |
*/ |
if (overlaps(va, size, NULL, PAGE_SIZE)) |
return false; |
for (cur = as->as_area_head.next; cur != &as->as_area_head; cur = cur->next) { |
__address start; |
__address end; |
__address a_start; |
size_t a_size; |
a = list_get_instance(cur, as_area_t, link); |
if (a == avoid_area) |
547,33 → 554,24 |
spinlock_lock(&a->lock); |
start = a->base; |
end = a->base + a->pages * PAGE_SIZE - 1; |
a_start = a->base; |
a_size = a->pages * PAGE_SIZE; |
spinlock_unlock(&a->lock); |
if ((va >= start) && (va <= end)) { |
/* |
* Tested area is inside another area. |
*/ |
if (overlaps(va, size, a_start, a_size)) |
return false; |
} |
if ((start >= va) && (start < va + size)) { |
/* |
* Another area starts in tested area. |
*/ |
return false; |
} |
if ((end >= va) && (end < va + size)) { |
/* |
* Another area ends in tested area. |
* So far, the area does not conflict with other areas. |
* Check if it doesn't conflict with kernel address space. |
*/ |
return false; |
if (!KERNEL_ADDRESS_SPACE_SHADOWED) { |
return !overlaps(va, size, |
KERNEL_ADDRESS_SPACE_START, KERNEL_ADDRESS_SPACE_END-KERNEL_ADDRESS_SPACE_START); |
} |
} |
return true; |
} |
/kernel/trunk/arch/sparc64/include/mm/as.h |
---|
29,7 → 29,7 |
#ifndef __sparc64_AS_H__ |
#define __sparc64_AS_H__ |
#include <arch/types.h> |
#define KERNEL_ADDRESS_SPACE_SHADOWED_ARCH 1 |
#define KERNEL_ADDRESS_SPACE_START_ARCH (__address) 0x0000000000000000 |
#define KERNEL_ADDRESS_SPACE_END_ARCH (__address) 0xffffffffffffffff |
/kernel/trunk/arch/ia64/include/mm/as.h |
---|
29,7 → 29,7 |
#ifndef __ia64_AS_H__ |
#define __ia64_AS_H__ |
#include <arch/types.h> |
#define KERNEL_ADDRESS_SPACE_SHADOWED_ARCH 0 |
#define KERNEL_ADDRESS_SPACE_START_ARCH (__address) 0xe000000000000000ULL |
#define KERNEL_ADDRESS_SPACE_END_ARCH (__address) 0xffffffffffffffffULL |
/kernel/trunk/arch/ppc32/include/mm/as.h |
---|
29,7 → 29,7 |
#ifndef __ppc32_AS_H__ |
#define __ppc32_AS_H__ |
#include <arch/types.h> |
#define KERNEL_ADDRESS_SPACE_SHADOWED_ARCH 0 |
#define KERNEL_ADDRESS_SPACE_START_ARCH ((__address) 0x80000000) |
#define KERNEL_ADDRESS_SPACE_END_ARCH ((__address) 0xffffffff) |
/kernel/trunk/arch/amd64/include/mm/as.h |
---|
29,7 → 29,7 |
#ifndef __amd64_AS_H__ |
#define __amd64_AS_H__ |
#include <arch/types.h> |
#define KERNEL_ADDRESS_SPACE_SHADOWED_ARCH 0 |
#define KERNEL_ADDRESS_SPACE_START_ARCH (__address) 0xffff800000000000 |
#define KERNEL_ADDRESS_SPACE_END_ARCH (__address) 0xffffffffffffffff |
/kernel/trunk/arch/mips32/include/mm/as.h |
---|
29,8 → 29,7 |
#ifndef __mips32_AS_H__ |
#define __mips32_AS_H__ |
#include <arch/types.h> |
#include <typedefs.h> |
#define KERNEL_ADDRESS_SPACE_SHADOWED_ARCH 0 |
#define KERNEL_ADDRESS_SPACE_START_ARCH (__address) 0x80000000 |
#define KERNEL_ADDRESS_SPACE_END_ARCH (__address) 0xffffffff |
/kernel/trunk/arch/ia32/include/mm/as.h |
---|
29,7 → 29,7 |
#ifndef __ia32_AS_H__ |
#define __ia32_AS_H__ |
#include <arch/types.h> |
#define KERNEL_ADDRESS_SPACE_SHADOWED_ARCH 0 |
#define KERNEL_ADDRESS_SPACE_START_ARCH ((__address) 0x80000000) |
#define KERNEL_ADDRESS_SPACE_END_ARCH ((__address) 0xffffffff) |