=== modified file 'emmy_pcmobo.h'
--- emmy_pcmobo.h	2008-06-07 04:44:17 +0000
+++ emmy_pcmobo.h	2008-06-07 05:14:50 +0000
@@ -141,8 +141,8 @@
     void insbmvec (Emmy_Iodev *iodev, int index, uLong bmsize, uLong bmaddr);
     void insiovec (Emmy_Iodev *iodev, int index, uLong iosize, uLong ioaddr);
     void pci_cfgwrite (Emmy_Pcidev *pcidev, uLong pcicfgregnum, uLong pcicfgdata);
-    void Emmy_Pcmobo::repbmiovec (Emmy_Pcmobo_Bmio *bmio, Emmy_Iodev *iodev, int index, uLong addr);
-    void Emmy_Pcmobo::insbmiovec (Emmy_Pcmobo_Bmio *bmio, Emmy_Iodev *iodev, int index, uLong size, uLong addr);
+    void repbmiovec (Emmy_Pcmobo_Bmio *bmio, Emmy_Iodev *iodev, int index, uLong addr);
+    void insbmiovec (Emmy_Pcmobo_Bmio *bmio, Emmy_Iodev *iodev, int index, uLong size, uLong addr);
     int read_8259s (uLong ioaddr, uByte *buff);
     int write_8259s (uLong ioaddr, uByte data);
     uLong read_ioapic (uLong index);

=== modified file 'emmy_x86.h'
--- emmy_x86.h	2008-06-07 04:44:17 +0000
+++ emmy_x86.h	2008-06-07 05:14:50 +0000
@@ -436,6 +436,35 @@
     friend void emmy_x86_sigtrap (int signum, siginfo_t *si, void *dummy);
   };
 
+void emmy_x86_sigsegv (int signum, siginfo_t *si, void *dummy);
+void emmy_x86_sigfpe  (int signum, siginfo_t *si, void *dummy);
+void emmy_x86_sigtrap (int signum, siginfo_t *si, void *dummy);
+void emmy_x86_lapicint (Emmy_X86 *sender, uLong apicicr0, uLong apicicr1);
+uByte emmy_x86_disasmfetch (void *cpuv, uLong eip);
+void emmy_x86_evbptex_dbz (Emmy_X86 *cpu);
+uLong emmy_x86_evbptex_pmr (Emmy_X86 *cpu, uLong size, uLong addr);
+uLong emmy_x86_evbptex_vmr (Emmy_X86 *cpu, uLong size, uLong addr);
+uLong emmy_x86_evbptex_ior (Emmy_X86 *cpu, uLong size, uLong addr);
+void emmy_x86_x_xlate_test (void);
+void emmy_x86_x_movs_wrap (Emmy_X86 *cpu, uLong l2inc);
+void emmy_x86_x_cmps_wrap (Emmy_X86 *cpu, uLong l2inc, uLong repc);
+void emmy_x86_x_stos_wrap (Emmy_X86 *cpu, uLong l2inc, uLong repc);
+void emmy_x86_x_lods_wrap (Emmy_X86 *cpu, uLong l2inc, uLong repc);
+void emmy_x86_x_scas_wrap (Emmy_X86 *cpu, uLong l2inc, uLong repc);
+uLong emmy_x86_x_loadseg_wrap (Emmy_X86 *cpu, int segreg, uWord segno);
+uLong emmy_x86_x_readlin_wrap (Emmy_X86 *cpu, uLong ladr, int size);
+void emmy_x86_x_writelin_wrap (Emmy_X86 *cpu, uLong ladr, int size, uLong data);
+void emmy_x86_modlin_wrap (Emmy_X86 *cpu, uLong ladr, int size, Emmy_X86_Modlin_Wrap entry, uLong param);
+void emmy_x86_x_readlinbig_wrap (Emmy_X86 *cpu, uLong size, uLong ladr, uByte *radr);
+void emmy_x86_x_readlinbig_wrap_knl (Emmy_X86 *cpu, uLong size, uLong ladr, uByte *radr);
+void emmy_x86_x_writelinbig_wrap (Emmy_X86 *cpu, uLong size, uLong ladr, uByte const *radr);
+uLong emmy_x86_x_ladr2padr_wrap (Emmy_X86 *cpu, uLong ladr, int wrt);
+uLong emmy_x86_x_readioport_wrap (Emmy_X86 *cpu, int size, uLong ioport);
+void emmy_x86_x_writeioport_wrap (Emmy_X86 *cpu, int size, uLong ioport, uLong data);
+uLong emmy_x86_x_readphy_wrap (Emmy_X86 *cpu, uLong padr, int size);
+void emmy_x86_x_writephy_wrap (Emmy_X86 *cpu, uLong padr, int size, uLong data);
+void emmy_x86_x_exception_wrap (Emmy_X86 *cpu, uByte vector, int paramf, uLong paramv);
+
 extern Emmy_Pcmobo *emmy_x86_pcmobo;		// motherboard the ram is on
 extern Emmy_X86_Xpg ***emmy_x86_xpgsss;		// array of array of pointers, one per emmy_x86_pcmobo -> nrams
 						// then arrays are indexed by physical page within that ram

