1 /* The kernel call implemented in this file:
2 * m_type: SYS_INT86
3 *
4 * The parameters for this kernel call are:
5 * m1_p1: INT86_REG86
6 */
7
8 #include "../system.h"
9 #include <minix/type.h>
10 #include <ibm/int86.h>
11
12 struct reg86u reg86;
13
14 /*===========================================================================*
15 * do_int86 *
16 *===========================================================================*/
17 PUBLIC int do_int86(m_ptr)
18 register message *m_ptr; /* pointer to request message */
19 {
20 int caller;
21 vir_bytes caller_vir;
22 phys_bytes caller_phys, kernel_phys;
23
24 caller = (int) m_ptr->m_source;
25 caller_vir = (vir_bytes) m_ptr->INT86_REG86;
26 caller_phys = umap_local(proc_addr(caller), D, caller_vir, sizeof(reg86));
27 if (0 == caller_phys) return(EFAULT);
28 kernel_phys = vir2phys(®86);
29 phys_copy(caller_phys, kernel_phys, (phys_bytes) sizeof(reg86));
30
31 level0(int86);
32
33 /* Copy results back to the caller */
34 phys_copy(kernel_phys, caller_phys, (phys_bytes) sizeof(reg86));
35
36 /* The BIOS call eats interrupts. Call get_randomness to generate some
37 * entropy. Normally, get_randomness is called from an interrupt handler.
38 * Figuring out the exact source is too complicated. CLOCK_IRQ is normally
39 * not very random.
40 */
41 lock(0, "do_int86");
42 get_randomness(CLOCK_IRQ);
43 unlock(0);
44
45 return(OK);
46 }
Cache object: 915a8b93a508e25d96b1429736679777
|