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