=== 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"