=== modified file 'emmy_x86_i_fpu.c'
--- emmy_x86_i_fpu.c	2008-06-07 04:44:17 +0000
+++ emmy_x86_i_fpu.c	2008-06-07 05:14:50 +0000
@@ -56,6 +56,10 @@
 
 static Fr const indefinite = { 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF };
 
+/* A workaround for a change in GCC's asm constraints. */
+static uWord ex_ctl;
+#define EX ({ ex_ctl = cpu -> fpu.ctl | FPU_CTL_EX; ex_ctl; })
+
 /* Initialize FPU */
 
 #define FPU_INI do { memset (&(cpu -> fpu), 0, sizeof cpu -> fpu); cpu -> fpu.ctl = 0x037F; cpu -> fpu.tag = 0xFFFF; } while (0)
@@ -143,7 +147,7 @@
          "fnstsw %%ax"							\
          : "+m" (*dstfr), 						\
            "=a" (sts)							\
-         : "m" (cpu -> fpu.ctl | FPU_CTL_EX));				\
+         : "m" (EX));				\
     FPU_UPDSTS (sts);							\
   }									\
   break;								\
@@ -165,7 +169,7 @@
          : "+m" (*dstfr), 						\
            "=a" (sts)							\
          : "m" (*srcfr), 						\
-           "m" (cpu -> fpu.ctl | FPU_CTL_EX));				\
+           "m" (EX));				\
     FPU_UPDSTS (sts);							\
   }									\
   break;								\
@@ -184,7 +188,7 @@
                   "fnstsw %%ax"						\
                   : "=a" (sts)						\
                   : "m" (*dstfr), 					\
-                    "m" (cpu -> fpu.ctl | FPU_CTL_EX));			\
+                    "m" (EX));			\
     if (!(sts & FPU_STS_C2)) {						\
       asm volatile ("fstpt  %0" : "=m" (cpu -> fpu.s[i]));		\
       FPU_DECTOP;							\
@@ -211,7 +215,7 @@
          : "+m" (*dstfr), 						\
            "=a" (sts)							\
          : "m" (*srcfr), 						\
-           "m" (cpu -> fpu.ctl | FPU_CTL_EX));				\
+           "m" (EX));				\
     FPU_UPDSTS (sts);							\
     if (srcfr != &indefinite) FPU_INCTOP;				\
   }									\
@@ -375,7 +379,7 @@
          : "+m" (*dstfr), 						\
            "=a" (sts)							\
          :  "m" (*srcfr), 						\
-            "m" (cpu -> fpu.ctl | FPU_CTL_EX));				\
+            "m" (EX));				\
   } else {								\
     asm ("fnclex\n\t"							\
          "fldcw  %3\n\t"						\
@@ -386,7 +390,7 @@
          : "+m" (*dstfr), 						\
            "=a" (sts)							\
          :  "m" (data), 						\
-            "m" (cpu -> fpu.ctl | FPU_CTL_EX));				\
+            "m" (EX));				\
   }									\
   if (pop) FPU_INCTOP;							\
   break;								\
@@ -468,7 +472,7 @@
              : "+m" (*dstfr), 
                "=a" (sts)
              :  "m" (data), 
-                "m" (cpu -> fpu.ctl | FPU_CTL_EX));
+                "m" (EX));
         FPU_UPDSTS (sts);
       }
       FPU_DECTOP;						// mark that there's something there now
@@ -499,7 +503,7 @@
              : "+m" (data), 
                "=a" (sts)
              :  "m" (*srcfr), 
