Project

General

Profile

Statistics
| Revision:

root / lab4 / .minix-src / include / lcom / lcf.h @ 14

History | View | Annotate | Download (9.99 KB)

1 13 up20180614
#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__