4 #define addr(t) (((t & 0xffff0000) >> 12) + (t & 0x0000ffff))
6 #define vbeib_get_string(name) \
11 ib->name = t - lbuf; \
12 } else if (t > 0xa0000 && fsize > 0) { \
13 strncpy((char*)buf, vptr(t), fsize); \
14 ib->name = tsk->buf_len - fsize; \
15 l = strlen((char*)buf) + 1; \
25 int v86_task(struct uvesafb_task
*tsk
, u8
*buf
)
29 ulog(LOG_DEBUG
, "task flags: 0x%02x\n", tsk
->flags
);
30 ulog(LOG_DEBUG
, "EAX=0x%08x EBX=0x%08x ECX=0x%08x EDX=0x%08x\n",
31 tsk
->regs
.eax
, tsk
->regs
.ebx
, tsk
->regs
.ecx
, tsk
->regs
.edx
);
32 ulog(LOG_DEBUG
, "ESP=0x%08x EBP=0x%08x ESI=0x%08x EDI=0x%08x\n",
33 tsk
->regs
.esp
, tsk
->regs
.ebp
, tsk
->regs
.esi
, tsk
->regs
.edi
);
35 /* Get the VBE Info Block */
36 if (tsk
->flags
& TF_VBEIB
) {
42 lbuf
= v86_mem_alloc(tsk
->buf_len
);
44 ulog(LOG_ERR
, "Memory allocation for a VBE IB buffer failed.");
47 memcpy(vptr(lbuf
), buf
, tsk
->buf_len
);
48 tsk
->regs
.es
= lbuf
>> 4;
49 tsk
->regs
.edi
= 0x0000;
51 if (v86_int(0x10, &tsk
->regs
) || (tsk
->regs
.eax
& 0xffff) != 0x004f)
54 ib
= (struct vbe_ib
*)buf
;
55 bufend
= lbuf
+ sizeof(*ib
);
56 memcpy(buf
, vptr(lbuf
), tsk
->buf_len
);
58 /* The original VBE Info Block is 512 bytes long. */
59 fsize
= tsk
->buf_len
- 512;
62 t
= addr(ib
->mode_list_ptr
);
63 /* Mode list is in the buffer, we're good. */
65 ulog(LOG_DEBUG
, "The mode list is in the buffer at %.8x.", t
);
66 ib
->mode_list_ptr
= t
- lbuf
;
68 /* Mode list is in the ROM. We copy as much of it as we can
69 * to the task buffer. */
70 } else if (t
> 0xa0000) {
73 ulog(LOG_DEBUG
, "The mode list is in the Video ROM at %.8x", t
);
77 while (fsize
> 2 && (tmp
= v_rdw(t
)) != 0xffff) {
85 ib
->mode_list_ptr
= 512;
90 /* Mode list is somewhere else. We're seriously screwed. */
92 ulog(LOG_ERR
, "Can't retrieve mode list from %x\n", t
);
93 ib
->mode_list_ptr
= 0;
96 vbeib_get_string(oem_string_ptr
);
97 vbeib_get_string(oem_vendor_name_ptr
);
98 vbeib_get_string(oem_product_name_ptr
);
99 vbeib_get_string(oem_product_rev_ptr
);
104 lbuf
= v86_mem_alloc(tsk
->buf_len
);
106 ulog(LOG_ERR
, "Memory allocation for a v86d task buffer failed.");
109 memcpy(vptr(lbuf
), buf
, tsk
->buf_len
);
112 if (tsk
->flags
& TF_BUF_ESDI
) {
113 tsk
->regs
.es
= lbuf
>> 4;
114 tsk
->regs
.edi
= 0x0000;
117 if (tsk
->flags
& TF_BUF_ESBX
) {
118 tsk
->regs
.es
= lbuf
>> 4;
119 tsk
->regs
.ebx
= 0x0000;
122 if (v86_int(0x10, &tsk
->regs
) || (tsk
->regs
.eax
& 0xffff) != 0x004f)
125 if (tsk
->buf_len
&& tsk
->flags
& TF_BUF_RET
) {
126 memcpy(buf
, vptr(lbuf
), tsk
->buf_len
);