-                "m" (cpu -> fpu.ctl | FPU_CTL_EX));
+                "m" (EX));
         if (!(sts & FPU_STS_EX & ~(cpu -> fpu.ctl))) {		// check for unmasked exception during convert
           writellong (ladr, 0, data);				// if ok, try to write to memory
         }
@@ -519,7 +523,7 @@
              : "+m" (data), 
                "=a" (sts)
              :  "m" (*srcfr), 
-                "m" (cpu -> fpu.ctl | FPU_CTL_EX));
+                "m" (EX));
         if (!(sts & FPU_STS_EX & ~(cpu -> fpu.ctl))) {		// check for unmasked exception during convert
           writellong (ladr, 0, data);				// if ok, try to write to memory
         }
@@ -552,7 +556,7 @@
                  : "=m" (tempfr), 
                    "=a" (sts)
                  :  "m" (*srcfr), 
-                    "m" (cpu -> fpu.ctl | FPU_CTL_EX));
+                    "m" (EX));
             FPU_UPDSTS (sts);					// update status
             break;
           }
@@ -567,7 +571,7 @@
                  : "=m" (tempfr), 
                    "=a" (sts)
                  :  "m" (*srcfr), 
-                    "m" (cpu -> fpu.ctl | FPU_CTL_EX));
+                    "m" (EX));
             FPU_UPDSTS (sts);					// update status
             break;
           }
@@ -592,7 +596,7 @@
         FPU_CKPUSH (i);						// index of cell to push to
         asm volatile ("fnclex\n\t"				// set up FPU rounding mode
                       "fldcw  %0\n\t"
-                      : : "m" (cpu -> fpu.ctl | FPU_CTL_EX));
+                      : : "m" (EX));
         switch (modrmbyte & 7) {				// push constant
           case 0: asm volatile ("fld1");   break;
           case 1: asm volatile ("fldl2t"); break;
@@ -625,7 +629,7 @@
                    "fnstsw %%ax"
                    : "+m" (*dstfr), 
                      "=a" (sts)
-                   : "m" (cpu -> fpu.ctl | FPU_CTL_EX));
+                   : "m" (EX));
               FPU_UPDSTS (sts);
             }
             break;
@@ -644,7 +648,7 @@
                             "fnstsw %%ax"
                             : "=a" (sts)
                             : "m" (*dstfr), 
-                              "m" (cpu -> fpu.ctl | FPU_CTL_EX));
+                              "m" (EX));
               if (sts & FPU_STS_ZE & ~cpu -> fpu.ctl) {
                 asm volatile ("fstpt  %0\n\tfstpt  %0" : "=m" (tempfr));
               } else {
@@ -724,7 +728,7 @@
        : "+m" (*dstfr), 						\
          "=a" (sts)							\
        :  "m" (data), 							\
-          "m" (cpu -> fpu.ctl | FPU_CTL_EX));				\
+          "m" (EX));				\
   if (pop) FPU_INCTOP;							\
   break;								\
 }
@@ -763,7 +767,7 @@
              : "=a" (sts)
              : "m" (*srcfr2), 
                "m" (*srcfr), 
-               "m" (cpu -> fpu.ctl | FPU_CTL_EX));
+               "m" (EX));
         FPU_UPDSTS (sts);
         if (srcfr  != &indefinite) FPU_INCTOP;
         if (srcfr2 != &indefinite) FPU_INCTOP;
@@ -855,7 +859,7 @@
                "=m" (tempfr)
              :  "m" (*srcfr), 
                 "m" (*srcfr2), 
-                "m" (cpu -> fpu.ctl | FPU_CTL_EX));
+                "m" (EX));
         FPU_UPDSTS (sts);
         break;
       }
@@ -873,7 +877,7 @@
                "=m" (tempfr)
              :  "m" (*srcfr), 
                 "m" (*srcfr2), 
-                "m" (cpu -> fpu.ctl | FPU_CTL_EX));
+                "m" (EX));
         FPU_UPDSTS (sts);
         break;
       }
@@ -896,7 +900,7 @@
              : "=a" (sts), 
                "=m" (cpu -> fpu.s[i])
              :  "m" (data), 
-                "m" (cpu -> fpu.ctl | FPU_CTL_EX));
+                "m" (EX));
         FDB((" -> %p %4.4X %4.4X %4.4X %4.4X %4.4X", &(cpu -> fpu.s[i]), cpu -> fpu.s[i].x[4], cpu -> fpu.s[i].x[3], cpu -> fpu.s[i].x[2], cpu -> fpu.s[i].x[1], cpu -> fpu.s[i].x[0]));
         FDB((": sts %4.4X, tag %4.4X", cpu -> fpu.sts, cpu -> fpu.tag));
         FPU_UPDSTS (sts);
