- the patch file is no longer needed

This commit is contained in:
Volker Ruppert 2002-06-14 16:32:10 +00:00
parent 5d7c6627fd
commit 506d6ce6d9
2 changed files with 0 additions and 289 deletions

View File

@ -1,245 +0,0 @@
----------------------------------------------------------------------
Patch name: patch.pcibios
Author: Volker Ruppert <Volker.Ruppert@t-online.de>
Date: Sun May 12 17:13:00 CEST 2002
Detailed description:
This patch adds the most important functions of the protected mode
PCI BIOS. Linux (kernel 2.2.18) is able to use the new features.
Here is the list of changes:
* BIOS32 data structure added
* BIOS32 and protected mode PCI BIOS functions added. The BIOS32 function
returns a pointer to the PCI BIOS entry point when the service $PCI is
requested and the PCI hardware is present.
* Supported 32 bit functions: installation check, find pci device,
read configuration byte/word/dword, write configuration byte/word/dword
* real mode PCI BIOS installation check rewritten in assembler to use 32 bit
registers for the protected mode entry point and the 'PCI ' signature.
TODO:
* add missing functions of the PCI BIOS (if necessary)
* add missing features of the i440FX PCI bridge
* implement the other parts of the i440FX chipset (PCI-to-ISA bridge,
PCI IDE controller, USB controller)
The changes are present in CVS now (June 4th).
Patch was created with:
diff -u
Apply patch to what version:
cvs checked out on DATE
Instructions:
To patch, go to main bochs directory.
Type "patch -p0 < THIS_PATCH_FILE".
----------------------------------------------------------------------
--- ../bochs/bios/rombios.c Sat May 11 15:43:44 2002
+++ bios/rombios.c Sat May 11 16:21:51 2002
@@ -5208,14 +5208,6 @@
SetCF(iret_addr.flags);
} else {
switch (regs.u.r8.al) {
- case 0x01: // Installation check
- regs.u.r8.ah = 0;
- regs.u.r8.al = 1;
- regs.u.r8.bh = 0x02;
- regs.u.r8.bl = 0x10;
- regs.u.r8.cl = 0;
- ClearCF(iret_addr.flags);
- break;
case 0x09: // Read configuration word
setPCIaddr(regs.u.r8.bh, regs.u.r8.bl, (Bit8u)(regs.u.r16.di & 0xfc));
regs.u.r16.cx = inw(0x0cfc + (regs.u.r16.di & 0x0002));
@@ -9082,6 +9074,178 @@
pop ax
iret
+#if BX_PCIBIOS
+use32 386
+.align 16
+bios32_structure:
+ db 0x5f, 0x33, 0x32, 0x5f ;; "_32_" signature
+ dw bios32_entry_point, 0xf ;; 32 bit physical address
+ db 0 ;; revision level
+ db 1 ;; length in paragraphs
+ db ~(((((bios32_entry_point >> 8) + (bios32_entry_point & 0xff)) & 0xff) \
+ + 0x32) & 0xff)
+ db 0,0,0,0,0 ;; reserved
+
+.align 16
+bios32_entry_point:
+ pushf
+ cmp eax, #0x49435024
+ jne unknown_service
+ mov eax, #0x80000000
+ mov dx, #0x0cf8
+ out dx, eax
+ mov dx, #0x0cfc
+ in eax, dx
+ cmp eax, #0x12378086
+ jne unknown_service
+ mov ebx, #0x000f0000
+ mov ecx, #0
+ mov edx, #pcibios_protected
+ xor al, al
+ jmp bios32_end
+unknown_service:
+ mov al, #0x80
+bios32_end:
+ popf
+ retf
+
+.align 16
+pcibios_protected:
+ pushf
+ cli
+ cmp al, #0x01 ;; installation check
+ jne check_f02
+ mov bx, #0x0210
+ mov cx, #0
+ mov edx, #0x20494350
+ mov al, #0x01
+ jmp pcibios_ok
+check_f02: ;; find pci device
+ cmp al, #0x02
+ jne check_f08
+ shl ecx, #16
+ or ecx, edx
+ mov bx, #0x0000
+ mov di, #0x00
+pcidev_loop:
+ call pcibios_select_reg
+ mov dx, #0x0cfc
+ in eax, dx
+ cmp eax, ecx
+ jne pcidev_next
+ cmp si, #0
+ je pcibios_ok
+ dec si
+pcidev_next:
+ inc bx
+ cmp bx, #0x0100
+ jnb pcidev_loop
+ mov ah, #0x86
+ jmp pcibios_fail
+check_f08: ;; read configuration byte
+ cmp al, #0x08
+ jne check_f09
+ call pcibios_select_reg
+ mov dx, di
+ and dx, #0x03
+ add dx, #0x0cfc
+ in al, dx
+ mov cl, al
+ jmp pcibios_ok
+check_f09: ;; read configuration word
+ cmp al, #0x09
+ jne check_f0a
+ call pcibios_select_reg
+ mov dx, di
+ and dx, #0x02
+ add dx, #0x0cfc
+ in ax, dx
+ mov cx, ax
+ jmp pcibios_ok
+check_f0a: ;; read configuration dword
+ cmp al, #0x0a
+ jne check_f0b
+ call pcibios_select_reg
+ mov dx, #0x0cfc
+ in eax, dx
+ mov ecx, eax
+ jmp pcibios_ok
+check_f0b: ;; write configuration byte
+ cmp al, #0x0b
+ jne check_f0c
+ call pcibios_select_reg
+ mov dx, di
+ and dx, #0x03
+ add dx, #0x0cfc
+ mov al, cl
+ out dx, al
+ jmp pcibios_ok
+check_f0c: ;; write configuration word
+ cmp al, #0x0c
+ jne check_f0d
+ call pcibios_select_reg
+ mov dx, di
+ and dx, #0x02
+ add dx, #0x0cfc
+ mov ax, cx
+ out dx, ax
+ jmp pcibios_ok
+check_f0d: ;; write configuration dword
+ cmp al, #0x0d
+ jne pcibios_unknown
+ call pcibios_select_reg
+ mov dx, #0x0cfc
+ mov eax, ecx
+ out dx, eax
+ jmp pcibios_ok
+pcibios_unknown:
+ mov ah, #0x81
+pcibios_fail:
+ sti
+ popf
+ stc
+ retf
+pcibios_ok:
+ xor ah, ah
+ sti
+ popf
+ clc
+ retf
+
+pcibios_select_reg:
+ mov eax, #0x800000
+ mov ax, bx
+ shl eax, #8
+ and di, #0xff
+ or ax, di
+ and al, #0xfc
+ mov edx, #0x0cf8
+ out dx, eax
+ ret
+
+use16 386
+
+pcibios_real: ;; installation check
+ mov eax, #0x80000000
+ mov dx, #0x0cf8
+ out dx, eax
+ mov dx, #0x0cfc
+ in eax, dx
+ cmp eax, #0x12378086
+ jne no_pci
+ mov ax, #0x0001
+ mov bx, #0x0210
+ mov cx, #0
+ mov edx, #0x20494350
+ mov edi, #pcibios_protected
+ or edi, #0xf0000
+ clc
+ iret
+no_pci:
+ stc
+ iret
+#endif
+
;; for 'C' strings and other data, insert them here with
;; a the following hack:
;; DATA_SEG_DEFS_HERE
@@ -9852,6 +10016,12 @@
;----------
.org 0xfe6e ; INT 1Ah Time-of-day Service Entry Point
int1a_handler:
+#if BX_PCIBIOS
+ cmp ax, #0xb101
+ jne int1a_normal
+ jmp pcibios_real
+int1a_normal:
+#endif
push ds
pusha
mov ax, #0x0000

View File

@ -1,44 +0,0 @@
NOTE: this is a nice idea but it can cause segfaults if a panic happens
before the vga display comes up. Oops.
-Bryce
I have updated this patch for the current CVS (logio 1.17) and added a check
for the siminterface init state before calling the vga timer handler.
The changes are present in CVS now (June 1st).
-Volker
===================================================================
--- ../bochs/logio.cc Thu Apr 18 16:53:08 2002
+++ logio.cc Sun May 26 11:41:41 2002
@@ -359,10 +359,23 @@
void
logfunctions::ask (int level, const char *prefix, const char *fmt, va_list ap)
{
+ static char in_ask_already = 0;
char buf1[1024], buf2[1024];
+ if (in_ask_already) {
+ fprintf (stderr, "logfunctions::ask() should not reenter!!\n");
+ return;
+ }
+ in_ask_already = 1;
vsprintf (buf1, fmt, ap);
sprintf (buf2, "%s %s", prefix, buf1);
// FIXME: facility set to 0 because it's unknown.
+
+ // update vga screen. This is useful because sometimes useful messages
+ // are printed on the screen just before a panic. It's also potentially
+ // dangerous if this function calls ask again... That's why I added
+ // the reentry check above.
+ if (SIM->get_init_done()) bx_vga.timer_handler(&bx_vga);
+
int val = SIM->log_msg (prefix, level, buf2);
switch (val)
{
@@ -401,6 +414,7 @@
// in gui/control.cc.
fprintf (stderr, "WARNING: log_msg returned unexpected value %d\n", val);
}
+ in_ask_already = 0;
}
void