/kernel/trunk/generic/include/mm/slab.h |
---|
38,7 → 38,7 |
#define SLAB_MIN_MALLOC_W 4 |
/** Maximum size to be allocated by malloc */ |
#define SLAB_MAX_MALLOC_W 17 |
#define SLAB_MAX_MALLOC_W 18 |
/** Initial Magazine size (TODO: dynamically growing magazines) */ |
#define SLAB_MAG_SIZE 4 |
/kernel/trunk/generic/include/mm/as.h |
---|
168,8 → 168,8 |
extern int as_page_fault(__address page, pf_access_t access, istate_t *istate); |
extern void as_switch(as_t *old, as_t *new); |
extern void as_free(as_t *as); |
extern int as_area_share(as_t *src_as, __address src_base, size_t acc_size, |
__address dst_base, int dst_flags_mask); |
int as_area_share(as_t *src_as, __address src_base, size_t acc_size, |
as_t *dst_as, __address dst_base, int dst_flags_mask); |
extern size_t as_get_size(__address base); |
extern int used_space_insert(as_area_t *a, __address page, count_t count); |
extern int used_space_remove(as_area_t *a, __address page, count_t count); |
/kernel/trunk/generic/include/ipc/ipc.h |
---|
42,7 → 42,7 |
#define IPC_CALL_DISCARD_ANSWER (1<<2) /**< Answer will not be passed to |
* userspace, will be discarded */ |
#define IPC_CALL_FORWARDED (1<<3) /* Call was forwarded */ |
#define IPC_CALL_CONN_ME_TO (1<<4) /* Identify connect_me_to */ |
#define IPC_CALL_CONN_ME_TO (1<<4) /* Identify connect_me_to answer */ |
#define IPC_CALL_NOTIF (1<<5) /* Interrupt notification */ |
/* Flags of callid (the addresses are aligned at least to 4, |
119,14 → 119,27 |
#define IPC_M_PHONE_HUNGUP 3 |
/** Interrupt notification */ |
#define IPC_M_INTERRUPT 4 |
/** Send as_area over IPC |
* - ARG2 - src base address |
* - ARG3 - size of src as(filled automatically by kernel) |
* - ARG1 - src base address |
* - ARG2 - size of src as(filled automatically by kernel) |
* - ARG3 - flags of the area being sent |
* - on answer ARG1 - dst base adress |
*/ |
#define IPC_M_AS_AREA_SEND 5 |
/** Get as_area over IPC |
* - ARG1 - Where the area will be mapped |
* - ARG2 - Expected size of area |
* - ARG3 - Requested rights for the area |
* on answer - the server sets ARG1 as src as address of the as_area |
* to be shared |
* |
* |
*/ |
#define IPC_M_AS_AREA_RECV 6 |
/* Well-known methods */ |
#define IPC_M_LAST_SYSTEM 511 |
#define IPC_M_PING 512 |
/kernel/trunk/generic/src/mm/slab.c |
---|
127,7 → 127,7 |
"malloc-16","malloc-32","malloc-64","malloc-128", |
"malloc-256","malloc-512","malloc-1K","malloc-2K", |
"malloc-4K","malloc-8K","malloc-16K","malloc-32K", |
"malloc-64K","malloc-128K" |
"malloc-64K","malloc-128K","malloc-256K" |
}; |
/** Slab descriptor */ |
/kernel/trunk/generic/src/mm/as.c |
---|
456,6 → 456,7 |
* @param src_as Pointer to source address space. |
* @param src_base Base address of the source address space area. |
* @param acc_size Expected size of the source area. |
* @param dst_as Pointer to destination address space. |
* @param dst_base Target base address. |
* @param dst_flags_mask Destination address space area flags mask. |
* |
467,7 → 468,7 |
* to share non-anonymous address space area is detected. |
*/ |
int as_area_share(as_t *src_as, __address src_base, size_t acc_size, |
__address dst_base, int dst_flags_mask) |
as_t *dst_as, __address dst_base, int dst_flags_mask) |
{ |
ipl_t ipl; |
int src_flags; |
543,7 → 544,7 |
* The flags of the source area are masked against dst_flags_mask |
* to support sharing in less privileged mode. |
*/ |
dst_area = as_area_create(AS, src_flags & dst_flags_mask, src_size, dst_base, |
dst_area = as_area_create(dst_as, src_flags & dst_flags_mask, src_size, dst_base, |
AS_AREA_ATTR_PARTIAL, src_backend, &src_backend_data); |
if (!dst_area) { |
/* |
/kernel/trunk/generic/src/ipc/sysipc.c |
---|
64,7 → 64,8 |
*/ |
static inline int is_forwardable(__native method) |
{ |
if (method == IPC_M_PHONE_HUNGUP || method == IPC_M_AS_AREA_SEND) |
if (method == IPC_M_PHONE_HUNGUP || method == IPC_M_AS_AREA_SEND \ |
|| method == IPC_M_AS_AREA_RECV) |
return 0; /* This message is meant only for the receiver */ |
return 1; |
} |
85,10 → 86,15 |
return 1; |
if (IPC_GET_METHOD(call->data) == IPC_M_AS_AREA_SEND) |
return 1; |
if (IPC_GET_METHOD(call->data) == IPC_M_AS_AREA_RECV) |
return 1; |
return 0; |
} |
/** Interpret process answer as control information */ |
/** Interpret process answer as control information |
* |
* This function is called directly after sys_ipc_answer |
*/ |
static inline int answer_preprocess(call_t *answer, ipc_data_t *olddata) |
{ |
int phoneid; |
139,8 → 145,22 |
interrupts_restore(ipl); |
return as_area_share(as, IPC_GET_ARG1(*olddata), IPC_GET_ARG2(*olddata), |
IPC_GET_ARG1(answer->data), IPC_GET_ARG3(*olddata)); |
AS, IPC_GET_ARG1(answer->data), IPC_GET_ARG3(*olddata)); |
} |
} else if (IPC_GET_METHOD(*olddata) == IPC_M_AS_AREA_RECV) { |
if (!IPC_GET_RETVAL(answer->data)) { |
ipl_t ipl; |
as_t *as; |
ipl = interrupts_disable(); |
spinlock_lock(&answer->sender->lock); |
as = answer->sender->as; |
spinlock_unlock(&answer->sender->lock); |
interrupts_restore(ipl); |
return as_area_share(AS, IPC_GET_ARG1(answer->data), IPC_GET_ARG2(*olddata), |
as, IPC_GET_ARG1(*olddata), IPC_GET_ARG3(*olddata)); |
} |
} |
return 0; |
} |