xref: /minix/minix/include/minix/safecopies.h (revision ef8d499e)
1 #ifndef _MINIX_SAFECOPIES_H
2 #define _MINIX_SAFECOPIES_H 1
3 
4 #include <minix/sys_config.h>
5 #include <sys/types.h>
6 #include <minix/vm.h>
7 #include <stdint.h>
8 
9 typedef struct {
10 	int cp_flags;					/* CPF_* below */
11 	int cp_seq;					/* sequence number */
12 	union ixfer_cp_u {
13 		struct {
14 			/* CPF_DIRECT */
15 			endpoint_t	cp_who_to;	/* grantee */
16 			vir_bytes	cp_start;	/* memory */
17 			size_t		cp_len;		/* size in bytes */
18 		} cp_direct;
19 		struct {
20 			/* CPF_INDIRECT */
21 			endpoint_t	cp_who_to;	/* grantee */
22 			endpoint_t	cp_who_from;	/* previous granter */
23 			cp_grant_id_t	cp_grant;	/* previous grant */
24 		} cp_indirect;
25 		struct {
26 			/* CPF_MAGIC */
27 			endpoint_t	cp_who_from;	/* granter */
28 			endpoint_t	cp_who_to;	/* grantee */
29 			vir_bytes	cp_start;	/* memory */
30 			size_t		cp_len;		/* size in bytes */
31 		} cp_magic;
32 		struct {
33 			/* (free slot) */
34 			int		cp_next;	/* next free or -1 */
35 		} cp_free;
36 	} cp_u;
37 	cp_grant_id_t cp_faulted;	/* soft fault marker (CPF_TRY only) */
38 } cp_grant_t;
39 
40 /* Vectored safecopy. */
41 struct vscp_vec {
42         /* Exactly one of the following must be SELF. */
43         endpoint_t      v_from;         /* source */
44         endpoint_t      v_to;           /* destination */
45         cp_grant_id_t   v_gid;          /* grant id of other process */
46         size_t          v_offset;       /* offset in other grant */
47         vir_bytes       v_addr;         /* address in copier's space */
48         size_t          v_bytes;        /* no. of bytes */
49 };
50 
51 /* Invalid grant number. */
52 #define GRANT_INVALID	((cp_grant_id_t) -1)
53 #define GRANT_VALID(g)	((g) > GRANT_INVALID)
54 
55 /* Grant index and sequence number split/merge/limits. */
56 #define GRANT_SHIFT		20	/* seq: upper 11 bits, idx: lower 20 */
57 #define GRANT_MAX_SEQ		(1 << (31 - GRANT_SHIFT))
58 #define GRANT_MAX_IDX		(1 << GRANT_SHIFT)
59 #define GRANT_ID(idx, seq)	((cp_grant_id_t)((seq << GRANT_SHIFT) | (idx)))
60 #define GRANT_SEQ(g)		(((g) >> GRANT_SHIFT) & (GRANT_MAX_SEQ - 1))
61 #define GRANT_IDX(g)		((g) & (GRANT_MAX_IDX - 1))
62 
63 /* Operations: any combination is ok. */
64 #define CPF_READ	0x000001 /* Granted process may read. */
65 #define CPF_WRITE	0x000002 /* Granted process may write. */
66 
67 /* Grant flags. */
68 #define CPF_TRY		0x000010 /* Fail fast on unmapped memory. */
69 
70 /* Internal flags. */
71 #define CPF_USED	0x000100 /* Grant slot in use. */
72 #define CPF_DIRECT	0x000200 /* Grant from this process to another. */
73 #define CPF_INDIRECT	0x000400 /* Grant from grant to another. */
74 #define CPF_MAGIC	0x000800 /* Grant from any to any. */
75 #define CPF_VALID	0x001000 /* Grant slot contains valid grant. */
76 
77 /* Special cpf_revoke() return values. */
78 #define GRANT_FAULTED	1	/* CPF_TRY: a soft fault occurred */
79 
80 /* Prototypes for functions in libsys. */
81 void cpf_prealloc(unsigned int count);
82 cp_grant_id_t cpf_grant_direct(endpoint_t who_to, vir_bytes addr, size_t bytes,
83 	int access);
84 cp_grant_id_t cpf_grant_indirect(endpoint_t who_to, endpoint_t who_from,
85 	cp_grant_id_t gr);
86 cp_grant_id_t cpf_grant_magic(endpoint_t who_to, endpoint_t who_from,
87 	vir_bytes addr, size_t bytes, int access);
88 int cpf_revoke(cp_grant_id_t grant_id);
89 
90 /* START OF DEPRECATED API */
91 int cpf_getgrants(cp_grant_id_t *grant_ids, int n);
92 int cpf_setgrant_direct(cp_grant_id_t g, endpoint_t who, vir_bytes addr,
93 	size_t size, int access);
94 int cpf_setgrant_indirect(cp_grant_id_t g, endpoint_t who_to, endpoint_t
95 	who_from, cp_grant_id_t his_g);
96 int cpf_setgrant_magic(cp_grant_id_t g, endpoint_t who_to, endpoint_t
97 	who_from, vir_bytes addr, size_t bytes, int access);
98 int cpf_setgrant_disable(cp_grant_id_t grant_id);
99 /* END OF DEPRECATED API */
100 
101 void cpf_reload(void);
102 
103 /* Set a process' grant table location and size (in-kernel only). */
104 #define _K_SET_GRANT_TABLE(rp, ptr, entries)	\
105 	priv(rp)->s_grant_table= (ptr);		\
106 	priv(rp)->s_grant_entries= (entries);   \
107 	priv(rp)->s_grant_endpoint= (rp)->p_endpoint;
108 
109 #endif	/* _MINIX_SAFECOPIES_H */
110