root / lab4 / .minix-src / include / lcom / lcf.h @ 13
History | View | Annotate | Download (9.99 KB)
1 |
#pragma once
|
---|---|
2 |
|
3 |
#include <stdbool.h> |
4 |
#include <stdio.h> |
5 |
#include <stdlib.h> |
6 |
#include <time.h> |
7 |
#include <unistd.h> |
8 |
|
9 |
#include <machine/int86.h> |
10 |
#include <minix/const.h> |
11 |
#include <minix/driver.h> |
12 |
#include <minix/endpoint.h> |
13 |
#include <minix/sef.h> |
14 |
#include <minix/syslib.h> |
15 |
#include <minix/sysutil.h> |
16 |
#include <minix/type.h> |
17 |
#include <minix/vm.h> |
18 |
#include <sys/mman.h> |
19 |
#include <sys/time.h> |
20 |
#include <sys/timespec.h> |
21 |
#include <sys/types.h> |
22 |
|
23 |
#include <lcom/liblm.h> |
24 |
|
25 |
#include "lab2.h" |
26 |
#include "lab3.h" |
27 |
#include "lab4.h" |
28 |
#include "types.h" |
29 |
|
30 |
#ifdef __LCOM__
|
31 |
|
32 |
// undef all MINIX functions defined as macros
|
33 |
|
34 |
# undef driver_receive
|
35 |
# undef sys_inb
|
36 |
# undef sys_irqdisable
|
37 |
# undef sys_irqenable
|
38 |
# undef sys_irqrmpolicy
|
39 |
# undef sys_irqsetpolicy
|
40 |
# undef sys_outb
|
41 |
|
42 |
/*
|
43 |
*
|
44 |
* Macros used to replace the set of functions being wrapped / "intercepted".
|
45 |
*
|
46 |
*/
|
47 |
|
48 |
// not a wrapper, just a way to solve pseudo-random number generation issue in Minix 3.4.0-rc6
|
49 |
# define rand() rand_()
|
50 |
|
51 |
//
|
52 |
// Minix / C library functions
|
53 |
//
|
54 |
|
55 |
# define driver_receive(src, m_ptr, status_ptr) \
|
56 |
driver_receive_(src, m_ptr, status_ptr, CTX_INFO(#src "\0" #m_ptr "\0" #status_ptr)) |
57 |
|
58 |
# define micros_to_ticks(micros) \
|
59 |
micros_to_ticks_(micros, CTX_INFO(#micros))
|
60 |
|
61 |
# define nanosleep(req, rem) \
|
62 |
nanosleep_(req, rem, CTX_INFO(#req "\0" #rem)) |
63 |
|
64 |
// printf is a variadic function, therefore it is treated differently:
|
65 |
// 1) format argument is included within variadic argument list to avoid any warnings;
|
66 |
// 2) the code string is set as a single argument;
|
67 |
// 3) context information is the first argument, not the last one.
|
68 |
# define printf(...) \
|
69 |
printf_(CTX_INFO(#__VA_ARGS__), __VA_ARGS__)
|
70 |
|
71 |
# define sleep(seconds) \
|
72 |
sleep_(seconds, CTX_INFO(#seconds))
|
73 |
|
74 |
# define sys_enable_iop(proc_ep) \
|
75 |
sys_enable_iop_(proc_ep, CTX_INFO(#proc_ep))
|
76 |
|
77 |
# define sys_inb(port, value) \
|
78 |
sys_inb_(port, value, CTX_INFO(#port "\0" #value)) |
79 |
|
80 |
# define sys_int86(reg86p) \
|
81 |
sys_int86_(reg86p, CTX_INFO(#reg86p))
|
82 |
|
83 |
# define sys_irqdisable(irq_hook_id) \
|
84 |
sys_irqdisable_(irq_hook_id, CTX_INFO(#irq_hook_id))
|
85 |
|
86 |
# define sys_irqenable(irq_hook_id) \
|
87 |
sys_irqenable_(irq_hook_id, CTX_INFO(#irq_hook_id))
|
88 |
|
89 |
# define sys_irqrmpolicy(irq_hook_id) \
|
90 |
sys_irqrmpolicy_(irq_hook_id, CTX_INFO(#irq_hook_id))
|
91 |
|
92 |
# define sys_irqsetpolicy(irq_vec, policy, hook_id) sys_irqsetpolicy_( \
|
93 |
irq_vec, policy, hook_id, CTX_INFO(# irq_vec "\0" # policy "\0" # hook_id)) |
94 |
|
95 |
# define sys_outb(port, value) \
|
96 |
sys_outb_(port, value, CTX_INFO(#port "\0" #value)) |
97 |
|
98 |
# define sys_privctl(proc_ep, req, p) \
|
99 |
sys_privctl_(proc_ep, req, p, CTX_INFO(#proc_ep "\0" #req "\0" #p)) |
100 |
|
101 |
# define tickdelay(ticks) \
|
102 |
tickdelay_(ticks, CTX_INFO(#ticks))
|
103 |
|
104 |
# define usleep(useconds) \
|
105 |
usleep_(useconds, CTX_INFO(#useconds))
|
106 |
|
107 |
# define vm_map_phys(who, physaddr, len) \
|
108 |
vm_map_phys_(who, physaddr, len, CTX_INFO(#who "\0" #physaddr "\0" #len)) |
109 |
|
110 |
# define vm_unmap_phys(who, vaddr, len) \
|
111 |
vm_unmap_phys_(who, vaddr, len, CTX_INFO(#who "\0" #vaddr "\0" #len)) |
112 |
|
113 |
//
|
114 |
// LCOM liblm
|
115 |
//
|
116 |
|
117 |
# define lm_init(enable_logging) \
|
118 |
lm_init_(enable_logging, CTX_INFO(#enable_logging))
|
119 |
|
120 |
# define lm_alloc(size, map) \
|
121 |
lm_alloc_(size, map, CTX_INFO(#size "\0" #map)) |
122 |
|
123 |
# define lm_free(map) \
|
124 |
lm_free_(map, CTX_INFO(#map))
|
125 |
|
126 |
//
|
127 |
// LCOM Lab 2 functions
|
128 |
//
|
129 |
|
130 |
# define timer_test_read_config(timer, field) \
|
131 |
timer_test_read_config_(timer, field, CTX_INFO(#timer "\0" #field)) |
132 |
|
133 |
# define timer_test_time_base(timer, freq) \
|
134 |
timer_test_time_base_(timer, freq, CTX_INFO(#timer "\0" #freq)) |
135 |
|
136 |
# define timer_test_int(time) \
|
137 |
timer_test_int_(time, CTX_INFO(#time))
|
138 |
|
139 |
# define util_get_LSB(val, lsb) \
|
140 |
util_get_LSB_(val, lsb, CTX_INFO(#val "\0" #lsb)) |
141 |
|
142 |
# define util_get_MSB(val, msb) \
|
143 |
util_get_MSB_(val, msb, CTX_INFO(#val "\0" #msb)) |
144 |
|
145 |
# define timer_set_frequency(timer, freq) \
|
146 |
timer_set_frequency_(timer, freq, CTX_INFO(#timer "\0" #freq)) |
147 |
|
148 |
# define timer_subscribe_int(bit_no) \
|
149 |
timer_subscribe_int_(bit_no, CTX_INFO(#bit_no))
|
150 |
|
151 |
# define timer_unsubscribe_int() \
|
152 |
timer_unsubscribe_int_(CTX_INFO(""))
|
153 |
|
154 |
# define timer_int_handler() \
|
155 |
timer_int_handler_(CTX_INFO(""))
|
156 |
|
157 |
# define timer_get_conf(timer, st) \
|
158 |
timer_get_conf_(timer, st, CTX_INFO(#timer "\0" #st)) |
159 |
|
160 |
# define timer_display_conf(timer, st, field) \
|
161 |
timer_display_conf_(timer, st, field, CTX_INFO(#timer "\0" #st "\0" #field)) |
162 |
|
163 |
# define timer_print_config(timer, field, val) \
|
164 |
timer_print_config_(timer, field, val, CTX_INFO(#timer "\0" #field "\0" #val)) |
165 |
|
166 |
# define timer_print_elapsed_time() \
|
167 |
timer_print_elapsed_time_(CTX_INFO(""))
|
168 |
|
169 |
//
|
170 |
// LCOM Lab 3 functions
|
171 |
//
|
172 |
|
173 |
# define kbd_test_scan() \
|
174 |
kbd_test_scan_(CTX_INFO(""))
|
175 |
|
176 |
# define kbd_test_poll() \
|
177 |
kbd_test_poll_(CTX_INFO(""))
|
178 |
|
179 |
# define kbd_test_timed_scan(n) \
|
180 |
kbd_test_timed_scan_(n, CTX_INFO(#n))
|
181 |
|
182 |
# define kbc_ih() \
|
183 |
kbc_ih_(CTX_INFO(""))
|
184 |
|
185 |
# define kbd_print_scancode(make, size, bytes) \
|
186 |
kbd_print_scancode_(make, size, bytes, CTX_INFO(#make "\0" #size "\0" #bytes)) |
187 |
|
188 |
# define kbd_print_no_sysinb(cnt) \
|
189 |
kbd_print_no_sysinb_(cnt, CTX_INFO(#cnt))
|
190 |
|
191 |
//
|
192 |
// LCOM Lab 4 functions
|
193 |
//
|
194 |
|
195 |
# define mouse_test_packet(cnt) \
|
196 |
mouse_test_packet_(cnt, CTX_INFO(#cnt))
|
197 |
|
198 |
# define mouse_test_async(idle_time) \
|
199 |
mouse_test_async_(idle_time, CTX_INFO(#idle_time))
|
200 |
|
201 |
# define mouse_test_remote(period, cnt) \
|
202 |
mouse_test_remote_(period, cnt, CTX_INFO(#period "\0" #cnt)) |
203 |
|
204 |
# define mouse_test_gesture(x_len, tolerance) \
|
205 |
mouse_test_gesture_(x_len, tolerance, CTX_INFO(#x_len "\0" #tolerance)) |
206 |
|
207 |
# define mouse_ih() \
|
208 |
mouse_ih_(CTX_INFO(""))
|
209 |
|
210 |
# define mouse_print_packet(pp) \
|
211 |
mouse_print_packet_(pp, CTX_INFO(#pp))
|
212 |
|
213 |
# define mouse_enable_data_reporting() \
|
214 |
mouse_enable_data_reporting_(CTX_INFO(""))
|
215 |
|
216 |
/*
|
217 |
*
|
218 |
* Wrappers entry point.
|
219 |
*
|
220 |
*/
|
221 |
|
222 |
// not a wrapper, used as a way to solve pseudo-random number generation in Minix 3.4.0-rc6
|
223 |
int rand_();
|
224 |
|
225 |
//
|
226 |
// Minix / C library functions
|
227 |
//
|
228 |
|
229 |
int driver_receive_(endpoint_t src, message *m_ptr, int *status_ptr, const ctx_t ctx); |
230 |
|
231 |
u32_t micros_to_ticks_(u32_t micros, const ctx_t ctx);
|
232 |
|
233 |
int nanosleep_(const struct timespec *req, struct timespec *rem, const ctx_t ctx); |
234 |
|
235 |
int printf_(const ctx_t ctx, const char *__restrict format, ...); |
236 |
|
237 |
// void sef_startup_(const ctx_t ctx);
|
238 |
|
239 |
unsigned int sleep_(unsigned int seconds, const ctx_t ctx); |
240 |
|
241 |
int sys_enable_iop_(endpoint_t proc_ep, const ctx_t ctx); |
242 |
|
243 |
int sys_inb_(int port, u32_t *value, const ctx_t ctx); |
244 |
|
245 |
# if defined(__i386__)
|
246 |
int sys_int86_(reg86_t *reg86p, const ctx_t ctx); |
247 |
# endif
|
248 |
|
249 |
int sys_irqdisable_(int *irq_hook_id, const ctx_t ctx); |
250 |
|
251 |
int sys_irqenable_(int *irq_hook_id, const ctx_t ctx); |
252 |
|
253 |
int sys_irqrmpolicy_(int *irq_hook_id, const ctx_t ctx); |
254 |
|
255 |
int sys_irqsetpolicy_(int irq_vec, int policy, int *irq_hook_id, const ctx_t ctx); |
256 |
|
257 |
int sys_outb_(int port, u32_t value, const ctx_t ctx); |
258 |
|
259 |
int sys_privctl_(endpoint_t proc_ep, int req, void *p, const ctx_t ctx); |
260 |
|
261 |
int tickdelay_(clock_t ticks, const ctx_t ctx); |
262 |
|
263 |
int usleep_(useconds_t useconds, const ctx_t ctx); |
264 |
|
265 |
void *vm_map_phys_(endpoint_t who, void *physaddr, size_t len, const ctx_t ctx); |
266 |
|
267 |
int vm_unmap_phys_(endpoint_t who, void *vaddr, size_t len, const ctx_t ctx); |
268 |
|
269 |
//
|
270 |
// LCOM liblm
|
271 |
//
|
272 |
|
273 |
void *lm_init_(bool enable_logging, const ctx_t ctx); |
274 |
|
275 |
void *lm_alloc_(size_t size, mmap_t *map, const ctx_t ctx); |
276 |
|
277 |
bool lm_free_(mmap_t *map, const ctx_t ctx); |
278 |
|
279 |
//
|
280 |
// LCOM Lab 2
|
281 |
//
|
282 |
|
283 |
int timer_test_read_config_(uint8_t timer, enum timer_status_field field, const ctx_t ctx); |
284 |
|
285 |
int timer_test_time_base_(uint8_t timer, uint32_t freq, const ctx_t ctx); |
286 |
|
287 |
int timer_test_int_(uint8_t time, const ctx_t ctx); |
288 |
|
289 |
int util_get_LSB_(uint16_t val, uint8_t *lsb, const ctx_t ctx); |
290 |
|
291 |
int util_get_MSB_(uint16_t val, uint8_t *msb, const ctx_t ctx); |
292 |
|
293 |
int timer_set_frequency_(uint8_t timer, uint32_t freq, const ctx_t ctx); |
294 |
|
295 |
int timer_subscribe_int_(uint8_t *bit_no, const ctx_t ctx); |
296 |
|
297 |
int timer_unsubscribe_int_(const ctx_t ctx); |
298 |
|
299 |
void timer_int_handler_(const ctx_t ctx); |
300 |
|
301 |
int timer_get_conf_(uint8_t timer, uint8_t *st, const ctx_t ctx); |
302 |
|
303 |
int timer_display_conf_(uint8_t timer, uint8_t st, enum timer_status_field field, const ctx_t ctx); |
304 |
|
305 |
int timer_print_config_(uint8_t timer, enum timer_status_field field, |
306 |
union timer_status_field_val val, const ctx_t ctx); |
307 |
|
308 |
uint32_t timer_print_elapsed_time_(const ctx_t ctx);
|
309 |
|
310 |
//
|
311 |
// LCOM Lab 3
|
312 |
//
|
313 |
|
314 |
int kbd_test_scan_(const ctx_t ctx); |
315 |
|
316 |
int kbd_test_poll_(const ctx_t ctx); |
317 |
|
318 |
int kbd_test_timed_scan_(uint8_t n, const ctx_t ctx); |
319 |
|
320 |
void kbc_ih_(const ctx_t ctx); |
321 |
|
322 |
int kbd_print_scancode_(bool make, uint8_t size, uint8_t *bytes, const ctx_t ctx); |
323 |
|
324 |
int kbd_print_no_sysinb_(uint32_t cnt, const ctx_t ctx); |
325 |
|
326 |
//
|
327 |
// LCOM Lab 4
|
328 |
//
|
329 |
|
330 |
int mouse_test_packet_(uint32_t cnt, const ctx_t ctx); |
331 |
|
332 |
int mouse_test_remote_(uint16_t period, uint8_t cnt, const ctx_t ctx); |
333 |
|
334 |
int mouse_test_async_(uint8_t idle_time, const ctx_t ctx); |
335 |
|
336 |
int mouse_test_gesture_(uint8_t x_len, uint8_t tolerance, const ctx_t ctx); |
337 |
|
338 |
void mouse_ih_(const ctx_t ctx); |
339 |
|
340 |
void mouse_print_packet_(struct packet *pp, const ctx_t ctx); |
341 |
|
342 |
int mouse_enable_data_reporting_(const ctx_t ctx); |
343 |
|
344 |
//
|
345 |
// LCF library functions
|
346 |
//
|
347 |
|
348 |
# define lcf_start(argc, argv) \
|
349 |
lcf_start_(argc, argv, CTX_INFO(#argc "\0" #argv)) |
350 |
|
351 |
# define lcf_cleanup() \
|
352 |
lcf_cleanup_(true, CTX_INFO("")) |
353 |
|
354 |
# define lcf_log_output(output) \
|
355 |
lcf_log_output_(output, CTX_INFO(#output))
|
356 |
|
357 |
# define lcf_trace_calls(syslog) \
|
358 |
lcf_trace_calls_(syslog, CTX_INFO(#syslog))
|
359 |
|
360 |
# define lcf_set_language(lang) \
|
361 |
lcf_set_language_(lang, CTX_INFO(#lang))
|
362 |
|
363 |
// initialize LCF library by passing the command line arguments
|
364 |
// [sef_startup() is invoked internally]
|
365 |
int lcf_start_(int argc, char *argv[], const ctx_t ctx); |
366 |
|
367 |
// LCF library clean up operations (invoked immediately before exiting)
|
368 |
int lcf_cleanup_(bool usercall, const ctx_t ctx); |
369 |
|
370 |
// if set, creates a file to save all the output
|
371 |
bool lcf_log_output_(const char *output, const ctx_t ctx); |
372 |
|
373 |
// if set, creates a file to save the invocations of all functions being wrapped / "intercepted"
|
374 |
bool lcf_trace_calls_(const char *syslog, const ctx_t ctx); |
375 |
|
376 |
// enables to set the language for LCF messages
|
377 |
bool lcf_set_language_(const char *lang, const ctx_t ctx); |
378 |
|
379 |
#endif // __LCOM__ |