Main changes: - COW optimization for safecopy. - safemap, a grant-based interface for sharing memory regions between processes. - Integration with safemap and complete rework of DS, supporting new data types natively (labels, memory ranges, memory mapped ranges). - For further information: http://wiki.minix3.org/en/SummerOfCode2009/MemoryGrants Additional changes not included in the original Wu's branch: - Fixed unhandled case in VM when using COW optimization for safecopy in case of a block that has already been shared as SMAP. - Better interface and naming scheme for sys_saferevmap and ds_retrieve_map calls. - Better input checking in syslib: check for page alignment when creating memory mapping grants. - DS notifies subscribers when an entry is deleted. - Documented the behavior of indirect grants in case of memory mapping. - Test suite in /usr/src/test/safeperf|safecopy|safemap|ds/* reworked and extended. - Minor fixes and general cleanup. - TO-DO: Grant ids should be generated and managed the way endpoints are to make sure grant slots are never misreused.
		
			
				
	
	
		
			73 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			73 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* Prototypes and definitions for DS interface. */
 | 
						|
 | 
						|
#ifndef _MINIX_DS_H
 | 
						|
#define _MINIX_DS_H
 | 
						|
 | 
						|
#include <minix/types.h>
 | 
						|
 | 
						|
/* Flags. */
 | 
						|
#define DSF_IN_USE		0x001	/* entry is in use */
 | 
						|
#define DSF_PRIV_RETRIEVE	0x002	/* only owner can retrieve */
 | 
						|
#define DSF_PRIV_OVERWRITE	0x004	/* only owner can overwrite */
 | 
						|
#define DSF_PRIV_SNAPSHOT	0x004	/* only owner can take a snapshot */
 | 
						|
#define DSF_PRIV_SUBSCRIBE	0x008	/* only owner can subscribe */
 | 
						|
#define DSF_TYPE_U32		0x010	/* u32 data type */
 | 
						|
#define DSF_TYPE_STR		0x020	/* string data type */
 | 
						|
#define DSF_TYPE_MEM		0x040	/* memory range data type */
 | 
						|
#define DSF_TYPE_MAP		0x080	/* mapped memory range data type */
 | 
						|
#define DSF_TYPE_LABEL		0x100	/* label data type */
 | 
						|
 | 
						|
#define DSF_MASK_TYPE		0xFF0	/* mask for type flags. */
 | 
						|
#define DSF_MASK_INTERNAL	0xFFF	/* mask for internal flags. */
 | 
						|
 | 
						|
#define DSF_OVERWRITE		0x01000	/* overwrite if entry exists */
 | 
						|
#define DSF_INITIAL		0x02000	/* check subscriptions immediately */
 | 
						|
 | 
						|
#define DSMF_MAP_MAPPED		0x10000	/* map mapped memory range */
 | 
						|
#define DSMF_COPY_MAPPED	0x20000	/* copy mapped memory range */
 | 
						|
#define DSMF_COPY_SNAPSHOT	0x40000	/* copy snapshot */
 | 
						|
 | 
						|
/* DS constants. */
 | 
						|
#define DS_MAX_KEYLEN 80        /* Max length of a key, including '\0'. */
 | 
						|
#define DS_MAX_STRLEN 16        /* Max length of string, including '\0'. */
 | 
						|
 | 
						|
/* ds.c */
 | 
						|
 | 
						|
/* U32 */
 | 
						|
_PROTOTYPE( int ds_publish_u32, (const char *name, u32_t val, int flags));
 | 
						|
_PROTOTYPE( int ds_retrieve_u32, (const char *name, u32_t *val));
 | 
						|
_PROTOTYPE( int ds_delete_u32, (const char *ds_name));
 | 
						|
 | 
						|
/* STRING */
 | 
						|
_PROTOTYPE( int ds_publish_str, (const char *name, char *val, int flags));
 | 
						|
_PROTOTYPE( int ds_retrieve_str, (const char *name, char *val, size_t len));
 | 
						|
_PROTOTYPE( int ds_delete_str, (const char *ds_name));
 | 
						|
 | 
						|
/* MEM */
 | 
						|
_PROTOTYPE( int ds_publish_mem, (const char *ds_name, void *vaddr,
 | 
						|
		size_t length, int flags));
 | 
						|
_PROTOTYPE( int ds_retrieve_mem, (const char *ds_name, char *vaddr,
 | 
						|
		size_t *length));
 | 
						|
_PROTOTYPE( int ds_delete_mem, (const char *ds_name));
 | 
						|
 | 
						|
/* MAP */
 | 
						|
_PROTOTYPE( int ds_publish_map, (const char *ds_name, void *vaddr,
 | 
						|
		size_t length, int flags));
 | 
						|
_PROTOTYPE( int ds_snapshot_map, (const char *ds_name, int *nr_snapshot));
 | 
						|
_PROTOTYPE( int ds_retrieve_map, (const char *ds_name, char *vaddr,
 | 
						|
		size_t *length, int nr_snapshot, int flags));
 | 
						|
_PROTOTYPE( int ds_delete_map, (const char *ds_name));
 | 
						|
 | 
						|
/* LABEL */
 | 
						|
_PROTOTYPE( int ds_publish_label, (const char *ds_name, u32_t value,int flags));
 | 
						|
_PROTOTYPE( int ds_retrieve_label_name, (char *ds_name, u32_t num));
 | 
						|
_PROTOTYPE( int ds_retrieve_label_num, (const char *ds_name, u32_t *value));
 | 
						|
_PROTOTYPE( int ds_delete_label, (const char *ds_name));
 | 
						|
 | 
						|
/* Subscribe and check. */
 | 
						|
_PROTOTYPE( int ds_subscribe, (const char *regex, int flags));
 | 
						|
_PROTOTYPE( int ds_check, (char *ds_name, int *type));
 | 
						|
 | 
						|
#endif /* _MINIX_DS_H */
 | 
						|
 |