@@ -917,7 +921,7 @@
              : "=a" (sts), 
                "=m" (data)
              :  "m" (*srcfr), 
-                "m" (cpu -> fpu.ctl | FPU_CTL_EX));
+                "m" (EX));
         writellong (ladr, 0, data);
         FPU_UPDSTS (sts);
         break;
@@ -935,7 +939,7 @@
              : "=a" (sts), 
                "=m" (data)
              :  "m" (*srcfr), 
-                "m" (cpu -> fpu.ctl | FPU_CTL_EX));
+                "m" (EX));
         writellong (ladr, 0, data);
         FPU_UPDSTS (sts);
         if (srcfr != &indefinite) FPU_INCTOP;
@@ -984,7 +988,7 @@
          : "+m" (*dstfr), 						\
            "=a" (sts)							\
          :  "m" (*srcfr), 						\
-            "m" (cpu -> fpu.ctl | FPU_CTL_EX));				\
+            "m" (EX));				\
   } else {								\
     asm ("fnclex\n\t"							\
          "fldcw  %3\n\t"						\
@@ -995,7 +999,7 @@
          : "+m" (*dstfr), 						\
            "=a" (sts)							\
          :  "m" (data), 						\
-            "m" (cpu -> fpu.ctl | FPU_CTL_EX));				\
+            "m" (EX));				\
   }									\
   if (pop) FPU_INCTOP;							\
   break;								\
@@ -1097,7 +1101,7 @@
              : "=a" (sts)
              :  "m" (*srcfr), 
                 "m" (*srcfr2), 
-                "m" (cpu -> fpu.ctl | FPU_CTL_EX));
+                "m" (EX));
         FPU_UPDSTS (sts);
         if ((modrmbyte & 0x08) && (srcfr != &indefinite)) FPU_INCTOP;
         break;
@@ -1119,7 +1123,7 @@
              : "=m" (*dstfr), 
                "=a" (sts)
              :  "m" (data), 
-                "m" (cpu -> fpu.ctl | FPU_CTL_EX));
+                "m" (EX));
         FPU_UPDSTS (sts);
         FPU_DECTOP;						// mark that there's something there now
         break;
@@ -1135,7 +1139,7 @@
              : "=m" (data), 
                "=a" (sts)
              :  "m" (*srcfr), 
-                "m" (cpu -> fpu.ctl | FPU_CTL_EX));
+                "m" (EX));
         emmy_x86_x_writelinbig_wrap (cpu, 8, ladr, (uByte *)&data);
         FPU_UPDSTS (sts);
         break;
@@ -1153,7 +1157,7 @@
              : "=m" (data), 
                "=a" (sts)
              :  "m" (*srcfr), 
-                "m" (cpu -> fpu.ctl | FPU_CTL_EX));
+                "m" (EX));
         FDB((" -> %6.3f", data));
         emmy_x86_x_writelinbig_wrap (cpu, 8, ladr, (uByte *)&data);
         FPU_UPDSTS (sts);
@@ -1212,7 +1216,7 @@
        : "+m" (*dstfr), 						\
          "=a" (sts)							\
        :  "m" (*srcfr), 						\
-          "m" (cpu -> fpu.ctl | FPU_CTL_EX));				\
+          "m" (EX));				\
   if (pop) FPU_INCTOP;							\
   break;								\
 }
@@ -1227,7 +1231,7 @@
        : "+m" (*dstfr), 						\
          "=a" (sts)							\
        :  "m" (data), 							\
-          "m" (cpu -> fpu.ctl | FPU_CTL_EX));				\
+          "m" (EX));				\
   if (pop) FPU_INCTOP;							\
   break;								\
 }
@@ -1266,7 +1270,7 @@
                : "=a" (sts)
                :  "m" (*dstfr), 
                   "m" (*srcfr), 
-                  "m" (cpu -> fpu.ctl | FPU_CTL_EX));
+                  "m" (EX));
           if (pop) FPU_INCTOP;
           FPU_INCTOP;
           break;
@@ -1348,7 +1352,7 @@
                "=m" (tempfr)
              :  "m" (*srcfr), 
                 "m" (*srcfr2), 
