Replace common segment/offset pairs with struct segoff_s.
authorKevin O'Connor <kevin@koconnor.net>
Wed, 9 Sep 2009 15:34:39 +0000 (11:34 -0400)
committerKevin O'Connor <kevin@koconnor.net>
Wed, 9 Sep 2009 15:34:39 +0000 (11:34 -0400)
Introduce 'struct segoff_s' to more places.

19 files changed:
TODO
src/asm-offsets.c
src/biosvar.h
src/block.c
src/boot.c
src/bregs.h
src/clock.c
src/disk.c
src/disk.h
src/farptr.h
src/mouse.c
src/optionroms.c
src/output.c
src/post.c
src/resume.c
src/romlayout.S
src/util.c
vgasrc/vga.c
vgasrc/vgatables.h

diff --git a/TODO b/TODO
index b7f6b614d973a2efb74ac9866ef549120d977df1..760360ac4f967fd59a31958f52bd80b9b86bc1d3 100644 (file)
--- a/TODO
+++ b/TODO
@@ -16,8 +16,6 @@ cvs tip.
     -- lots of mouse changes, logo, scsi/etherboot hooks, int 1589,
        floppy data rate?, int19 calls post
 
-Possibly introduce a data type for the many seg/off pairs.
-
 Audit all sti/cli calls.  Audit all call16 calls to make sure flags is
 setup properly with respect to irqs.
 
index c3241512b98a7bb01ec580d84bfef4949447be93..5035cef8f7fe1be9d2c007e6182c4ca5b2bde0e4 100644 (file)
@@ -20,7 +20,7 @@ void foo(void)
     OFFSET(BREGS_esi, bregs, esi);
     OFFSET(BREGS_edi, bregs, edi);
     OFFSET(BREGS_flags, bregs, flags);
-    OFFSET(BREGS_ip, bregs, ip);
+    OFFSET(BREGS_code, bregs, code);
 
     COMMENT("BDA");
     OFFSET(BDA_ebda_seg, bios_data_area_s, ebda_seg);
index b200645faedfbd6484bfce245e4e4cc803581d64..d6a7a1522e7ca8e510e5276d0da2661888a6f49f 100644 (file)
 #include "config.h" // CONFIG_*
 #include "disk.h" // struct chs_s
 
