//
// $Id$
//
// Description: Interface for memory server / pager
// Author: Timo
//
#include <types.idl>
[uuid(IF_MEMORY_ID)]
interface IF_MEMORY
{
/// talks the kernel's page fault IPC protocol
[kernelmsg(idl4::pagefault)]
void pagefault(in long address,
in long ip,
in long privileges,
out fpage page);
// *** Exception
exception out_of_memory {};
exception unknown_task {};
exception generic {};
// *** Generic Function
/// request an anonymous memory area of the given size, which will be
/// placed into page via a grant-mapping and the pager releases control of
/// the page. the caller need not be managed by the pager.
void GetPageGrant(in L4_Word_t size,
out fpage page)
raises(out_of_memory);
/// request a special (bios, bootloader, architecture specific) memory page
/// (address and size encoded in the fpage) and return it into the
/// page. the caller need not be managed by the pager.
void GetSpecialPhysicalPage(in L4_Fpage_t phyaddr,
out fpage page);
// *** Task Creation
/// create a new paged task - creates an address space and initializes new
/// management structures. if thread == L4_nilthread then a new thread id
/// is chosen.
void CreateTask(inout L4_ThreadId_t thread)
raises(generic);
/// request an fpage, which is shared with the destination task at the
/// given address. the shared area must be a valid continuos fpage region,
/// but it may not yet exist in the destination task and will be mapped
/// there on-demand. this function is primarily used to fill a new memory
/// space. if the caller is managed by the pager, then page can be
/// L4_Nilpage or L4_CompleteAddress in which case the pager decides where
/// to put the page.
void GetSharedRegion(in L4_ThreadId_t destthread,
in L4_Word_t destaddress,
in L4_Word_t pagesize,
out fpage page)
raises(out_of_memory);
/// return the fpage to the destination task's memory area
void FreeSharedRegion(in L4_ThreadId_t destthread,
in L4_Word_t destaddress,
in L4_Fpage_t page);
/// sends the kick-start IPC to the thread, sp is currently initialized by crt0.
void StartTask(in L4_ThreadId_t thread,
in L4_Word_t ip,
in L4_Word_t sp)
raises(generic);
/// kill the address space and return all pages allocated by the task to
/// the free pool.
void KillTask(in L4_ThreadId_t thread)
raises(unknown_task);
/// kill the caller's address space and notify waiting threads.
void KillMe(in L4_Word_t retcode)
raises(unknown_task);
/// wait for a pid to complete: returns true if the thread has finished and
/// sets the retcode. if (flags & WAIT_FOREVER) the call block until the
/// process ends.
boolean WaitFor(in L4_ThreadId_t thread, in L4_Word_t flags,
out L4_Word_t retcode)
raises(unknown_task);
const L4_Word_t WAIT_FOREVER = 1;
// *** Task Memory Layout
/// request anonymous memory of the given size. if available the page will
/// be placed "somewhere" into the caller's address space. the caller must
/// managed by the pager. the return type is not (idl4_)"fpage".
void GetPageAny(in L4_Word_t size,
out L4_Fpage_t page)
raises(out_of_memory);
/// enlarge the calling task's valid heap area up to endheap. anonymous
/// memory is allocated on demand.
void brk(in L4_Word_t endheap)
raises(unknown_task);
};