2008-11-19 13:26:10 +01:00
|
|
|
|
|
|
|
#ifndef _VMPROC_H
|
|
|
|
#define _VMPROC_H 1
|
|
|
|
|
|
|
|
#include <pagetable.h>
|
|
|
|
#include <arch_vmproc.h>
|
2009-09-21 16:49:49 +02:00
|
|
|
#include <minix/bitmap.h>
|
2010-04-12 13:25:24 +02:00
|
|
|
#include <machine/archtypes.h>
|
2008-11-19 13:26:10 +01:00
|
|
|
|
|
|
|
#include "vm.h"
|
2010-05-05 13:35:04 +02:00
|
|
|
#include "physravl.h"
|
|
|
|
#include "yieldedavl.h"
|
2010-10-04 13:41:10 +02:00
|
|
|
#include "regionavl.h"
|
2008-11-19 13:26:10 +01:00
|
|
|
|
|
|
|
struct vmproc;
|
|
|
|
|
|
|
|
typedef void (*callback_t)(struct vmproc *who, message *m);
|
|
|
|
|
|
|
|
struct vmproc {
|
|
|
|
struct vm_arch vm_arch; /* architecture-specific data */
|
|
|
|
int vm_flags;
|
|
|
|
endpoint_t vm_endpoint;
|
|
|
|
pt_t vm_pt; /* page table data, if VMF_HASPT is set */
|
|
|
|
vir_bytes vm_stacktop; /* top of stack as seen from process */
|
|
|
|
vir_bytes vm_offset; /* offset of addr 0 for process */
|
|
|
|
|
|
|
|
/* File identification for cs sharing. */
|
|
|
|
ino_t vm_ino; /* inode number of file */
|
|
|
|
dev_t vm_dev; /* device number of file system */
|
|
|
|
time_t vm_ctime; /* inode changed time */
|
|
|
|
|
|
|
|
/* Regions in virtual address space. */
|
2010-10-04 13:41:10 +02:00
|
|
|
region_avl vm_regions_avl;
|
2010-10-07 12:04:05 +02:00
|
|
|
vir_bytes vm_region_top; /* highest vaddr last inserted */
|
2008-11-19 13:26:10 +01:00
|
|
|
|
|
|
|
/* Heap for brk() to extend. */
|
|
|
|
struct vir_region *vm_heap;
|
|
|
|
|
Initialization protocol for system services.
SYSLIB CHANGES:
- SEF framework now supports a new SEF Init request type from RS. 3 different
callbacks are available (init_fresh, init_lu, init_restart) to specify
initialization code when a service starts fresh, starts after a live update,
or restarts.
SYSTEM SERVICE CHANGES:
- Initialization code for system services is now enclosed in a callback SEF will
automatically call at init time. The return code of the callback will
tell RS whether the initialization completed successfully.
- Each init callback can access information passed by RS to initialize. As of
now, each system service has access to the public entries of RS's system process
table to gather all the information required to initialize. This design
eliminates many existing or potential races at boot time and provides a uniform
initialization interface to system services. The same interface will be reused
for the upcoming publish/subscribe model to handle dynamic
registration / deregistration of system services.
VM CHANGES:
- Uniform privilege management for all system services. Every service uses the
same call mask format. For boot services, VM copies the call mask from init
data. For dynamic services, VM still receives the call mask via rs_set_priv
call that will be soon replaced by the upcoming publish/subscribe model.
RS CHANGES:
- The system process table has been reorganized and split into private entries
and public entries. Only the latter ones are exposed to system services.
- VM call masks are now entirely configured in rs/table.c
- RS has now its own slot in the system process table. Only kernel tasks and
user processes not included in the boot image are now left out from the system
process table.
- RS implements the initialization protocol for system services.
- For services in the boot image, RS blocks till initialization is complete and
panics when failure is reported back. Services are initialized in their order of
appearance in the boot image priv table and RS blocks to implements synchronous
initialization for every system service having the flag SF_SYNCH_BOOT set.
- For services started dynamically, the initialization protocol is implemented
as though it were the first ping for the service. In this case, if the
system service fails to report back (or reports failure), RS brings the service
down rather than trying to restart it.
2010-01-08 02:20:42 +01:00
|
|
|
bitchunk_t vm_call_mask[VM_CALL_MASK_SIZE];
|
2009-09-21 16:49:49 +02:00
|
|
|
|
2008-11-19 13:26:10 +01:00
|
|
|
/* State for requests pending to be done to vfs on behalf of
|
|
|
|
* this process.
|
|
|
|
*/
|
|
|
|
callback_t vm_callback; /* function to call on vfs reply */
|
|
|
|
int vm_callback_type; /* expected message type */
|
|
|
|
|
2009-05-15 19:07:36 +02:00
|
|
|
int vm_slot; /* process table slot */
|
2010-10-15 11:10:14 +02:00
|
|
|
int vm_yielded; /* yielded regions */
|
2009-05-15 19:07:36 +02:00
|
|
|
|
2008-11-19 13:26:10 +01:00
|
|
|
union {
|
|
|
|
struct {
|
|
|
|
cp_grant_id_t gid;
|
|
|
|
} open; /* VM_VFS_OPEN */
|
|
|
|
} vm_state; /* Callback state. */
|
|
|
|
#if VMSTATS
|
|
|
|
int vm_bytecopies;
|
|
|
|
#endif
|
|
|
|
};
|
|
|
|
|
|
|
|
/* Bits for vm_flags */
|
|
|
|
#define VMF_INUSE 0x001 /* slot contains a process */
|
|
|
|
#define VMF_SEPARATE 0x002 /* separate i&d */
|
|
|
|
#define VMF_HASPT 0x004 /* has private page table */
|
|
|
|
#define VMF_EXITING 0x008 /* PM is cleaning up this process */
|
|
|
|
#define VMF_HAS_DMA 0x010 /* Process directly or indirectly granted
|
|
|
|
* DMA buffers.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#endif
|