326 lines
14 KiB
Plaintext
326 lines
14 KiB
Plaintext
|
----------------------------------------------------------------------
|
||
|
Patch name: patch.optional-romimages
|
||
|
Author: Christophe Bothamy
|
||
|
Date: July 24th 2002
|
||
|
|
||
|
Detailed description:
|
||
|
This patch enables the use of uo to 4 optional romimages.
|
||
|
|
||
|
Patch was created with:
|
||
|
cvs diff -u
|
||
|
Apply patch to what version:
|
||
|
cvs checked out on July 24yh 2002
|
||
|
Instructions:
|
||
|
To patch, go to main bochs directory.
|
||
|
Type "patch -p0 < THIS_PATCH_FILE".
|
||
|
----------------------------------------------------------------------
|
||
|
Index: .bochsrc
|
||
|
===================================================================
|
||
|
RCS file: /cvsroot/bochs/bochs/.bochsrc,v
|
||
|
retrieving revision 1.42
|
||
|
diff -u -r1.42 .bochsrc
|
||
|
--- .bochsrc 26 Jun 2002 14:42:34 -0000 1.42
|
||
|
+++ .bochsrc 24 Jul 2002 17:47:30 -0000
|
||
|
@@ -6,7 +6,7 @@
|
||
|
# You now need to load a ROM BIOS into F0000-FFFFF. I've wiped
|
||
|
# out most of the BIOS hooks, and replace them with real BIOS
|
||
|
# support. Normally, you can use a precompiled BIOS in the bios/
|
||
|
-# directory, named BIOS-bochs-yymmdd. Use the latest one in there.
|
||
|
+# directory, named BIOS-bochs-latest.
|
||
|
#=======================================================================
|
||
|
#romimage: bios/BIOS-bochs-970717a
|
||
|
romimage: file=bios/BIOS-bochs-latest, address=0xf0000
|
||
|
@@ -27,6 +27,22 @@
|
||
|
megs: 32
|
||
|
#megs: 16
|
||
|
#megs: 8
|
||
|
+
|
||
|
+#=======================================================================
|
||
|
+# OPTROMIMAGE[1-4]:
|
||
|
+# You may now load up to 4 optional ROM images. Be sure to use a
|
||
|
+# read-only area, typically between C8000 and EFFFF. These optional
|
||
|
+# ROM images should not overwrite the rombios (located at
|
||
|
+# F0000-FFFFF) and the videobios (located at C0000-C7FFF).
|
||
|
+# Those ROM images will be initialized by the bios if they contain
|
||
|
+# the right signature (0x55AA).
|
||
|
+# It can also be a convenient way to upload some arbitary code/data
|
||
|
+# in the simulation, that can be retrieved by the boot loader
|
||
|
+#=======================================================================
|
||
|
+#optromimage1: file=optionalrom.bin, address=0xd0000
|
||
|
+#optromimage2: file=optionalrom.bin, address=0xd1000
|
||
|
+#optromimage3: file=optionalrom.bin, address=0xd2000
|
||
|
+#optromimage4: file=optionalrom.bin, address=0xd3000
|
||
|
|
||
|
#=======================================================================
|
||
|
# VGAROMIMAGE
|
||
|
Index: bochs.h
|
||
|
===================================================================
|
||
|
RCS file: /cvsroot/bochs/bochs/bochs.h,v
|
||
|
retrieving revision 1.71
|
||
|
diff -u -r1.71 bochs.h
|
||
|
--- bochs.h 21 Jul 2002 02:55:04 -0000 1.71
|
||
|
+++ bochs.h 24 Jul 2002 17:47:31 -0000
|
||
|
@@ -633,6 +633,10 @@
|
||
|
bx_cdrom_options cdromd;
|
||
|
bx_rom_options rom;
|
||
|
bx_vgarom_options vgarom;
|
||
|
+ bx_rom_options optrom1; // Optional rom image (1)
|
||
|
+ bx_rom_options optrom2; // Optional rom image (2)
|
||
|
+ bx_rom_options optrom3; // Optional rom image (3)
|
||
|
+ bx_rom_options optrom4; // Optional rom image (4)
|
||
|
bx_mem_options memory;
|
||
|
bx_parport_options par1; // parallel port #1
|
||
|
bx_parport_options par2; // parallel port #2 (not implemented)
|
||
|
Index: main.cc
|
||
|
===================================================================
|
||
|
RCS file: /cvsroot/bochs/bochs/main.cc,v
|
||
|
retrieving revision 1.106
|
||
|
diff -u -r1.106 main.cc
|
||
|
--- main.cc 15 Jul 2002 20:12:14 -0000 1.106
|
||
|
+++ main.cc 24 Jul 2002 17:47:33 -0000
|
||
|
@@ -76,9 +76,13 @@
|
||
|
{ 0, NULL}, // com2
|
||
|
{ 0, NULL}, // com3
|
||
|
{ 0, NULL}, // com4
|
||
|
- { 0, NULL, 0 }, // cdromd
|
||
|
- { NULL, NULL }, // rom
|
||
|
- { NULL }, // vgarom
|
||
|
+ { 0, NULL, 0 }, // cdromd
|
||
|
+ { NULL, NULL }, // rom
|
||
|
+ { NULL }, // vgarom
|
||
|
+ { NULL, NULL }, // optrom1
|
||
|
+ { NULL, NULL }, // optrom2
|
||
|
+ { NULL, NULL }, // optrom3
|
||
|
+ { NULL, NULL }, // optrom4
|
||
|
{ NULL }, // memory
|
||
|
{ 0, NULL }, // parallel port 1
|
||
|
{ 0, NULL }, // parallel port 2
|
||
|
@@ -661,6 +665,59 @@
|
||
|
0);
|
||
|
bx_options.rom.Oaddress->set_format ("ROM BIOS address: 0x%05x");
|
||
|
bx_options.rom.Oaddress->set_base (16);
|
||
|
+
|
||
|
+ bx_options.optrom1.Opath = new bx_param_filename_c (BXP_OPTROM1_PATH,
|
||
|
+ "optional romimage #1",
|
||
|
+ "Pathname of optional ROM image #1 to load",
|
||
|
+ "", BX_PATHNAME_LEN);
|
||
|
+ bx_options.optrom1.Opath->set_format ("Name of optional ROM image #1 : %s");
|
||
|
+ bx_options.optrom1.Oaddress = new bx_param_num_c (BXP_OPTROM1_ADDRESS,
|
||
|
+ "optional romaddr #1",
|
||
|
+ "The address at which the optional ROM image #1 should be loaded",
|
||
|
+ 0, BX_MAX_INT,
|
||
|
+ 0);
|
||
|
+ bx_options.optrom1.Oaddress->set_format ("optional ROM #1 address: 0x%05x");
|
||
|
+ bx_options.optrom1.Oaddress->set_base (16);
|
||
|
+
|
||
|
+ bx_options.optrom2.Opath = new bx_param_filename_c (BXP_OPTROM2_PATH,
|
||
|
+ "optional romimage #2",
|
||
|
+ "Pathname of optional ROM image #2 to load",
|
||
|
+ "", BX_PATHNAME_LEN);
|
||
|
+ bx_options.optrom2.Opath->set_format ("Name of optional ROM image #2 : %s");
|
||
|
+ bx_options.optrom2.Oaddress = new bx_param_num_c (BXP_OPTROM2_ADDRESS,
|
||
|
+ "optional romaddr #2",
|
||
|
+ "The address at which the optional ROM image #2 should be loaded",
|
||
|
+ 0, BX_MAX_INT,
|
||
|
+ 0);
|
||
|
+ bx_options.optrom2.Oaddress->set_format ("optional ROM #2 address: 0x%05x");
|
||
|
+ bx_options.optrom2.Oaddress->set_base (16);
|
||
|
+
|
||
|
+ bx_options.optrom3.Opath = new bx_param_filename_c (BXP_OPTROM3_PATH,
|
||
|
+ "optional romimage #3",
|
||
|
+ "Pathname of optional ROM image #3 to load",
|
||
|
+ "", BX_PATHNAME_LEN);
|
||
|
+ bx_options.optrom3.Opath->set_format ("Name of optional ROM image #3 : %s");
|
||
|
+ bx_options.optrom3.Oaddress = new bx_param_num_c (BXP_OPTROM3_ADDRESS,
|
||
|
+ "optional romaddr #3",
|
||
|
+ "The address at which the optional ROM image #3 should be loaded",
|
||
|
+ 0, BX_MAX_INT,
|
||
|
+ 0);
|
||
|
+ bx_options.optrom3.Oaddress->set_format ("optional ROM #3 address: 0x%05x");
|
||
|
+ bx_options.optrom3.Oaddress->set_base (16);
|
||
|
+
|
||
|
+ bx_options.optrom4.Opath = new bx_param_filename_c (BXP_OPTROM4_PATH,
|
||
|
+ "optional romimage #4",
|
||
|
+ "Pathname of optional ROM image #4 to load",
|
||
|
+ "", BX_PATHNAME_LEN);
|
||
|
+ bx_options.optrom4.Opath->set_format ("Name of optional ROM image #4 : %s");
|
||
|
+ bx_options.optrom4.Oaddress = new bx_param_num_c (BXP_OPTROM4_ADDRESS,
|
||
|
+ "optional romaddr #4",
|
||
|
+ "The address at which the optional ROM image #4 should be loaded",
|
||
|
+ 0, BX_MAX_INT,
|
||
|
+ 0);
|
||
|
+ bx_options.optrom4.Oaddress->set_format ("optional ROM #4 address: 0x%05x");
|
||
|
+ bx_options.optrom4.Oaddress->set_base (16);
|
||
|
+
|
||
|
bx_options.vgarom.Opath = new bx_param_filename_c (BXP_VGA_ROM_PATH,
|
||
|
"vgaromimage",
|
||
|
"Pathname of VGA ROM image to load",
|
||
|
@@ -671,6 +728,14 @@
|
||
|
bx_options.vgarom.Opath,
|
||
|
bx_options.rom.Opath,
|
||
|
bx_options.rom.Oaddress,
|
||
|
+ bx_options.optrom1.Opath,
|
||
|
+ bx_options.optrom1.Oaddress,
|
||
|
+ bx_options.optrom2.Opath,
|
||
|
+ bx_options.optrom2.Oaddress,
|
||
|
+ bx_options.optrom3.Opath,
|
||
|
+ bx_options.optrom3.Oaddress,
|
||
|
+ bx_options.optrom4.Opath,
|
||
|
+ bx_options.optrom4.Oaddress,
|
||
|
NULL
|
||
|
};
|
||
|
menu = new bx_list_c (BXP_MENU_MEMORY, "Bochs Memory Options", "memmenu", memory_init_list);
|
||
|
@@ -1249,8 +1314,21 @@
|
||
|
|
||
|
#if BX_SMP_PROCESSORS==1
|
||
|
BX_MEM(0)->init_memory(bx_options.memory.Osize->get () * 1024*1024);
|
||
|
+
|
||
|
+ // First load the optional ROM images
|
||
|
+ if (bx_options.optrom1.Opath->getptr () > 0)
|
||
|
+ BX_MEM(0)->load_ROM(bx_options.optrom1.Opath->getptr (), bx_options.optrom1.Oaddress->get ());
|
||
|
+ if (bx_options.optrom2.Opath->getptr () > 0)
|
||
|
+ BX_MEM(0)->load_ROM(bx_options.optrom2.Opath->getptr (), bx_options.optrom2.Oaddress->get ());
|
||
|
+ if (bx_options.optrom3.Opath->getptr () > 0)
|
||
|
+ BX_MEM(0)->load_ROM(bx_options.optrom3.Opath->getptr (), bx_options.optrom3.Oaddress->get ());
|
||
|
+ if (bx_options.optrom4.Opath->getptr () > 0)
|
||
|
+ BX_MEM(0)->load_ROM(bx_options.optrom4.Opath->getptr (), bx_options.optrom4.Oaddress->get ());
|
||
|
+
|
||
|
+ // Then Load the BIOS and VGABIOS
|
||
|
BX_MEM(0)->load_ROM(bx_options.rom.Opath->getptr (), bx_options.rom.Oaddress->get ());
|
||
|
BX_MEM(0)->load_ROM(bx_options.vgarom.Opath->getptr (), 0xc0000);
|
||
|
+
|
||
|
BX_CPU(0)->init (BX_MEM(0));
|
||
|
#if BX_SUPPORT_APIC
|
||
|
BX_CPU(0)->local_apic.set_id (0);
|
||
|
@@ -1260,8 +1338,22 @@
|
||
|
// SMP initialization
|
||
|
bx_mem_array[0] = new BX_MEM_C ();
|
||
|
bx_mem_array[0]->init_memory(bx_options.memory.Osize->get () * 1024*1024);
|
||
|
+
|
||
|
+ // First load the optional ROM images
|
||
|
+ if (bx_options.optrom1.Opath->getptr () > 0)
|
||
|
+ bx_mem_array[0]->load_ROM(bx_options.optrom1.Opath->getptr (), bx_options.optrom1.Oaddress->get ());
|
||
|
+ if (bx_options.optrom2.Opath->getptr () > 0)
|
||
|
+ bx_mem_array[0]->load_ROM(bx_options.optrom2.Opath->getptr (), bx_options.optrom2.Oaddress->get ());
|
||
|
+ if (bx_options.optrom3.Opath->getptr () > 0)
|
||
|
+ BX_MEM(0)->load_ROM(bx_options.optrom3.Opath->getptr (), bx_options.optrom3.Oaddress->get ());
|
||
|
+ bx_mem_array[0]->load_ROM(bx_options.optrom3.Opath->getptr (), bx_options.optrom3.Oaddress->get ());
|
||
|
+ if (bx_options.optrom4.Opath->getptr () > 0)
|
||
|
+ bx_mem_array[0]->load_ROM(bx_options.optrom4.Opath->getptr (), bx_options.optrom4.Oaddress->get ());
|
||
|
+
|
||
|
+ // Then Load the BIOS and VGABIOS
|
||
|
bx_mem_array[0]->load_ROM(bx_options.rom.Opath->getptr (), bx_options.rom.Oaddress->get ());
|
||
|
bx_mem_array[0]->load_ROM(bx_options.vgarom.Opath->getptr (), 0xc0000);
|
||
|
+
|
||
|
for (int i=0; i<BX_SMP_PROCESSORS; i++) {
|
||
|
BX_CPU(i) = new BX_CPU_C ();
|
||
|
BX_CPU(i)->init (bx_mem_array[0]);
|
||
|
@@ -1810,6 +1902,70 @@
|
||
|
else
|
||
|
bx_options.rom.Oaddress->set (strtoul (¶ms[2][8], NULL, 10));
|
||
|
}
|
||
|
+ else if (!strcmp(params[0], "optromimage1")) {
|
||
|
+ if (num_params != 3) {
|
||
|
+ BX_PANIC(("%s: optromimage1 directive: wrong # args.", context));
|
||
|
+ }
|
||
|
+ if (strncmp(params[1], "file=", 5)) {
|
||
|
+ BX_PANIC(("%s: optromimage1 directive malformed.", context));
|
||
|
+ }
|
||
|
+ if (strncmp(params[2], "address=", 8)) {
|
||
|
+ BX_PANIC(("%s: optromimage2 directive malformed.", context));
|
||
|
+ }
|
||
|
+ bx_options.optrom1.Opath->set (¶ms[1][5]);
|
||
|
+ if ( (params[2][8] == '0') && (params[2][9] == 'x') )
|
||
|
+ bx_options.optrom1.Oaddress->set (strtoul (¶ms[2][8], NULL, 16));
|
||
|
+ else
|
||
|
+ bx_options.optrom1.Oaddress->set (strtoul (¶ms[2][8], NULL, 10));
|
||
|
+ }
|
||
|
+ else if (!strcmp(params[0], "optromimage2")) {
|
||
|
+ if (num_params != 3) {
|
||
|
+ BX_PANIC(("%s: optromimage2 directive: wrong # args.", context));
|
||
|
+ }
|
||
|
+ if (strncmp(params[1], "file=", 5)) {
|
||
|
+ BX_PANIC(("%s: optromimage2 directive malformed.", context));
|
||
|
+ }
|
||
|
+ if (strncmp(params[2], "address=", 8)) {
|
||
|
+ BX_PANIC(("%s: optromimage2 directive malformed.", context));
|
||
|
+ }
|
||
|
+ bx_options.optrom2.Opath->set (¶ms[1][5]);
|
||
|
+ if ( (params[2][8] == '0') && (params[2][9] == 'x') )
|
||
|
+ bx_options.optrom2.Oaddress->set (strtoul (¶ms[2][8], NULL, 16));
|
||
|
+ else
|
||
|
+ bx_options.optrom2.Oaddress->set (strtoul (¶ms[2][8], NULL, 10));
|
||
|
+ }
|
||
|
+ else if (!strcmp(params[0], "optromimage3")) {
|
||
|
+ if (num_params != 3) {
|
||
|
+ BX_PANIC(("%s: optromimage3 directive: wrong # args.", context));
|
||
|
+ }
|
||
|
+ if (strncmp(params[1], "file=", 5)) {
|
||
|
+ BX_PANIC(("%s: optromimage3 directive malformed.", context));
|
||
|
+ }
|
||
|
+ if (strncmp(params[2], "address=", 8)) {
|
||
|
+ BX_PANIC(("%s: optromimage2 directive malformed.", context));
|
||
|
+ }
|
||
|
+ bx_options.optrom3.Opath->set (¶ms[1][5]);
|
||
|
+ if ( (params[2][8] == '0') && (params[2][9] == 'x') )
|
||
|
+ bx_options.optrom3.Oaddress->set (strtoul (¶ms[2][8], NULL, 16));
|
||
|
+ else
|
||
|
+ bx_options.optrom3.Oaddress->set (strtoul (¶ms[2][8], NULL, 10));
|
||
|
+ }
|
||
|
+ else if (!strcmp(params[0], "optromimage4")) {
|
||
|
+ if (num_params != 3) {
|
||
|
+ BX_PANIC(("%s: optromimage4 directive: wrong # args.", context));
|
||
|
+ }
|
||
|
+ if (strncmp(params[1], "file=", 5)) {
|
||
|
+ BX_PANIC(("%s: optromimage4 directive malformed.", context));
|
||
|
+ }
|
||
|
+ if (strncmp(params[2], "address=", 8)) {
|
||
|
+ BX_PANIC(("%s: optromimage2 directive malformed.", context));
|
||
|
+ }
|
||
|
+ bx_options.optrom4.Opath->set (¶ms[1][5]);
|
||
|
+ if ( (params[2][8] == '0') && (params[2][9] == 'x') )
|
||
|
+ bx_options.optrom4.Oaddress->set (strtoul (¶ms[2][8], NULL, 16));
|
||
|
+ else
|
||
|
+ bx_options.optrom4.Oaddress->set (strtoul (¶ms[2][8], NULL, 10));
|
||
|
+ }
|
||
|
else if (!strcmp(params[0], "vgaromimage")) {
|
||
|
if (num_params != 2) {
|
||
|
BX_PANIC(("%s: vgaromimage directive: wrong # args.", context));
|
||
|
@@ -2377,6 +2533,14 @@
|
||
|
fprintf (fp, "vgaromimage: %s\n", bx_options.vgarom.Opath->getptr ());
|
||
|
else
|
||
|
fprintf (fp, "# no vgaromimage\n");
|
||
|
+ if (strlen (bx_options.optrom1.Opath->getptr ()) > 0)
|
||
|
+ fprintf (fp, "optromimage1: file=%s, address=0x%05x\n", bx_options.optrom1.Opath->getptr(), (unsigned int)bx_options.optrom1.Oaddress->get ());
|
||
|
+ if (strlen (bx_options.optrom2.Opath->getptr ()) > 0)
|
||
|
+ fprintf (fp, "optromimage2: file=%s, address=0x%05x\n", bx_options.optrom2.Opath->getptr(), (unsigned int)bx_options.optrom2.Oaddress->get ());
|
||
|
+ if (strlen (bx_options.optrom3.Opath->getptr ()) > 0)
|
||
|
+ fprintf (fp, "optromimage3: file=%s, address=0x%05x\n", bx_options.optrom3.Opath->getptr(), (unsigned int)bx_options.optrom3.Oaddress->get ());
|
||
|
+ if (strlen (bx_options.optrom4.Opath->getptr ()) > 0)
|
||
|
+ fprintf (fp, "optromimage4: file=%s, address=0x%05x\n", bx_options.optrom4.Opath->getptr(), (unsigned int)bx_options.optrom4.Oaddress->get ());
|
||
|
fprintf (fp, "megs: %d\n", bx_options.memory.Osize->get ());
|
||
|
bx_write_parport_options (fp, &bx_options.par1, 1);
|
||
|
//bx_write_parport_options (fp, &bx_options.par2);
|
||
|
Index: gui/siminterface.h
|
||
|
===================================================================
|
||
|
RCS file: /cvsroot/bochs/bochs/gui/siminterface.h,v
|
||
|
retrieving revision 1.39
|
||
|
diff -u -r1.39 siminterface.h
|
||
|
--- gui/siminterface.h 4 Jul 2002 19:24:30 -0000 1.39
|
||
|
+++ gui/siminterface.h 24 Jul 2002 17:47:33 -0000
|
||
|
@@ -61,6 +61,14 @@
|
||
|
BXP_ROM_PATH,
|
||
|
BXP_ROM_ADDRESS,
|
||
|
BXP_VGA_ROM_PATH,
|
||
|
+ BXP_OPTROM1_PATH,
|
||
|
+ BXP_OPTROM1_ADDRESS,
|
||
|
+ BXP_OPTROM2_PATH,
|
||
|
+ BXP_OPTROM2_ADDRESS,
|
||
|
+ BXP_OPTROM3_PATH,
|
||
|
+ BXP_OPTROM3_ADDRESS,
|
||
|
+ BXP_OPTROM4_PATH,
|
||
|
+ BXP_OPTROM4_ADDRESS,
|
||
|
BXP_KBD_SERIAL_DELAY,
|
||
|
BXP_KBD_PASTE_DELAY,
|
||
|
BXP_KBD_TYPE,
|