1 #ifndef RS_H 2 #define RS_H 3 4 /* 5 minix/rs.h 6 7 Interface to the reincarnation server 8 */ 9 10 #include <minix/bitmap.h> 11 #include <minix/com.h> 12 #include <minix/ipc_filter.h> 13 14 #define SERVICE_LOGIN "service" /* passwd file entry for services */ 15 16 /* The following definition should be kept in sync with the actual 17 * /etc/master.passwd value for SERVICE_LOGIN for now, and removed altogether 18 * once we are able to obtain its value dynamically everywhere. The value has 19 * been chosen so as to avoid creating conflicts with future NetBSD additions 20 * to the password files, although one can never be sure. 21 */ 22 #define SERVICE_UID 999 /* user ID for services */ 23 24 /* RSS definitions. */ 25 #define RSS_NR_IRQ 16 26 #define RSS_NR_IO 16 27 #define RSS_IRQ_ALL (RSS_NR_IRQ+1) 28 #define RSS_IO_ALL (RSS_NR_IO+1) 29 #define RSS_IPC_ALL "IPC_ALL" 30 #define RSS_IPC_ALL_SYS "IPC_ALL_SYS" 31 32 /* RSS flags. */ 33 #define RSS_COPY 0x01 /* keep an in-memory copy of the binary */ 34 #define RSS_REUSE 0x04 /* Try to reuse previously copied binary */ 35 #define RSS_NOBLOCK 0x08 /* unblock caller immediately */ 36 #define RSS_REPLICA 0x10 /* keep a replica of the service */ 37 #define RSS_BATCH 0x20 /* batch mode */ 38 #define RSS_SELF_LU 0x40 /* perform self update */ 39 #define RSS_ASR_LU 0x80 /* perform ASR update */ 40 #define RSS_FORCE_SELF_LU 0x0100 /* force self update */ 41 #define RSS_PREPARE_ONLY_LU 0x0200 /* request prepare-only update */ 42 #define RSS_FORCE_INIT_CRASH 0x0400 /* force crash at initialization time (for debugging) */ 43 #define RSS_FORCE_INIT_FAIL 0x0800 /* force failure at initialization time (for debugging) */ 44 #define RSS_FORCE_INIT_TIMEOUT 0x1000 /* force timeout at initialization time (for debugging) */ 45 #define RSS_FORCE_INIT_DEFCB 0x2000 /* force default cb at initialization time (for debugging) */ 46 #define RSS_SYS_BASIC_CALLS 0x4000 /* include basic kernel calls */ 47 #define RSS_VM_BASIC_CALLS 0x8000 /* include basic vm calls */ 48 #define RSS_NOMMAP_LU 0x10000 /* don't inherit mmapped regions */ 49 #define RSS_DETACH 0x20000 /* detach on update/restart */ 50 #define RSS_NORESTART 0x40000 /* don't restart */ 51 #define RSS_FORCE_INIT_ST 0x80000 /* force state transfer at initialization time */ 52 #define RSS_NO_BIN_EXP 0x100000 /* suppress binary exponential offset */ 53 54 /* Common definitions. */ 55 #define RS_NR_CONTROL 8 56 #define RS_NR_PCI_DEVICE 32 57 #define RS_NR_PCI_CLASS 4 58 #define RS_MAX_LABEL_LEN 16 59 #define RS_MAX_IPCF_STR_LEN (RS_MAX_LABEL_LEN+12) 60 #define RS_MAX_IPC_FILTERS 4 61 62 /* CPU special values */ 63 #define RS_CPU_DEFAULT -1 /* use the default cpu or do not change the current one */ 64 #define RS_CPU_BSP -2 /* use the bootstrap cpu */ 65 66 /* Labels are copied over separately. */ 67 struct rss_label 68 { 69 char *l_addr; 70 size_t l_len; 71 }; 72 73 struct rs_pci_id { 74 u16_t vid; 75 u16_t did; 76 u16_t sub_vid; 77 u16_t sub_did; 78 }; 79 #define NO_SUB_VID 0xffff 80 #define NO_SUB_DID 0xffff 81 82 struct rs_pci_class { 83 u32_t pciclass; 84 u32_t mask; 85 }; 86 87 /* State-related data. */ 88 struct rs_ipc_filter_el { 89 int flags; 90 char m_label[RS_MAX_LABEL_LEN]; 91 int m_type; 92 }; 93 struct rs_state_data { 94 size_t size; 95 void *ipcf_els; 96 size_t ipcf_els_size; 97 int ipcf_els_gid; 98 void *eval_addr; 99 size_t eval_len; 100 int eval_gid; 101 }; 102 103 /* Arguments needed to start a new driver or server */ 104 struct rs_start 105 { 106 unsigned rss_flags; 107 char *rss_cmd; 108 size_t rss_cmdlen; 109 uid_t rss_uid; 110 endpoint_t rss_sigmgr; 111 endpoint_t rss_scheduler; 112 int rss_priority; 113 int rss_quantum; 114 int rss_major; 115 long rss_period; 116 char *rss_script; 117 size_t rss_scriptlen; 118 long rss_asr_count; 119 long rss_restarts; 120 long rss_heap_prealloc_bytes; 121 long rss_map_prealloc_bytes; 122 int rss_nr_irq; 123 int rss_irq[RSS_NR_IRQ]; 124 int rss_nr_io; 125 struct { unsigned base; unsigned len; } rss_io[RSS_NR_IO]; 126 int rss_nr_pci_id; 127 struct rs_pci_id rss_pci_id[RS_NR_PCI_DEVICE]; 128 int rss_nr_pci_class; 129 struct rs_pci_class rss_pci_class[RS_NR_PCI_CLASS]; 130 bitchunk_t rss_system[SYS_CALL_MASK_SIZE]; 131 struct rss_label rss_label; 132 struct rss_label rss_trg_label; 133 char *rss_ipc; 134 size_t rss_ipclen; 135 bitchunk_t rss_vm[VM_CALL_MASK_SIZE]; 136 int rss_nr_control; 137 struct rss_label rss_control[RS_NR_CONTROL]; 138 struct rs_state_data rss_state_data; 139 int devman_id; 140 char *rss_progname; 141 size_t rss_prognamelen; 142 int rss_nr_domain; 143 int rss_domain[NR_DOMAIN]; 144 /* 145 * SMP specific data 146 * 147 * must be at the end of the structure for binary compatibility with 148 * non-smp sysytems 149 */ 150 int rss_cpu; 151 }; 152 153 /* ACL information for access to PCI devices */ 154 struct rs_pci 155 { 156 char rsp_label[RS_MAX_LABEL_LEN]; 157 int rsp_endpoint; 158 int rsp_nr_device; 159 struct rs_pci_id rsp_device[RS_NR_PCI_DEVICE]; 160 int rsp_nr_class; 161 struct rs_pci_class rsp_class[RS_NR_PCI_CLASS]; 162 }; 163 164 /* Definition of a public entry of the system process table. */ 165 struct rprocpub { 166 short in_use; /* set when the entry is in use */ 167 unsigned sys_flags; /* sys flags */ 168 endpoint_t endpoint; /* process endpoint number */ 169 endpoint_t old_endpoint; /* old instance endpoint number (for VM, when updating) */ 170 endpoint_t new_endpoint; /* new instance endpoint number (for VM, when updating) */ 171 172 devmajor_t dev_nr; /* major device number or NO_DEV */ 173 int nr_domain; /* number of socket driver domains */ 174 int domain[NR_DOMAIN]; /* set of socket driver domains */ 175 176 char label[RS_MAX_LABEL_LEN]; /* label of this service */ 177 char proc_name[RS_MAX_LABEL_LEN]; /* process name of this service */ 178 179 bitchunk_t vm_call_mask[VM_CALL_MASK_SIZE]; /* vm call mask */ 180 181 struct rs_pci pci_acl; /* pci acl */ 182 int devman_id; 183 }; 184 185 /* Return whether the given boot process is a user process, as opposed to a 186 * system process. Only usable by core services during SEF initialization. 187 */ 188 #define IS_RPUB_BOOT_USR(rpub) ((rpub)->endpoint == INIT_PROC_NR) 189 190 /* Sys flag values. */ 191 #define SF_CORE_SRV 0x001 /* set for core system services */ 192 #define SF_SYNCH_BOOT 0X002 /* set when process needs synch boot init */ 193 #define SF_NEED_COPY 0x004 /* set when process needs copy to start */ 194 #define SF_USE_COPY 0x008 /* set when process has a copy in memory */ 195 #define SF_NEED_REPL 0x010 /* set when process needs replica to start */ 196 #define SF_USE_REPL 0x020 /* set when process has a replica */ 197 #define SF_VM_UPDATE 0x040 /* set when process needs vm update */ 198 #define SF_VM_ROLLBACK 0x080 /* set when vm update is a rollback */ 199 #define SF_VM_NOMMAP 0x100 /* set when vm update ignores mmapped regions */ 200 #define SF_USE_SCRIPT 0x200 /* set when process has restart script */ 201 #define SF_DET_RESTART 0x400 /* set when process detaches on restart */ 202 #define SF_NORESTART 0x800 /* set when process should not be restarted */ 203 #define SF_NO_BIN_EXP 0x1000 /* set when we should ignore binary exp. offset */ 204 205 #define IMM_SF \ 206 (SF_NO_BIN_EXP | SF_CORE_SRV | SF_SYNCH_BOOT | SF_NEED_COPY | SF_NEED_REPL) /* immutable */ 207 208 int minix_rs_lookup(const char *name, endpoint_t *value); 209 210 #endif 211