-                "m" (cpu -> fpu.ctl | FPU_CTL_EX));
+                "m" (EX));
         FPU_UPDSTS (sts);
         if (srcfr != &indefinite) FPU_INCTOP;
         break;
@@ -1367,7 +1371,7 @@
                "=m" (tempfr)
              :  "m" (*srcfr), 
                 "m" (*srcfr2), 
-                "m" (cpu -> fpu.ctl | FPU_CTL_EX));
+                "m" (EX));
         FPU_UPDSTS (sts);
         if (srcfr != &indefinite) FPU_INCTOP;
         break;
@@ -1390,7 +1394,7 @@
              : "=a" (sts), 
                "=m" (cpu -> fpu.s[i])
              :  "m" (data), 
-                "m" (cpu -> fpu.ctl | FPU_CTL_EX));
+                "m" (EX));
         FPU_UPDSTS (sts);
         FPU_DECTOP;
         break;
@@ -1408,7 +1412,7 @@
              : "=a" (sts), 
                "=m" (data)
              :  "m" (*srcfr), 
-                "m" (cpu -> fpu.ctl | FPU_CTL_EX));
+                "m" (EX));
         writelword (ladr, 0, data);
         FPU_UPDSTS (sts);
         break;
@@ -1426,7 +1430,7 @@
              : "=a" (sts), 
                "=m" (data)
              :  "m" (*srcfr), 
-                "m" (cpu -> fpu.ctl | FPU_CTL_EX));
+                "m" (EX));
         writelword (ladr, 0, data);
         FPU_UPDSTS (sts);
         if (srcfr != &indefinite) FPU_INCTOP;
@@ -1446,7 +1450,7 @@
              : "=a" (sts), 
                "=m" (cpu -> fpu.s[i])
              :  "m" (data), 
-                "m" (cpu -> fpu.ctl | FPU_CTL_EX));
+                "m" (EX));
         FPU_UPDSTS (sts);
         FPU_DECTOP;
         break;
@@ -1465,7 +1469,7 @@
              : "=a" (sts), 
                "=m" (cpu -> fpu.s[i])
              :  "m" (data), 
-                "m" (cpu -> fpu.ctl | FPU_CTL_EX));
+                "m" (EX));
         FPU_UPDSTS (sts);
         FPU_DECTOP;
         break;
@@ -1483,7 +1487,7 @@
              : "=a" (sts), 
                "=m" (data)
              :  "m" (*srcfr), 
-                "m" (cpu -> fpu.ctl | FPU_CTL_EX));
+                "m" (EX));
         emmy_x86_x_writelinbig_wrap (cpu, 10, ladr, (uByte *)&data);
         FPU_UPDSTS (sts);
         if (srcfr != &indefinite) FPU_INCTOP;
@@ -1502,7 +1506,7 @@
              : "=a" (sts), 
                "=m" (data)
              :  "m" (*srcfr), 
-                "m" (cpu -> fpu.ctl | FPU_CTL_EX));
+                "m" (EX));
         emmy_x86_x_writelinbig_wrap (cpu, 8, ladr, (uByte *)&data);
         FPU_UPDSTS (sts);
         if (srcfr != &indefinite) FPU_INCTOP;

=== modified file 'emmy_x86_i_macs.h'
--- emmy_x86_i_macs.h	2008-06-07 04:44:17 +0000
+++ emmy_x86_i_macs.h	2008-06-07 05:14:50 +0000
@@ -766,7 +766,7 @@
         if (dividend > divisor) exception (EXC_DE, 0, 0, 0, 0, __LINE__);	\
         asm ("idivb %1\n\t"							\
              : "+a" (AX) 							\
-             :  "g" (srcdata) 							\
+             :  "c" (srcdata) /* GCC chooses %sil (?!) if this constraint is "g". */ \
              : "cc");								\
       }										\
       if (sizeof srcdata == 2) {						\

=== modified file 'emmy_x86_x_xlate.c'
--- emmy_x86_x_xlate.c	2008-06-07 04:44:17 +0000
+++ emmy_x86_x_xlate.c	2008-06-07 05:14:50 +0000
@@ -390,7 +390,7 @@
 
 extern uByte emmy_x86_x_gpf_0[];
 
-static void post_gpf_0_wrap (void)
+void post_gpf_0_wrap (void)
 
 {
   asm ("	.p2align 2\n"

