Subversion Repositories HelenOS-historic

Compare Revisions

Ignore whitespace Rev 1237 → Rev 1238

/kernel/trunk/generic/include/mm/as_arg.h
45,6 → 45,9
*/
void *base;
/*
* The following members are filled only by acceptor.
*/
unsigned long size; /**< Size of memory being sent/accepted must match. */
int flags; /**< Address space area flags of sender and acceptor must match. */
} as_area_acptsnd_arg_t;
/kernel/trunk/generic/include/mm/as.h
114,7 → 114,7
extern as_t *as_create(int flags);
extern as_area_t *as_area_create(as_t *as, int flags, size_t size, __address base);
extern __address as_area_resize(as_t *as, __address address, size_t size, int flags);
int as_area_send(task_id_t id, __address base, size_t size, int flags);
int as_area_send(task_id_t id, __address base);
extern void as_set_mapping(as_t *as, __address page, __address frame);
extern int as_page_fault(__address page);
extern void as_switch(as_t *old, as_t *new);
/kernel/trunk/generic/include/syscall/syscall.h
40,8 → 40,8
SYS_FUTEX_WAKEUP,
SYS_AS_AREA_CREATE,
SYS_AS_AREA_RESIZE,
SYS_AS_AREA_SHARE_APPROVE,
SYS_AS_AREA_SHARE_PERFORM,
SYS_AS_AREA_ACCEPT,
SYS_AS_AREA_SEND,
SYS_IPC_CALL_SYNC_FAST,
SYS_IPC_CALL_SYNC,
SYS_IPC_CALL_ASYNC_FAST,
/kernel/trunk/generic/src/mm/as.c
291,8 → 291,6
*
* @param id Task ID of the accepting task.
* @param base Base address of the source address space area.
* @param size Size of the source address space area.
* @param flags Flags of the source address space area.
*
* @return 0 on success or ENOENT if there is no such task or
* if there is no such address space area,
300,7 → 298,7
* ENOMEM if there was a problem in allocating destination
* address space area.
*/
int as_area_send(task_id_t id, __address base, size_t size, int flags)
int as_area_send(task_id_t id, __address base)
{
ipl_t ipl;
task_t *t;
307,6 → 305,9
count_t i;
as_t *as;
__address dst_base;
int flags;
size_t size;
as_area_t *area;
ipl = interrupts_disable();
spinlock_lock(&tasks_lock);
333,6 → 334,22
interrupts_restore(ipl);
return EPERM;
}
spinlock_lock(&AS->lock);
area = find_area_and_lock(AS, base);
if (!area) {
/*
* Could not find the source address space area.
*/
spinlock_unlock(&t->lock);
spinlock_unlock(&AS->lock);
interrupts_restore(ipl);
return ENOENT;
}
size = area->pages * PAGE_SIZE;
flags = area->flags;
spinlock_unlock(&area->lock);
spinlock_unlock(&AS->lock);
 
if ((t->accept_arg.task_id != TASK->taskid) || (t->accept_arg.size != size) ||
(t->accept_arg.flags != flags)) {
879,5 → 896,5
return (__native) EPERM;
}
 
return (__native) as_area_send(arg.task_id, (__address) arg.base, arg.size, arg.flags);
return (__native) as_area_send(arg.task_id, (__address) arg.base);
}