root / lab4 / .minix-src / include / minix / safecopies.h @ 14
History | View | Annotate | Download (3.8 KB)
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 */ |