From 754298c5502fd14ec608fa5360c2c736b36cfd51 Mon Sep 17 00:00:00 2001 From: Anselm Levskaya Date: Sat, 17 Dec 2011 04:22:50 -0800 Subject: [PATCH] more notes --- cpux86-ta.js | 303 +++++++++++++++++++++---------------- linuxstart-20110820.tar.gz | Bin 0 -> 19211 bytes 2 files changed, 175 insertions(+), 128 deletions(-) create mode 100644 linuxstart-20110820.tar.gz diff --git a/cpux86-ta.js b/cpux86-ta.js index 9656f92..579a333 100644 --- a/cpux86-ta.js +++ b/cpux86-ta.js @@ -3,6 +3,49 @@ Opcode ref http://ref.x86asm.net/coder32.html#xC4 +http://en.wikipedia.org/wiki/X86 +http://en.wikipedia.org/wiki/Control_register +http://en.wikipedia.org/wiki/X86_assembly_language + +http://en.wikipedia.org/wiki/Translation_lookaside_buffer + +http://bellard.org/jslinux/tech.html + +=================================================================================================== +CPU Emulation + +Some of the code is inspired from my x86 dynamic translator present in QEMU, but there are important differences because here it is an interpreter. The CPU is close to a 486 compatible x86 without FPU. The lack of FPU is not a problem when running Linux as Operating System because it contains a FPU emulator. In order to be able to run Linux, a complete MMU is implemented. The exact restrictions of the emulated CPU are: +No FPU/MMX/SSE +No segment limit and right checks when accessing memory (Linux does not rely on them for memory protection, so it is not an issue. The x86 emulator of QEMU has the same restriction). +No single-stepping +I added some tricks which are not present in QEMU to be more precise when emulating unaligned load/stores at page boundaries. The condition code emulation is also more efficient than the one in QEMU. + +=================================================================================================== + +Devices + +Currently there is no synchronization between the PIT frequency and the real time, so there is a variable drift between the time returned by Linux (try the "date" command) and the real time. +The UART (serial port) does not support FIFO mode. Perhaps it could help to improve the display speed. + +There is no network emulation at this point. + +A clipboard device (seen as /dev/clipboard in the emulator) was added to allow exchange of data between the emulator and the outside world. + + + +Javascript terminal + +Although I could have reused the excellent termlib, I decided to write my own because I was curious to see how it could be done. The main problem is the key handling which is different among browsers and OSes, as described here. +Linux distribution + + + +I compiled a 2.6.20 Linux kernel (I guess any other version would work provided there is still an FPU emulator). The Linux kernel configuration, patch and the source code of the Linux starter (kind of BIOS) are available: linuxstart-20110820.tar.gz. +The disk image is just a ram disk image loaded at boot time. It contains a filesystem generated with Buildroot containing BusyBox. I added my toy C compiler TinyCC and my unfinished but usable emacs clone QEmacs. There is also a small MS-DOS .COM launcher I use to test the 16 bit emulation with a tiny .COM program to compute pi and a small self-assembling assembler for MS-DOS. + + + + */ var aa = [1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1]; @@ -1396,7 +1439,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) { a = regs[0] & 0xffff; b &= 0xff; if ((a >> 8) >= b) - Dc(0); + blow_up_errcode0(0); q = (a / b) >> 0; r = (a % b); Wb(0, (q & 0xff) | (r << 8)); @@ -1406,10 +1449,10 @@ CPU_X86.prototype.exec_internal = function(ua, va) { a = (regs[0] << 16) >> 16; b = (b << 24) >> 24; if (b == 0) - Dc(0); + blow_up_errcode0(0); q = (a / b) >> 0; if (((q << 24) >> 24) != q) - Dc(0); + blow_up_errcode0(0); r = (a % b); Wb(0, (q & 0xff) | (r << 8)); } @@ -1418,7 +1461,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) { a = (regs[2] << 16) | (regs[0] & 0xffff); b &= 0xffff; if ((a >>> 16) >= b) - Dc(0); + blow_up_errcode0(0); q = (a / b) >> 0; r = (a % b); Wb(0, q); @@ -1429,10 +1472,10 @@ CPU_X86.prototype.exec_internal = function(ua, va) { a = (regs[2] << 16) | (regs[0] & 0xffff); b = (b << 16) >> 16; if (b == 0) - Dc(0); + blow_up_errcode0(0); q = (a / b) >> 0; if (((q << 16) >> 16) != q) - Dc(0); + blow_up_errcode0(0); r = (a % b); Wb(0, q); Wb(2, r); @@ -1443,7 +1486,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) { Jc = Jc >>> 0; b = b >>> 0; if (Ic >= b) { - Dc(0); + blow_up_errcode0(0); } if (Ic >= 0 && Ic <= 0x200000) { a = Ic * 4294967296 + Jc; @@ -1485,11 +1528,11 @@ CPU_X86.prototype.exec_internal = function(ua, va) { Nc ^= Mc; if (Nc) { if ((q >>> 0) > 0x80000000) - Dc(0); + blow_up_errcode0(0); q = (-q) >> 0; } else { if ((q >>> 0) >= 0x80000000) - Dc(0); + blow_up_errcode0(0); } if (Mc) { Ma = (-Ma) >> 0; @@ -2019,7 +2062,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) { cpu.cc_dst2 = _dst2; throw {intno: intno, error_code: error_code}; } - function Dc(intno) { + function blow_up_errcode0(intno) { blow_up(intno, 0); } @@ -2107,7 +2150,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) { case 0x65: { if ((n + 1) > 15) - Dc(6); + blow_up_errcode0(6); fa = (Nb + (n++)) >> 0; b = (((Ua = _tlb_read_[fa >>> 12]) == -1) ? db() : phys_mem8[fa ^ Ua]); } @@ -2120,7 +2163,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) { } { if ((n + 1) > 15) - Dc(6); + blow_up_errcode0(6); fa = (Nb + (n++)) >> 0; b = (((Ua = _tlb_read_[fa >>> 12]) == -1) ? db() : phys_mem8[fa ^ Ua]); } @@ -2267,7 +2310,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) { case 0xd5: n++; if (n > 15) - Dc(6); + blow_up_errcode0(6); break Fd; case 0xb8: case 0xb9: @@ -2291,7 +2334,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) { case 0xe8: n += Ed; if (n > 15) - Dc(6); + blow_up_errcode0(6); break Fd; case 0x88: case 0x89: @@ -2358,7 +2401,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) { { { if ((n + 1) > 15) - Dc(6); + blow_up_errcode0(6); fa = (Nb + (n++)) >> 0; Ea = (((Ua = _tlb_read_[fa >>> 12]) == -1) ? db() : phys_mem8[fa ^ Ua]); } @@ -2380,7 +2423,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) { case 0x04: { if ((n + 1) > 15) - Dc(6); + blow_up_errcode0(6); fa = (Nb + (n++)) >> 0; Dd = (((Ua = _tlb_read_[fa >>> 12]) == -1) ? db() : phys_mem8[fa ^ Ua]); } @@ -2425,7 +2468,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) { } } if (n > 15) - Dc(6); + blow_up_errcode0(6); } break Fd; case 0xa0: @@ -2437,7 +2480,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) { else n += 4; if (n > 15) - Dc(6); + blow_up_errcode0(6); break Fd; case 0xc6: case 0x80: @@ -2449,7 +2492,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) { { { if ((n + 1) > 15) - Dc(6); + blow_up_errcode0(6); fa = (Nb + (n++)) >> 0; Ea = (((Ua = _tlb_read_[fa >>> 12]) == -1) ? db() : phys_mem8[fa ^ Ua]); } @@ -2471,7 +2514,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) { case 0x04: { if ((n + 1) > 15) - Dc(6); + blow_up_errcode0(6); fa = (Nb + (n++)) >> 0; Dd = (((Ua = _tlb_read_[fa >>> 12]) == -1) ? db() : phys_mem8[fa ^ Ua]); } @@ -2516,11 +2559,11 @@ CPU_X86.prototype.exec_internal = function(ua, va) { } } if (n > 15) - Dc(6); + blow_up_errcode0(6); } n++; if (n > 15) - Dc(6); + blow_up_errcode0(6); break Fd; case 0xc7: case 0x81: @@ -2528,7 +2571,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) { { { if ((n + 1) > 15) - Dc(6); + blow_up_errcode0(6); fa = (Nb + (n++)) >> 0; Ea = (((Ua = _tlb_read_[fa >>> 12]) == -1) ? db() : phys_mem8[fa ^ Ua]); } @@ -2550,7 +2593,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) { case 0x04: { if ((n + 1) > 15) - Dc(6); + blow_up_errcode0(6); fa = (Nb + (n++)) >> 0; Dd = (((Ua = _tlb_read_[fa >>> 12]) == -1) ? db() : phys_mem8[fa ^ Ua]); } @@ -2595,17 +2638,17 @@ CPU_X86.prototype.exec_internal = function(ua, va) { } } if (n > 15) - Dc(6); + blow_up_errcode0(6); } n += Ed; if (n > 15) - Dc(6); + blow_up_errcode0(6); break Fd; case 0xf6: { { if ((n + 1) > 15) - Dc(6); + blow_up_errcode0(6); fa = (Nb + (n++)) >> 0; Ea = (((Ua = _tlb_read_[fa >>> 12]) == -1) ? db() : phys_mem8[fa ^ Ua]); } @@ -2627,7 +2670,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) { case 0x04: { if ((n + 1) > 15) - Dc(6); + blow_up_errcode0(6); fa = (Nb + (n++)) >> 0; Dd = (((Ua = _tlb_read_[fa >>> 12]) == -1) ? db() : phys_mem8[fa ^ Ua]); } @@ -2672,20 +2715,20 @@ CPU_X86.prototype.exec_internal = function(ua, va) { } } if (n > 15) - Dc(6); + blow_up_errcode0(6); } Ja = (Ea >> 3) & 7; if (Ja == 0) { n++; if (n > 15) - Dc(6); + blow_up_errcode0(6); } break Fd; case 0xf7: { { if ((n + 1) > 15) - Dc(6); + blow_up_errcode0(6); fa = (Nb + (n++)) >> 0; Ea = (((Ua = _tlb_read_[fa >>> 12]) == -1) ? db() : phys_mem8[fa ^ Ua]); } @@ -2707,7 +2750,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) { case 0x04: { if ((n + 1) > 15) - Dc(6); + blow_up_errcode0(6); fa = (Nb + (n++)) >> 0; Dd = (((Ua = _tlb_read_[fa >>> 12]) == -1) ? db() : phys_mem8[fa ^ Ua]); } @@ -2752,40 +2795,40 @@ CPU_X86.prototype.exec_internal = function(ua, va) { } } if (n > 15) - Dc(6); + blow_up_errcode0(6); } Ja = (Ea >> 3) & 7; if (Ja == 0) { n += Ed; if (n > 15) - Dc(6); + blow_up_errcode0(6); } break Fd; case 0xea: case 0x9a: n += 2 + Ed; if (n > 15) - Dc(6); + blow_up_errcode0(6); break Fd; case 0xc2: case 0xca: n += 2; if (n > 15) - Dc(6); + blow_up_errcode0(6); break Fd; case 0xc8: n += 3; if (n > 15) - Dc(6); + blow_up_errcode0(6); break Fd; case 0xd6: case 0xf1: default: - Dc(6); + blow_up_errcode0(6); case 0x0f: { if ((n + 1) > 15) - Dc(6); + blow_up_errcode0(6); fa = (Nb + (n++)) >> 0; b = (((Ua = _tlb_read_[fa >>> 12]) == -1) ? db() : phys_mem8[fa ^ Ua]); } @@ -2824,7 +2867,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) { case 0x8f: n += Ed; if (n > 15) - Dc(6); + blow_up_errcode0(6); break Fd; case 0x90: case 0x91: @@ -2888,7 +2931,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) { { { if ((n + 1) > 15) - Dc(6); + blow_up_errcode0(6); fa = (Nb + (n++)) >> 0; Ea = (((Ua = _tlb_read_[fa >>> 12]) == -1) ? db() : phys_mem8[fa ^ Ua]); } @@ -2910,7 +2953,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) { case 0x04: { if ((n + 1) > 15) - Dc(6); + blow_up_errcode0(6); fa = (Nb + (n++)) >> 0; Dd = (((Ua = _tlb_read_[fa >>> 12]) == -1) ? db() : phys_mem8[fa ^ Ua]); } @@ -2955,7 +2998,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) { } } if (n > 15) - Dc(6); + blow_up_errcode0(6); } break Fd; case 0xa4: @@ -2964,7 +3007,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) { { { if ((n + 1) > 15) - Dc(6); + blow_up_errcode0(6); fa = (Nb + (n++)) >> 0; Ea = (((Ua = _tlb_read_[fa >>> 12]) == -1) ? db() : phys_mem8[fa ^ Ua]); } @@ -2986,7 +3029,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) { case 0x04: { if ((n + 1) > 15) - Dc(6); + blow_up_errcode0(6); fa = (Nb + (n++)) >> 0; Dd = (((Ua = _tlb_read_[fa >>> 12]) == -1) ? db() : phys_mem8[fa ^ Ua]); } @@ -3031,11 +3074,11 @@ CPU_X86.prototype.exec_internal = function(ua, va) { } } if (n > 15) - Dc(6); + blow_up_errcode0(6); } n++; if (n > 15) - Dc(6); + blow_up_errcode0(6); break Fd; case 0x04: case 0x05: @@ -3153,7 +3196,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) { case 0xc6: case 0xc7: default: - Dc(6); + blow_up_errcode0(6); } break; } @@ -4276,7 +4319,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) { if (cpu.eflags & 0x00020000) { Sa = (cpu.eflags >> 12) & 3; if (Sa != 3) - Dc(13); + blow_up_errcode0(13); } af(je, 1, 0); } else { @@ -4342,7 +4385,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) { function qf(je, pf) { var ga, Ea, Ga, selector; if (!(cpu.cr0 & (1 << 0)) || (cpu.eflags & 0x00020000)) - Dc(6); + blow_up_errcode0(6); Ea = phys_mem8[Kb++]; Ga = (Ea >> 3) & 7; if ((Ea >> 6) == 3) { @@ -4412,7 +4455,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) { function tf() { var Ea, ga, Ha, Fa; if (!(cpu.cr0 & (1 << 0)) || (cpu.eflags & 0x00020000)) - Dc(6); + blow_up_errcode0(6); Ea = phys_mem8[Kb++]; if ((Ea >> 6) == 3) { Fa = Ea & 7; @@ -4459,7 +4502,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) { function vf(base) { var wf, xf; if (base == 0) - Dc(0); + blow_up_errcode0(0); wf = regs[0] & 0xff; xf = (wf / base) & -1; wf = (wf % base); @@ -4569,7 +4612,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) { var Ea, ga, Ha, Ia; Ea = phys_mem8[Kb++]; if ((Ea >> 3) == 3) - Dc(6); + blow_up_errcode0(6); fa = Pb(Ea); ga = kb(); fa = (fa + 4) & -1; @@ -4577,13 +4620,13 @@ CPU_X86.prototype.exec_internal = function(ua, va) { Ga = (Ea >> 3) & 7; Ia = regs[Ga]; if (Ia < ga || Ia > Ha) - Dc(5); + blow_up_errcode0(5); } function If() { var Ea, ga, Ha, Ia; Ea = phys_mem8[Kb++]; if ((Ea >> 3) == 3) - Dc(6); + blow_up_errcode0(6); fa = Pb(Ea); ga = (ib() << 16) >> 16; fa = (fa + 2) & -1; @@ -4591,7 +4634,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) { Ga = (Ea >> 3) & 7; Ia = (regs[Ga] << 16) >> 16; if (Ia < ga || Ia > Ha) - Dc(5); + blow_up_errcode0(5); } function Jf() { var ga, Ha, Ga; @@ -4731,7 +4774,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) { var ga, Ha, Ea; Ea = phys_mem8[Kb++]; if ((Ea >> 3) == 3) - Dc(6); + blow_up_errcode0(6); fa = Pb(Ea); ga = kb(); fa += 4; @@ -4743,7 +4786,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) { var ga, Ha, Ea; Ea = phys_mem8[Kb++]; if ((Ea >> 3) == 3) - Dc(6); + blow_up_errcode0(6); fa = Pb(Ea); ga = ib(); fa += 2; @@ -4755,7 +4798,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) { var Xf, Yf, Zf, ag, Sa, ga; Sa = (cpu.eflags >> 12) & 3; if (cpu.cpl > Sa) - Dc(13); + blow_up_errcode0(13); if (Da & 0x0080) Xf = 0xffff; else @@ -4784,7 +4827,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) { var Xf, cg, Sb, ag, Zf, Sa, ga; Sa = (cpu.eflags >> 12) & 3; if (cpu.cpl > Sa) - Dc(13); + blow_up_errcode0(13); if (Da & 0x0080) Xf = 0xffff; else @@ -4983,7 +5026,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) { var Xf, Yf, Zf, ag, Sa, ga; Sa = (cpu.eflags >> 12) & 3; if (cpu.cpl > Sa) - Dc(13); + blow_up_errcode0(13); if (Da & 0x0080) Xf = 0xffff; else @@ -5012,7 +5055,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) { var Xf, cg, Sb, ag, Zf, Sa, ga; Sa = (cpu.eflags >> 12) & 3; if (cpu.cpl > Sa) - Dc(13); + blow_up_errcode0(13); if (Da & 0x0080) Xf = 0xffff; else @@ -5211,7 +5254,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) { var Xf, Yf, Zf, ag, Sa, ga; Sa = (cpu.eflags >> 12) & 3; if (cpu.cpl > Sa) - Dc(13); + blow_up_errcode0(13); if (Da & 0x0080) Xf = 0xffff; else @@ -5240,7 +5283,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) { var Xf, cg, Sb, ag, Zf, Sa, ga; Sa = (cpu.eflags >> 12) & 3; if (cpu.cpl > Sa) - Dc(13); + blow_up_errcode0(13); if (Da & 0x0080) Xf = 0xffff; else @@ -5799,7 +5842,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) { Ea = phys_mem8[Kb++]; Ga = (Ea >> 3) & 7; if (Ga >= 6 || Ga == 1) - Dc(6); + blow_up_errcode0(6); if ((Ea >> 6) == 3) { ga = regs[Ea & 7] & 0xffff; } else { @@ -5812,7 +5855,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) { Ea = phys_mem8[Kb++]; Ga = (Ea >> 3) & 7; if (Ga >= 6) - Dc(6); + blow_up_errcode0(6); ga = cpu.segs[Ga].selector; if ((Ea >> 6) == 3) { if ((((Da >> 8) & 1) ^ 1)) { @@ -6333,7 +6376,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) { Ec(ga); break; default: - Dc(6); + blow_up_errcode0(6); } break Fd; case 0xf7: @@ -6419,7 +6462,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) { regs[2] = Ma; break; default: - Dc(6); + blow_up_errcode0(6); } break Fd; //Rotate and Shift ops @@ -6704,7 +6747,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) { case 0x9c: Sa = (cpu.eflags >> 12) & 3; if ((cpu.eflags & 0x00020000) && Sa != 3) - Dc(13); + blow_up_errcode0(13); ga = id() & ~(0x00020000 | 0x00010000); if ((((Da >> 8) & 1) ^ 1)) { xd(ga); @@ -6719,7 +6762,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) { case 0x9d: Sa = (cpu.eflags >> 12) & 3; if ((cpu.eflags & 0x00020000) && Sa != 3) - Dc(13); + blow_up_errcode0(13); if ((((Da >> 8) & 1) ^ 1)) { ga = Ad(); Bd(); @@ -6757,7 +6800,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) { case 0x8d: Ea = phys_mem8[Kb++]; if ((Ea >> 6) == 3) - Dc(6); + blow_up_errcode0(6); Da = (Da & ~0x000f) | (6 + 1); regs[(Ea >> 3) & 7] = Pb(Ea); break Fd; @@ -6788,7 +6831,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) { } break; default: - Dc(6); + blow_up_errcode0(6); } break Fd; case 0xff: @@ -6889,7 +6932,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) { case 3: case 5: if ((Ea >> 6) == 3) - Dc(6); + blow_up_errcode0(6); fa = Pb(Ea); ga = kb(); fa = (fa + 4) >> 0; @@ -6900,7 +6943,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) { Oe(Ha, ga); break; default: - Dc(6); + blow_up_errcode0(6); } break Fd; case 0xeb: @@ -7173,7 +7216,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) { case 0xcd: ga = phys_mem8[Kb++]; if ((cpu.eflags & 0x00020000) && ((cpu.eflags >> 12) & 3) != 3) - Dc(13); + blow_up_errcode0(13); Ha = (eip + Kb - Mb); Ae(ga, 1, 0, Ha, 0); break Fd; @@ -7210,13 +7253,13 @@ CPU_X86.prototype.exec_internal = function(ua, va) { case 0xfa: Sa = (cpu.eflags >> 12) & 3; if (cpu.cpl > Sa) - Dc(13); + blow_up_errcode0(13); cpu.eflags &= ~0x00000200; break Fd; case 0xfb: Sa = (cpu.eflags >> 12) & 3; if (cpu.cpl > Sa) - Dc(13); + blow_up_errcode0(13); cpu.eflags |= 0x00000200; { if (cpu.hard_irq != 0 && (cpu.eflags & 0x00000200)) @@ -7234,7 +7277,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) { break Fd; case 0xf4: if (cpu.cpl != 0) - Dc(13); + blow_up_errcode0(13); cpu.halted = 1; La = 257; break Bg; @@ -7305,7 +7348,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) { case 0xde: case 0xdf: if (cpu.cr0 & ((1 << 2) | (1 << 3))) { - Dc(7); + blow_up_errcode0(7); } Ea = phys_mem8[Kb++]; Ga = (Ea >> 3) & 7; @@ -7322,7 +7365,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) { case 0xe4: Sa = (cpu.eflags >> 12) & 3; if (cpu.cpl > Sa) - Dc(13); + blow_up_errcode0(13); ga = phys_mem8[Kb++]; Vb(0, cpu.ld8_port(ga)); { @@ -7333,7 +7376,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) { case 0xe5: Sa = (cpu.eflags >> 12) & 3; if (cpu.cpl > Sa) - Dc(13); + blow_up_errcode0(13); ga = phys_mem8[Kb++]; regs[0] = cpu.ld32_port(ga); { @@ -7344,7 +7387,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) { case 0xe6: Sa = (cpu.eflags >> 12) & 3; if (cpu.cpl > Sa) - Dc(13); + blow_up_errcode0(13); ga = phys_mem8[Kb++]; cpu.st8_port(ga, regs[0] & 0xff); { @@ -7355,7 +7398,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) { case 0xe7: Sa = (cpu.eflags >> 12) & 3; if (cpu.cpl > Sa) - Dc(13); + blow_up_errcode0(13); ga = phys_mem8[Kb++]; cpu.st32_port(ga, regs[0]); { @@ -7366,7 +7409,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) { case 0xec: Sa = (cpu.eflags >> 12) & 3; if (cpu.cpl > Sa) - Dc(13); + blow_up_errcode0(13); Vb(0, cpu.ld8_port(regs[2] & 0xffff)); { if (cpu.hard_irq != 0 && (cpu.eflags & 0x00000200)) @@ -7376,7 +7419,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) { case 0xed: Sa = (cpu.eflags >> 12) & 3; if (cpu.cpl > Sa) - Dc(13); + blow_up_errcode0(13); regs[0] = cpu.ld32_port(regs[2] & 0xffff); { if (cpu.hard_irq != 0 && (cpu.eflags & 0x00000200)) @@ -7386,7 +7429,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) { case 0xee: Sa = (cpu.eflags >> 12) & 3; if (cpu.cpl > Sa) - Dc(13); + blow_up_errcode0(13); cpu.st8_port(regs[2] & 0xffff, regs[0] & 0xff); { if (cpu.hard_irq != 0 && (cpu.eflags & 0x00000200)) @@ -7396,7 +7439,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) { case 0xef: Sa = (cpu.eflags >> 12) & 3; if (cpu.cpl > Sa) - Dc(13); + blow_up_errcode0(13); cpu.st32_port(regs[2] & 0xffff, regs[0]); { if (cpu.hard_irq != 0 && (cpu.eflags & 0x00000200)) @@ -7428,9 +7471,13 @@ CPU_X86.prototype.exec_internal = function(ua, va) { break Fd; case 0xd6: case 0xf1: - Dc(6); + blow_up_errcode0(6); break; - /* TWO BYTE CODE INSTRUCTIONS BEGIN WITH 0F : 0F xx */ + + /* + TWO BYTE CODE INSTRUCTIONS BEGIN WITH 0F : 0F xx + ===================================================================================================== + */ case 0x0f: b = phys_mem8[Kb++]; switch (b) { @@ -7556,7 +7603,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) { break Fd; case 0x00: if (!(cpu.cr0 & (1 << 0)) || (cpu.eflags & 0x00020000)) - Dc(6); + blow_up_errcode0(6); Ea = phys_mem8[Kb++]; Ja = (Ea >> 3) & 7; switch (Ja) { @@ -7576,7 +7623,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) { case 2: case 3: if (cpu.cpl != 0) - Dc(13); + blow_up_errcode0(13); if ((Ea >> 6) == 3) { ga = regs[Ea & 7] & 0xffff; } else { @@ -7599,7 +7646,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) { sf(ga, Ja & 1); break; default: - Dc(6); + blow_up_errcode0(6); } break Fd; case 0x01: @@ -7609,9 +7656,9 @@ CPU_X86.prototype.exec_internal = function(ua, va) { case 2: case 3: if ((Ea >> 6) == 3) - Dc(6); + blow_up_errcode0(6); if (this.cpl != 0) - Dc(13); + blow_up_errcode0(13); fa = Pb(Ea); ga = ib(); fa += 2; @@ -7626,14 +7673,14 @@ CPU_X86.prototype.exec_internal = function(ua, va) { break; case 7: if (this.cpl != 0) - Dc(13); + blow_up_errcode0(13); if ((Ea >> 6) == 3) - Dc(6); + blow_up_errcode0(6); fa = Pb(Ea); cpu.tlb_flush_page(fa & -4096); break; default: - Dc(6); + blow_up_errcode0(6); } break Fd; case 0x02: @@ -7642,10 +7689,10 @@ CPU_X86.prototype.exec_internal = function(ua, va) { break Fd; case 0x20: if (cpu.cpl != 0) - Dc(13); + blow_up_errcode0(13); Ea = phys_mem8[Kb++]; if ((Ea >> 6) != 3) - Dc(6); + blow_up_errcode0(6); Ga = (Ea >> 3) & 7; switch (Ga) { case 0: @@ -7661,16 +7708,16 @@ CPU_X86.prototype.exec_internal = function(ua, va) { ga = cpu.cr4; break; default: - Dc(6); + blow_up_errcode0(6); } regs[Ea & 7] = ga; break Fd; case 0x22: if (cpu.cpl != 0) - Dc(13); + blow_up_errcode0(13); Ea = phys_mem8[Kb++]; if ((Ea >> 6) != 3) - Dc(6); + blow_up_errcode0(6); Ga = (Ea >> 3) & 7; ga = regs[Ea & 7]; switch (Ga) { @@ -7687,24 +7734,24 @@ CPU_X86.prototype.exec_internal = function(ua, va) { Td(ga); break; default: - Dc(6); + blow_up_errcode0(6); } break Fd; case 0x06: if (cpu.cpl != 0) - Dc(13); + blow_up_errcode0(13); Pd(cpu.cr0 & ~(1 << 3)); break Fd; case 0x23: if (cpu.cpl != 0) - Dc(13); + blow_up_errcode0(13); Ea = phys_mem8[Kb++]; if ((Ea >> 6) != 3) - Dc(6); + blow_up_errcode0(6); Ga = (Ea >> 3) & 7; ga = regs[Ea & 7]; if (Ga == 4 || Ga == 5) - Dc(6); + blow_up_errcode0(6); break Fd; case 0xb2: case 0xb4: @@ -7803,7 +7850,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) { } break; default: - Dc(6); + blow_up_errcode0(6); } break Fd; case 0xa3: @@ -7863,7 +7910,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) { break Fd; case 0x31: if ((cpu.cr4 & (1 << 2)) && cpu.cpl != 0) - Dc(13); + blow_up_errcode0(13); ga = md(); regs[0] = ga >>> 0; regs[2] = (ga / 0x100000000) >>> 0; @@ -8134,7 +8181,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) { case 0xfe: case 0xff: default: - Dc(6); + blow_up_errcode0(6); } break; default: @@ -8465,7 +8512,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) { Gc(ga); break; default: - Dc(6); + blow_up_errcode0(6); } break Fd; case 0x1c1: @@ -8592,7 +8639,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) { case 0x18d: Ea = phys_mem8[Kb++]; if ((Ea >> 6) == 3) - Dc(6); + blow_up_errcode0(6); Da = (Da & ~0x000f) | (6 + 1); Wb((Ea >> 3) & 7, Pb(Ea)); break Fd; @@ -8653,7 +8700,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) { case 3: case 5: if ((Ea >> 6) == 3) - Dc(6); + blow_up_errcode0(6); fa = Pb(Ea); ga = ib(); fa = (fa + 2) >> 0; @@ -8664,7 +8711,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) { Oe(Ha, ga); break; default: - Dc(6); + blow_up_errcode0(6); } break Fd; case 0x1eb: @@ -8747,7 +8794,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) { case 0x1e5: Sa = (cpu.eflags >> 12) & 3; if (cpu.cpl > Sa) - Dc(13); + blow_up_errcode0(13); ga = phys_mem8[Kb++]; Wb(0, cpu.ld16_port(ga)); { @@ -8758,7 +8805,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) { case 0x1e7: Sa = (cpu.eflags >> 12) & 3; if (cpu.cpl > Sa) - Dc(13); + blow_up_errcode0(13); ga = phys_mem8[Kb++]; cpu.st16_port(ga, regs[0] & 0xffff); { @@ -8769,7 +8816,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) { case 0x1ed: Sa = (cpu.eflags >> 12) & 3; if (cpu.cpl > Sa) - Dc(13); + blow_up_errcode0(13); Wb(0, cpu.ld16_port(regs[2] & 0xffff)); { if (cpu.hard_irq != 0 && (cpu.eflags & 0x00000200)) @@ -8779,7 +8826,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) { case 0x1ef: Sa = (cpu.eflags >> 12) & 3; if (cpu.cpl > Sa) - Dc(13); + blow_up_errcode0(13); cpu.st16_port(regs[2] & 0xffff, regs[0] & 0xffff); { if (cpu.hard_irq != 0 && (cpu.eflags & 0x00000200)) @@ -8903,7 +8950,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) { case 0x1d6: case 0x1f1: default: - Dc(6); + blow_up_errcode0(6); case 0x10f: b = phys_mem8[Kb++]; b |= 0x0100; @@ -9084,7 +9131,7 @@ CPU_X86.prototype.exec_internal = function(ua, va) { } break; default: - Dc(6); + blow_up_errcode0(6); } break Fd; case 0x1a3: @@ -9299,20 +9346,20 @@ CPU_X86.prototype.exec_internal = function(ua, va) { case 0x1bf: case 0x1c0: default: - Dc(6); + blow_up_errcode0(6); } break; } } } - } while (--Ka); + } while (--Ka); //End Giant Core DO WHILE Execution Loop this.cycle_count += (ua - Ka); - this.eip = (eip + Kb - Mb); - this.cc_src = _src; - this.cc_dst = _dst; - this.cc_op = _op; - this.cc_op2 = _op2; - this.cc_dst2 = _dst2; + this.eip = (eip + Kb - Mb); + this.cc_src = _src; + this.cc_dst = _dst; + this.cc_op = _op; + this.cc_op2 = _op2; + this.cc_dst2 = _dst2; return La; }; diff --git a/linuxstart-20110820.tar.gz b/linuxstart-20110820.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..07887d1960777d518af0f20e31a3113e7a010f20 GIT binary patch literal 19211 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 mTBc=Mre#{DWm=|XTBc=Mre#{DWm=~1oBkJ