-struct segoff_s {
-    union {
-        struct {
-            u16 offset;
-            u16 seg;
-        };
-        u32 segoff;
-    };
-};
-#define SEGOFF(s,o) ({struct segoff_s __so; __so.offset=(o); __so.seg=(s); __so;})
-
 
 /****************************************************************
  * Interupt vector table
@@ -33,8 +22,8 @@ struct rmode_IVT {
 
 #define GET_IVT(vector)                                         \
     GET_FARVAR(SEG_IVT, ((struct rmode_IVT *)0)->ivec[vector])
-#define SET_IVT(vector, seg, off)                                       \
-    SET_FARVAR(SEG_IVT, ((struct rmode_IVT *)0)->ivec[vector].segoff, ((seg) << 16) | (off))
+#define SET_IVT(vector, segoff)                                         \
+    SET_FARVAR(SEG_IVT, ((struct rmode_IVT *)0)->ivec[vector], segoff)
 
 
 /****************************************************************
@@ -77,8 +66,7 @@ struct bios_data_area_s {
     u16 crtc_address;
     u8 video_msr;
     u8 video_pal;
-    u16 jump_ip;
-    u16 jump_cs;
+    struct segoff_s jump;
     u8 other_6b;
     u32 timer_counter;
     // 40:70
@@ -110,13 +98,12 @@ struct bios_data_area_s {
     u8 floppy_track[2];
     u8 kbd_mode;
     u8 kbd_led;
-    u32 ptr_user_wait_complete_flag;
+    struct segoff_s user_wait_complete_flag;
     u32 user_wait_timeout;
     // 40:A0
     u8 rtc_wait_flag;
     u8 other_a1[7];
-    u16 video_savetable_ptr;
-    u16 video_savetable_seg;
+    struct segoff_s video_savetable;
     u8 other_ac[4];
     // 40:B0
     u8 other_b0[10];
@@ -204,7 +191,7 @@ struct fdpt_s {
 struct extended_bios_data_area_s {
     u8 size;
     u8 reserved1[0x21];
-    u32 far_call_pointer;
+    struct segoff_s far_call_pointer;
     u8 mouse_flag1;
     u8 mouse_flag2;
     u8 mouse_data[0x08];
index c96daaf610daceb3f807ade43c7f5ee49be53a18..3550dcdd28a01025b922536a5d849c54165bf58b 100644 (file)
@@ -163,11 +163,11 @@ fill_fdpt(int driveid)
     fdpt->checksum -= checksum(fdpt, sizeof(*fdpt));
 
     if (driveid == 0)
-        SET_IVT(0x41, get_ebda_seg()
-                , offsetof(struct extended_bios_data_area_s, fdpt[0]));
+        SET_IVT(0x41, SEGOFF(get_ebda_seg(), offsetof(
+                                 struct extended_bios_data_area_s, fdpt[0])));
     else
-        SET_IVT(0x46, get_ebda_seg()
-                , offsetof(struct extended_bios_data_area_s, fdpt[1]));
+        SET_IVT(0x46, SEGOFF(get_ebda_seg(), offsetof(
+                                 struct extended_bios_data_area_s, fdpt[1])));
 }
 
 // Map a drive (that was registered via add_bcv_hd)
index 9a08d26b941599d760539727ed85f7f1474a63e5..af2a893bff3986f931b780c4caf5deefa3ca19ca 100644 (file)
@@ -323,8 +323,7 @@ call_boot_entry(u16 bootseg, u16 bootip, u8 bootdrv)
 
     struct bregs br;
     memset(&br, 0, sizeof(br));
-    br.ip = bootip;
-    br.cs = bootseg;
+    br.code = SEGOFF(bootseg, bootip);
     // Set the magic number in ax and the boot drive in dl.
     br.dl = bootdrv;
     br.ax = 0xaa55;
index e59a7f447d0ae3d149115937405a6ac63bbf4bdf..3042ab2e8def111b945a18551e4e411beafa7ccc 100644 (file)
@@ -21,6 +21,8 @@
 
 #ifndef __ASSEMBLY__
 
+#include "farptr.h" // struct segoff_s
+
 /****************************************************************
  * Registers saved/restored in romlayout.S
  ****************************************************************/
@@ -42,8 +44,7 @@ struct bregs {
     UREG(edx, dx, dh, dl);
     UREG(ecx, cx, ch, cl);
     UREG(eax, ax, ah, al);
-    u16 ip;
-    u16 cs;
+    struct segoff_s code;
     u16 flags;
 } PACKED;
 
index c95f0a142ebb4b7ac4d8c0e0650b91065ded0048..9009d49ca142c8c7fbe10d328893ddc95a612e01 100644 (file)
@@ -454,7 +454,7 @@ set_usertimer(u32 usecs, u16 seg, u16 offset)
 
     // Interval not already set.
     SET_BDA(rtc_wait_flag, RWS_WAIT_PENDING);  // Set status byte.
-    SET_BDA(ptr_user_wait_complete_flag, (seg << 16) | offset);
+    SET_BDA(user_wait_complete_flag, SEGOFF(seg, offset));
     SET_BDA(user_wait_timeout, usecs);
 
     // Turn on the Periodic Interrupt timer
