/kernel/trunk/generic/include/ipc/ipc.h |
---|
131,11 → 131,10 |
/** Get as_area over IPC |
* - ARG1 - Where the area will be mapped |
* - ARG2 - Expected size of area |
* - ARG3 - Requested rights for the area |
* - ARG3 - User defined argument |
* on answer - the server sets ARG1 as src as address of the as_area |
* to be shared |
* |
* |
* to be shared, ARG2 is set to rights that will be used for sharing, |
* which is returned as part of answer back to the receiver |
*/ |
#define IPC_M_AS_AREA_RECV 6 |
/kernel/trunk/generic/src/mm/as.c |
---|
516,7 → 516,7 |
src_backend = src_area->backend; |
src_backend_data = src_area->backend_data; |
if (src_size != acc_size) { |
if (src_size != acc_size || (src_flags & dst_flags_mask) != dst_flags_mask) { |
mutex_unlock(&src_area->lock); |
mutex_unlock(&src_as->lock); |
interrupts_restore(ipl); |
554,7 → 554,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(dst_as, src_flags & dst_flags_mask, src_size, dst_base, |
dst_area = as_area_create(dst_as, 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 |
---|
136,6 → 136,7 |
} else if (IPC_GET_METHOD(*olddata) == IPC_M_AS_AREA_SEND) { |
if (!IPC_GET_RETVAL(answer->data)) { /* Accepted, handle as_area receipt */ |
ipl_t ipl; |
int rc; |
as_t *as; |
ipl = interrupts_disable(); |
144,8 → 145,10 |
spinlock_unlock(&answer->sender->lock); |
interrupts_restore(ipl); |
return as_area_share(as, IPC_GET_ARG1(*olddata), IPC_GET_ARG2(*olddata), |
rc = as_area_share(as, IPC_GET_ARG1(*olddata), IPC_GET_ARG2(*olddata), |
AS, IPC_GET_ARG1(answer->data), IPC_GET_ARG3(*olddata)); |
IPC_SET_RETVAL(answer->data, rc); |
return rc; |
} |
} else if (IPC_GET_METHOD(*olddata) == IPC_M_AS_AREA_RECV) { |
if (!IPC_GET_RETVAL(answer->data)) { |
160,7 → 163,7 |
interrupts_restore(ipl); |
rc = as_area_share(AS, IPC_GET_ARG1(answer->data), IPC_GET_ARG2(*olddata), |
as, IPC_GET_ARG1(*olddata), IPC_GET_ARG3(*olddata)); |
as, IPC_GET_ARG1(*olddata), IPC_GET_ARG2(answer->data)); |
IPC_SET_RETVAL(answer->data, rc); |
} |
} |