Fix formatting in ulog strings.
[v86d.git] / v86_common.c
blobe69c63695ef9e25193a4e93a03e2b0d511fb1b28
1 #include <string.h>
2 #include "v86.h"
4 #define addr(t) (((t & 0xffff0000) >> 12) + (t & 0x0000ffff))
6 #define vbeib_get_string(name) \
7 { \
8 int l; \
9 t = addr(ib->name); \
10 if (t < bufend) { \
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); \
16 fsize -= l; \
17 buf += l; \
18 if (fsize < 0) \
19 fsize = 0; \
20 } else { \
21 ib->name = 0; \
22 } \
25 int v86_task(struct uvesafb_task *tsk, u8 *buf)
27 u32 lbuf = 0;
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) {
37 struct vbe_ib *ib;
38 int fsize;
39 u32 t, bufend;
40 u16 *td;
42 lbuf = v86_mem_alloc(tsk->buf_len);
43 if (!lbuf) {
44 ulog(LOG_ERR, "Memory allocation for a VBE IB buffer failed.");
45 return -1;
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)
52 goto out_vbeib;
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;
60 buf += 512;
62 t = addr(ib->mode_list_ptr);
63 /* Mode list is in the buffer, we're good. */
64 if (t < bufend) {
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) {
71 u16 tmp;
73 ulog(LOG_DEBUG, "The mode list is in the Video ROM at %.8x", t);
75 td = (u16*)buf;
77 while (fsize > 2 && (tmp = v_rdw(t)) != 0xffff) {
78 fsize -= 2;
79 *td = tmp;
80 td++;
81 t += 2;
82 buf += 2;
85 ib->mode_list_ptr = 512;
86 *td = 0xffff;
87 buf += 2;
88 fsize -= 2;
90 /* Mode list is somewhere else. We're seriously screwed. */
91 } else {
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);
100 out_vbeib:
101 v86_mem_free(lbuf);
102 } else {
103 if (tsk->buf_len) {
104 lbuf = v86_mem_alloc(tsk->buf_len);
105 if (!lbuf) {
106 ulog(LOG_ERR, "Memory allocation for a v86d task buffer failed.");
107 return -1;
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)
123 goto out;
125 if (tsk->buf_len && tsk->flags & TF_BUF_RET) {
126 memcpy(buf, vptr(lbuf), tsk->buf_len);
128 out:
129 if (tsk->buf_len)
130 v86_mem_free(lbuf);
133 return 0;