@@ -561,11 +561,11 @@ handle_70()
     u32 time = GET_BDA(user_wait_timeout);  // Time left in microseconds.
     if (time < 0x3D1) {
         // Done waiting - write to specified flag byte.
-        u32 segoff = GET_BDA(ptr_user_wait_complete_flag);
-        u16 segment = segoff >> 16;
-        u16 offset = segoff & 0xffff;
-        u8 oldval = GET_FARVAR(segment, *(u8*)(offset+0));
-        SET_FARVAR(segment, *(u8*)(offset+0), oldval | 0x80);
+        struct segoff_s segoff = GET_BDA(user_wait_complete_flag);
+        u16 ptr_seg = segoff.seg;
+        u8 *ptr_far = (u8*)(segoff.offset+0);
+        u8 oldval = GET_FARVAR(ptr_seg, *ptr_far);
+        SET_FARVAR(ptr_seg, *ptr_far, oldval | 0x80);
 
         clear_usertimer();
     } else {
index 014701a40f461311fdfeea0a84f327fa58217d54..b021c4055933ddff0c88bd36e324373f99b226ab 100644 (file)
@@ -180,9 +180,7 @@ extended_access(struct bregs *regs, u8 driveid, u16 command)
         return;
     }
 
-    u16 segment = GET_INT13EXT(regs, segment);
-    u16 offset = GET_INT13EXT(regs, offset);
-    dop.buf_fl = MAKE_FLATPTR(segment, offset);
+    dop.buf_fl = SEGOFF_TO_FLATPTR(GET_INT13EXT(regs, data));
     dop.count = GET_INT13EXT(regs, count);
 
     int status = send_disk_op(&dop);
index 96bc509dd52c97b4dc8b287484f5afebe7bf98cc..36941b71b6422e9aac22c031ee909b63d7918c27 100644 (file)
@@ -8,6 +8,7 @@
 
 #include "types.h" // u8
 #include "config.h" // CONFIG_*
+#include "farptr.h" // struct segoff_s
 
 #define DISK_RET_SUCCESS       0x00
 #define DISK_RET_EPARAM        0x01
@@ -35,8 +36,7 @@ struct int13ext_s {
     u8  size;
     u8  reserved;
     u16 count;
-    u16 offset;
-    u16 segment;
+    struct segoff_s data;
     u64 lba;
 } PACKED;
 
index 1f3df9d2bd00bb15a95d707eaa6932eced9112e2..acc9d596e9a2da72b8b42015d3c10d38e8f967f8 100644 (file)
@@ -190,4 +190,23 @@ extern void __force_link_error__only_in_16bit() __attribute__ ((noreturn));
 
 #endif
 
+// Definition for common 16bit segment/offset pointers.
+struct segoff_s {
+    union {
+        struct {
+            u16 offset;
+            u16 seg;
+        };
+        u32 segoff;
+    };
+};
+#define SEGOFF(s,o) ({struct segoff_s __so; __so.offset=(o); __so.seg=(s); __so;})
+
+static inline struct segoff_s FLATPTR_TO_SEGOFF(void *p) {
+    return SEGOFF(FLATPTR_TO_SEG(p), FLATPTR_TO_OFFSET(p));
+}
+static inline void *SEGOFF_TO_FLATPTR(struct segoff_s so) {
+    return MAKE_FLATPTR(so.seg, so.offset);
+}
+
 #endif // farptr.h
