Subversion Repositories HelenOS-historic

Compare Revisions

Ignore whitespace Rev 1069 → Rev 1070

/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,8 → 39,8
#define min(a,b) ((a)<(b)?(a):(b))
#define max(a,b) ((a)>(b)?(a):(b))
 
/* Return true if the interlvals overlap */
static inline int overlaps(__address s1,size_t sz1, __address s2, size_t sz2)
/** Return true if the interlvals overlap. */
static inline int overlaps(__address s1, size_t sz1, __address s2, size_t sz2)
{
__address e1 = s1+sz1;
__address e2 = s2+sz2;
/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.
*/
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.
*/
return false;
}
if (overlaps(va, size, a_start, a_size))
return false;
 
}
 
/*
* So far, the area does not conflict with other areas.
* Check if it doesn't conflict with kernel address space.
*/
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)