xref: /minix/minix/kernel/proto.h (revision fb9c64b2)
1 /* Function prototypes. */
2 
3 /* FIXME this is a hack how to avoid inclusion conflicts */
4 #ifdef __kernel__
5 
6 #ifndef PROTO_H
7 #define PROTO_H
8 
9 #include <minix/safecopies.h>
10 #include <machine/archtypes.h>
11 #include <machine/signal.h>
12 #include <machine/frame.h>
13 
14 /* Struct declarations. */
15 struct proc;
16 struct ipc_filter_s;
17 
18 /* clock.c */
19 void init_clock(void);
20 clock_t get_realtime(void);
21 void set_realtime(clock_t);
22 void set_adjtime_delta(int32_t);
23 clock_t get_monotonic(void);
24 void set_boottime(time_t);
25 time_t get_boottime(void);
26 void set_kernel_timer(minix_timer_t *tp, clock_t t, tmr_func_t f, int arg);
27 void reset_kernel_timer(minix_timer_t *tp);
28 void ser_dump_proc(void);
29 
30 void cycles_accounting_init(void);
31 /*
32  * This functions start and stop accounting for process, kernel or idle cycles.
33  * It inherently have to account for some kernel cycles for process too,
34  * therefore it should be called asap after trapping to kernel and as late as
35  * possible before returning to userspace. These function is architecture
36  * dependent
37  */
38 void context_stop(struct proc * p);
39 /* this is a wrapper to make calling it from assembly easier */
40 void context_stop_idle(void);
41 void get_cpu_ticks(unsigned int cpu, uint64_t ticks[MINIX_CPUSTATES]);
42 int restore_fpu(struct proc *);
43 void save_fpu(struct proc *);
44 void save_local_fpu(struct proc *, int retain);
45 void fpu_sigcontext(struct proc *, struct sigframe_sigcontext *fr, struct
46 	sigcontext *sc);
47 
48 /* main.c */
49 #ifndef UNPAGED
50 #define kmain __k_unpaged_kmain
51 #endif
52 void kmain(kinfo_t *cbi);
53 void prepare_shutdown(int how);
54 __dead void minix_shutdown(int how);
55 void bsp_finish_booting(void);
56 
57 /* proc.c */
58 
59 int do_ipc(reg_t r1, reg_t r2, reg_t r3);
60 void proc_init(void);
61 int cancel_async(struct proc *src, struct proc *dst);
62 int has_pending_notify(struct proc * caller, int src_p);
63 int has_pending_asend(struct proc * caller, int src_p);
64 void unset_notify_pending(struct proc * caller, int src_p);
65 int mini_notify(const struct proc *src, endpoint_t dst);
66 void vm_suspend(struct proc *caller, const struct proc *target,
67         const vir_bytes linaddr, const vir_bytes len, const int type,
68         const int writeflag);
69 void enqueue(struct proc *rp);
70 void dequeue(struct proc *rp);
71 void switch_to_user(void);
72 void arch_proc_reset(struct proc *rp);
73 void arch_proc_setcontext(struct proc *rp, struct stackframe_s *state,
74 	int user, int restorestyle);
75 struct proc * arch_finish_switch_to_user(void);
76 struct proc *endpoint_lookup(endpoint_t ep);
77 #if DEBUG_ENABLE_IPC_WARNINGS
78 int isokendpt_f(const char *file, int line, endpoint_t e, int *p, int
79 	f);
80 #define isokendpt_d(e, p, f) isokendpt_f(__FILE__, __LINE__, (e), (p), (f))
81 #else
82 int isokendpt_f(endpoint_t e, int *p, int f);
83 #define isokendpt_d(e, p, f) isokendpt_f((e), (p), (f))
84 #endif
85 void proc_no_time(struct proc *p);
86 void reset_proc_accounting(struct proc *p);
87 void flag_account(struct proc *p, int flag);
88 int try_deliver_senda(struct proc *caller_ptr, asynmsg_t *table, size_t
89 	size);
90 
91 /* start.c */
92 void cstart(void);
93 char *env_get(const char *key);
94 
95 /* system.c */
96 int get_priv(register struct proc *rc, int proc_type);
97 void set_sendto_bit(const struct proc *rc, int id);
98 void unset_sendto_bit(const struct proc *rc, int id);
99 void fill_sendto_mask(const struct proc *rc, sys_map_t *map);
100 int send_sig(endpoint_t proc_nr, int sig_nr);
101 void cause_sig(proc_nr_t proc_nr, int sig_nr);
102 void sig_delay_done(struct proc *rp);
103 void send_diag_sig(void);
104 void kernel_call(message *m_user, struct proc * caller);
105 void system_init(void);
106 void clear_endpoint(struct proc *rc);
107 void clear_ipc_refs(struct proc *rc, int caller_ret);
108 void kernel_call_resume(struct proc *p);
109 int sched_proc(struct proc *rp, int priority, int quantum, int cpu, int niced);
110 int add_ipc_filter(struct proc *rp, int type,
111     vir_bytes address, size_t length);
112 void clear_ipc_filters(struct proc *rp);
113 int check_ipc_filter(struct ipc_filter_s *ipcf, int fill_flags);
114 int allow_ipc_filtered_msg(struct proc *rp, endpoint_t src_e,
115     vir_bytes m_src_v, message *m_src_p);
116 int allow_ipc_filtered_memreq(struct proc *src_rp, struct proc *dst_rp);
117 int priv_add_irq(struct proc *rp, int irq);
118 int priv_add_io(struct proc *rp, struct io_range *ior);
119 int priv_add_mem(struct proc *rp, struct minix_mem_range *memr);
120 
121 /* system/do_vtimer.c */
122 void vtimer_check(struct proc *rp);
123 
124 /* interrupt.c */
125 void put_irq_handler(irq_hook_t *hook, int irq, irq_handler_t handler);
126 void rm_irq_handler(const irq_hook_t *hook);
127 void enable_irq(const irq_hook_t *hook);
128 int disable_irq(const irq_hook_t *hook);
129 
130 void interrupts_enable(void);
131 void interrupts_disable(void);
132 
133 /* debug.c */
134 int runqueues_ok(void);
135 #ifndef CONFIG_SMP
136 #define runqueues_ok_local runqueues_ok
137 #else
138 #define runqueues_ok_local() runqueues_ok_cpu(cpuid)
139 int runqueues_ok_cpu(unsigned cpu);
140 #endif
141 char *rtsflagstr(u32_t flags);
142 char *miscflagstr(u32_t flags);
143 char *schedulerstr(struct proc *scheduler);
144 /* prints process information */
145 void print_proc(struct proc *pp);
146 /* prints the given process and recursively all processes it depends on */
147 void print_proc_recursive(struct proc *pp);
148 void printmsg(message *msg, struct proc *src, struct proc *dst,
149     char operation, int printparams);
150 #if DEBUG_IPC_HOOK
151 void hook_ipc_msgrecv(message *msg, struct proc *src, struct proc *dst);
152 void hook_ipc_msgsend(message *msg, struct proc *src, struct proc *dst);
153 void hook_ipc_msgkcall(message *msg, struct proc *proc);
154 void hook_ipc_msgkresult(message *msg, struct proc *proc);
155 void hook_ipc_clear(struct proc *proc);
156 #endif
157 
158 /* system/do_safecopy.c */
159 struct cp_sfinfo; /* external callers may only provide NULL */
160 int verify_grant(endpoint_t, endpoint_t, cp_grant_id_t, vir_bytes, int,
161 	vir_bytes, vir_bytes *, endpoint_t *, struct cp_sfinfo *);
162 
163 /* system/do_diagctl.c */
164 int do_diagctl(struct proc * caller, message *m);
165 
166 #if SPROFILE
167 /* profile.c */
168 void init_profile_clock(u32_t);
169 void stop_profile_clock(void);
170 #endif
171 
172 /* functions defined in architecture-dependent files. */
173 void prot_init(void);
174 void arch_post_init(void);
175 void arch_set_secondary_ipc_return(struct proc *, u32_t val);
176 phys_bytes phys_copy(phys_bytes source, phys_bytes dest, phys_bytes
177 	count);
178 void phys_copy_fault(void);
179 void phys_copy_fault_in_kernel(void);
180 void memset_fault(void);
181 void memset_fault_in_kernel(void);
182 #define virtual_copy(src, dst, bytes) \
183 				virtual_copy_f(NULL, src, dst, bytes, 0)
184 #define virtual_copy_vmcheck(caller, src, dst, bytes) \
185 				virtual_copy_f(caller, src, dst, bytes, 1)
186 int virtual_copy_f(struct proc * caller, struct vir_addr *src, struct
187 	vir_addr *dst, vir_bytes bytes, int vmcheck);
188 int data_copy(endpoint_t from, vir_bytes from_addr, endpoint_t to,
189 	vir_bytes to_addr, size_t bytes);
190 int data_copy_vmcheck(struct proc *, endpoint_t from, vir_bytes
191 	from_addr, endpoint_t to, vir_bytes to_addr, size_t bytes);
192 phys_bytes umap_virtual(struct proc* rp, int seg, vir_bytes vir_addr,
193 	vir_bytes bytes);
194 phys_bytes seg2phys(u16_t);
195 int vm_memset(struct proc *caller, endpoint_t who, phys_bytes dst,
196 	int pattern, phys_bytes count);
197 int intr_init(int);
198 void halt_cpu(void);
199 void arch_init(void);
200 void arch_boot_proc(struct boot_image *b, struct proc *p);
201 void cpu_identify(void);
202 /* arch dependent FPU initialization per CPU */
203 void fpu_init(void);
204 /* returns true if pfu is present and initialized */
205 int is_fpu(void);
206 void ser_putc(char);
207 __dead void arch_shutdown(int);
208 void restore_user_context(struct proc * p);
209 void read_tsc(u32_t *high, u32_t *low);
210 int arch_init_profile_clock(u32_t freq);
211 void arch_stop_profile_clock(void);
212 void arch_ack_profile_clock(void);
213 void do_ser_debug(void);
214 int arch_get_params(char *parm, int max);
215 void memory_init(void);
216 void mem_clear_mapcache(void);
217 void arch_proc_init(struct proc *pr, u32_t, u32_t, u32_t, char *);
218 int arch_do_vmctl(message *m_ptr, struct proc *p);
219 int vm_contiguous(const struct proc *targetproc, vir_bytes vir_buf,
220 	size_t count);
221 void proc_stacktrace(struct proc *proc);
222 int vm_lookup(const struct proc *proc, vir_bytes virtual, phys_bytes
223 	*result, u32_t *ptent);
224 size_t vm_lookup_range(const struct proc *proc,
225        vir_bytes vir_addr, phys_bytes *phys_addr, size_t bytes);
226 void arch_do_syscall(struct proc *proc);
227 int arch_phys_map(int index, phys_bytes *addr, phys_bytes *len, int
228 	*flags);
229 int arch_phys_map_reply(int index, vir_bytes addr);
230 reg_t arch_get_sp(struct proc *p);
231 int arch_enable_paging(struct proc * caller);
232 int vm_check_range(struct proc *caller,
233        struct proc *target, vir_bytes vir_addr, size_t bytes, int writable);
234 
235 int copy_msg_from_user(message * user_mbuf, message * dst);
236 int copy_msg_to_user(message * src, message * user_mbuf);
237 void switch_address_space(struct proc * p);
238 void release_address_space(struct proc *pr);
239 
240 void enable_fpu_exception(void);
241 void disable_fpu_exception(void);
242 void release_fpu(struct proc * p);
243 void arch_pause(void);
244 short cpu_load(void);
245 void busy_delay_ms(int ms);
246 
247 /* utility.c */
248 void cpu_print_freq(unsigned cpu);
249 #endif /* __kernel__ */
250 
251 #endif /* PROTO_H */
252