index e6abbb9af5c0998cd94e64f27d3edde7b38397fb..e7ec0c178869126bf6a354019872fb48edba1eb0 100644 (file)
@@ -235,10 +235,10 @@ mouse_15c206(struct bregs *regs)
 static void
 mouse_15c207(struct bregs *regs)
 {
-    u32 farptr = (regs->es << 16) | regs->bx;
+    struct segoff_s farptr = SEGOFF(regs->es, regs->bx);
     u16 ebda_seg = get_ebda_seg();
     u8 mouse_flags_2 = GET_EBDA2(ebda_seg, mouse_flag2);
-    if (! farptr) {
+    if (! farptr.segoff) {
         /* remove handler */
         if ((mouse_flags_2 & 0x80) != 0) {
             mouse_flags_2 &= ~0x80;
@@ -311,7 +311,7 @@ process_mouse(u8 data)
     u16 Y      = GET_EBDA2(ebda_seg, mouse_data[2]);
     SET_EBDA2(ebda_seg, mouse_flag1, 0);
 
-    u32 func = GET_EBDA2(ebda_seg, far_call_pointer);
+    struct segoff_s func = GET_EBDA2(ebda_seg, far_call_pointer);
 
     asm volatile(
         "sti\n"
@@ -327,7 +327,7 @@ process_mouse(u8 data)
         "cli\n"
         "cld\n"
         :
-        : "r"(func), "r"(status), "r"(X), "r"(Y)
+        : "r"(func.segoff), "r"(status), "r"(X), "r"(Y)
         : "cc"
         );
 }
index 0a5d85c1fc2609b4602bc6920a6431f65b4c1168..cd8f9d1a6eb4182a6a104be592e36d35911b3d20 100644 (file)
@@ -92,8 +92,7 @@ __callrom(struct rom_header *rom, u16 offset, u16 bdf)
     br.dx = 0xffff;
     br.es = SEG_BIOS;
     br.di = get_pnp_offset();
-    br.cs = seg;
-    br.ip = offset;
+    br.code = SEGOFF(seg, offset);
     call16big(&br);
 
     debug_serial_setup();
index 1cd0b8cbfffa9e4b25be1f0cc1585310eff28c63..6a164e1e6a0707aa6a9302862434847a43138441 100644 (file)
@@ -327,7 +327,7 @@ dump_regs(struct bregs *regs)
             , regs->ds, regs->es, GET_SEG(SS));
     dprintf(1, "  si=%08x di=%08x bp=%08x sp=%08x cs=%04x ip=%04x  f=%04x\n"
             , regs->esi, regs->edi, regs->ebp, (u32)&regs[1]
-            , regs->cs, regs->ip, regs->flags);
+            , regs->code.seg, regs->code.offset, regs->flags);
 }
 
 // Report entry to an Interrupt Service Routine (ISR).
index 69aeb93cd721a42228cf2ef6cc3baac01a1f38eb..7edd1f611fff4e666362f97bd2237c95fbf9358d 100644 (file)
@@ -23,7 +23,7 @@
 void
 __set_irq(int vector, void *loc)
 {
-    SET_IVT(vector, SEG_BIOS, (u32)loc - BUILD_BIOS_ADDR);
+    SET_IVT(vector, SEGOFF(SEG_BIOS, (u32)loc - BUILD_BIOS_ADDR));
 }
 
 #define set_irq(vector, func) do {              \
@@ -64,7 +64,7 @@ init_ivt()
 
     // set vector 0x79 to zero
     // this is used by 'gardian angel' protection system
-    SET_IVT(0x79, 0, 0);
+    SET_IVT(0x79, SEGOFF(0, 0));
 
     __set_irq(0x1E, &diskette_param_table2);
 }
index cfe26cda7c90f77b195a57213a816816ef101624..097bb6f38f7299745b1451e9e3be50ddf5886742 100644 (file)
@@ -60,12 +60,12 @@ handle_resume(u8 status)
         eoi_pic2();
         // NO BREAK
     case 0x0a:
-#define BDA_JUMP_IP (((struct bios_data_area_s *)0)->jump_ip)
+#define BDA_JUMP (((struct bios_data_area_s *)0)->jump)
         // resume execution by jump via 40h:0067h
         asm volatile(
             "movw %w1, %%ds\n"
             "ljmpw *%0\n"
-            : : "m"(BDA_JUMP_IP), "r"(SEG_BDA)
+            : : "m"(BDA_JUMP), "r"(SEG_BDA)
             );
         break;
 
@@ -75,7 +75,7 @@ handle_resume(u8 status)
             "movw %w1, %%ds\n"
             "lssw %0, %%sp\n"
             "iretw\n"
