Subversion Repositories HelenOS-historic

Compare Revisions

Ignore whitespace Rev 1427 → Rev 1428

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