5 #define addr(t) (((t & 0xffff0000) >> 12) + (t & 0x0000ffff))
7 void rconv_vm86_to_LRMI(struct vm86_regs
*rs
, struct LRMI_regs
*rd
)
9 memset(rd
, 0, sizeof(*rd
));
19 rd
->flags
= rs
->eflags
;
28 void rconv_LRMI_to_vm86(struct LRMI_regs
*rs
, struct vm86_regs
*rd
)
38 rd
->eflags
= rs
->flags
;
48 int err
= LRMI_init();
53 return (err
== 1) ? 0 : 1;
57 * Perform a simulated interrupt call.
59 int v86_int(int num
, struct vm86_regs
*regs
)
64 rconv_vm86_to_LRMI(regs
, &r
);
65 err
= LRMI_int(num
, &r
);
66 rconv_LRMI_to_vm86(&r
, regs
);
68 return (err
== 1) ? 0 : 1;
71 #define vbeib_get_string(name) \
74 ulog("%x %x\n", t, bufend); \
76 ib->name = t - (u32)lbuf; \
82 int v86_task(struct uvesafb_task
*tsk
, u8
*buf
)
86 /* Get the VBE Info Block */
87 if (tsk
->flags
& TF_VBEIB
) {
91 lbuf
= LRMI_alloc_real(tsk
->buf_len
);
92 memcpy(lbuf
, buf
, tsk
->buf_len
);
93 tsk
->regs
.es
= (u32
)lbuf
>> 4;
94 tsk
->regs
.edi
= 0x0000;
96 if (v86_int(0x10, &tsk
->regs
) || (tsk
->regs
.eax
& 0xffff) != 0x004f)
99 ib
= (struct vbe_ib
*)buf
;
100 bufend
= (u32
)(lbuf
+ sizeof(struct vbe_ib
));
101 memcpy(buf
, lbuf
, tsk
->buf_len
);
103 vbeib_get_string(oem_string_ptr
);
104 vbeib_get_string(oem_vendor_name_ptr
);
105 vbeib_get_string(oem_product_name_ptr
);
106 vbeib_get_string(oem_product_rev_ptr
);
107 vbeib_get_string(mode_list_ptr
);
109 LRMI_free_real(lbuf
);
112 lbuf
= LRMI_alloc_real(tsk
->buf_len
);
113 memcpy(lbuf
, buf
, tsk
->buf_len
);
116 if (tsk
->flags
& TF_BUF_ESDI
) {
117 tsk
->regs
.es
= (u32
)lbuf
>> 4;
118 tsk
->regs
.edi
= 0x0000;
121 if (v86_int(0x10, &tsk
->regs
) || (tsk
->regs
.eax
& 0xffff) != 0x004f)
124 if (tsk
->buf_len
&& tsk
->flags
& TF_BUF_RET
) {
125 memcpy(buf
, lbuf
, tsk
->buf_len
);
129 LRMI_free_real(lbuf
);