-            : : "m"(BDA_JUMP_IP), "r"(SEG_BDA)
+            : : "m"(BDA_JUMP), "r"(SEG_BDA)
             );
         break;
 
@@ -85,7 +85,7 @@ handle_resume(u8 status)
             "movw %w1, %%ds\n"
             "lssw %0, %%sp\n"
             "lretw\n"
-            : : "m"(BDA_JUMP_IP), "r"(SEG_BDA)
+            : : "m"(BDA_JUMP), "r"(SEG_BDA)
             );
         break;
     }
@@ -115,13 +115,11 @@ s3_resume()
     memset(&br, 0, sizeof(br));
     if (s3_resume_vector) {
         dprintf(1, "Jump to resume vector (%x)\n", s3_resume_vector);
-        br.ip = FLATPTR_TO_OFFSET(s3_resume_vector);
-        br.cs = FLATPTR_TO_SEG(s3_resume_vector);
+        br.code = FLATPTR_TO_SEGOFF((void*)s3_resume_vector);
     } else {
         dprintf(1, "No resume vector set!\n");
         // Jump to the post vector to restart with a normal boot.
-        br.ip = (u32)reset_vector - BUILD_BIOS_ADDR;
-        br.cs = SEG_BIOS;
+        br.code = SEGOFF(SEG_BIOS, (u32)reset_vector - BUILD_BIOS_ADDR);
     }
     call16big(&br);
 }
index d430d2878472f4ff679e62fe92343d36c3b9a062..1bbdd9ca591fe623c960e1d7ef788e03ee9f02e4 100644 (file)
@@ -152,7 +152,7 @@ __call16:
         pushw %cs
         pushw $1f               // return point
         pushw BREGS_flags(%eax) // flags
-        pushl BREGS_ip(%eax)    // CS:IP
+        pushl BREGS_code(%eax)  // CS:IP
 
         // Load calling registers.
         movl BREGS_edi(%eax), %edi
index 283ec088c185b6572dcc5067a70faa9fcf67e6e0..841c00a7ac3ecbd103dc5d79f0af4f1b423cc04c 100644 (file)
@@ -42,10 +42,10 @@ inline void
 __call16_int(struct bregs *callregs, u16 offset)
 {
     if (MODE16)
-        callregs->cs = GET_SEG(CS);
+        callregs->code.seg = GET_SEG(CS);
     else
-        callregs->cs = SEG_BIOS;
-    callregs->ip = offset;
+        callregs->code.seg = SEG_BIOS;
+    callregs->code.offset = offset;
     call16(callregs);
 }
 
index 88cbb01fd39b707d9bd688e6c152bc56f4ffaf09..6d06cd68d10663aaa1b72c5bdee194ba610d9e83 100644 (file)
@@ -312,8 +312,8 @@ save_bda_state(u16 seg, struct saveBDAstate *info)
     SET_FARVAR(seg, info->video_pagestart, GET_BDA(video_pagestart));
     SET_FARVAR(seg, info->video_page, GET_BDA(video_page));
     /* current font */
-    SET_FARVAR(seg, *(u32*)&info->font0_off, GET_IVT(0x1f).segoff);
-    SET_FARVAR(seg, *(u32*)&info->font1_off, GET_IVT(0x43).segoff);
+    SET_FARVAR(seg, info->font0, GET_IVT(0x1f));
+    SET_FARVAR(seg, info->font1, GET_IVT(0x43));
 }
 
 static void
@@ -335,10 +335,8 @@ restore_bda_state(u16 seg, struct saveBDAstate *info)
     SET_BDA(video_pagestart, GET_FARVAR(seg, info->video_pagestart));
     SET_BDA(video_page, GET_FARVAR(seg, info->video_page));
     /* current font */
