Project

General

Profile

Statistics
| Revision:

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__