-    SET_IVT(0x1f, GET_FARVAR(seg, info->font0_seg)
-            , GET_FARVAR(seg, info->font0_off));
-    SET_IVT(0x43, GET_FARVAR(seg, info->font1_seg)
-            , GET_FARVAR(seg, info->font1_off));
+    SET_IVT(0x1f, GET_FARVAR(seg, info->font0));
+    SET_IVT(0x43, GET_FARVAR(seg, info->font1));
 }
 
 
@@ -425,8 +423,8 @@ handle_1000(struct bregs *regs)
 
     // FIXME We nearly have the good tables. to be reworked
     SET_BDA(dcc_index, 0x08);   // 8 is VGA should be ok for now
-    SET_BDA(video_savetable_ptr, (u32)video_save_pointer_table);
-    SET_BDA(video_savetable_seg, get_global_seg());
+    SET_BDA(video_savetable
+            , SEGOFF(get_global_seg(), (u32)video_save_pointer_table));
 
     // FIXME
     SET_BDA(video_msr, 0x00); // Unavailable on vanilla vga, but...
@@ -451,17 +449,17 @@ handle_1000(struct bregs *regs)
         call16_vgaint(0x1103, 0);
     }
     // Set the ints 0x1F and 0x43
-    SET_IVT(0x1f, get_global_seg(), (u32)&vgafont8[128 * 8]);
+    SET_IVT(0x1f, SEGOFF(get_global_seg(), (u32)&vgafont8[128 * 8]));
 
     switch (cheight) {
     case 8:
-        SET_IVT(0x43, get_global_seg(), (u32)vgafont8);
+        SET_IVT(0x43, SEGOFF(get_global_seg(), (u32)vgafont8));
         break;
     case 14:
-        SET_IVT(0x43, get_global_seg(), (u32)vgafont14);
+        SET_IVT(0x43, SEGOFF(get_global_seg(), (u32)vgafont14));
         break;
     case 16:
-        SET_IVT(0x43, get_global_seg(), (u32)vgafont16);
+        SET_IVT(0x43, SEGOFF(get_global_seg(), (u32)vgafont16));
         break;
     }
 }
@@ -1103,8 +1101,10 @@ handle_101b(struct bregs *regs)
     SET_FARVAR(seg, info->static_functionality_seg, get_global_seg());
 
     // Hard coded copy from BIOS area. Should it be cleaner ?
-    memcpy_far(seg, info->bda_0x49, SEG_BDA, (void*)0x49, 30);
-    memcpy_far(seg, info->bda_0x84, SEG_BDA, (void*)0x84, 3);
+    memcpy_far(seg, info->bda_0x49, SEG_BDA, (void*)0x49
+               , sizeof(info->bda_0x49));
+    memcpy_far(seg, info->bda_0x84, SEG_BDA, (void*)0x84
+               , sizeof(info->bda_0x84));
 
     SET_FARVAR(seg, info->dcc_index, GET_BDA(dcc_index));
     SET_FARVAR(seg, info->colors, 16);
@@ -1368,7 +1368,7 @@ vga_post(struct bregs *regs)
         vbe_init();
 
     extern void entry_10(void);
-    SET_IVT(0x10, get_global_seg(), (u32)entry_10);
+    SET_IVT(0x10, SEGOFF(get_global_seg(), (u32)entry_10));
 
     if (CONFIG_CIRRUS)
         cirrus_init();
index 87b8043403d9b506703b27771d17f32cf75e89f8..e5f3309cc5e74d541c5937961de89bfd56a0259e 100644 (file)
@@ -2,6 +2,7 @@
 #define __VGATABLES_H
 
 #include "types.h" // u8
+#include "farptr.h" // struct segoff_s
 
 /*
  *
@@ -123,10 +124,8 @@ struct saveBDAstate {
     u16 video_pagestart;
     u8 video_page;
     /* current font */
-    u16 font0_off;
-    u16 font0_seg;
-    u16 font1_off;
-    u16 font1_seg;
+    struct segoff_s font0;
+    struct segoff_s font1;
 };
 
 struct saveDACcolors {