From d7d2de421f56214797357836c079c275435fe2dc Mon Sep 17 00:00:00 2001 From: Stanislav Shwartsman Date: Wed, 11 Jan 2006 18:22:12 +0000 Subject: [PATCH] Remove code duplication in CPU and memory objects initialization --- bochs/cpu/init.cc | 11 ++--- bochs/cpu/todo | 7 ++- bochs/main.cc | 108 +++++++++++++++++----------------------------- 3 files changed, 51 insertions(+), 75 deletions(-) diff --git a/bochs/cpu/init.cc b/bochs/cpu/init.cc index c65c5b701..f3ae0aa81 100644 --- a/bochs/cpu/init.cc +++ b/bochs/cpu/init.cc @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////// -// $Id: init.cc,v 1.76 2005-12-12 19:54:48 sshwarts Exp $ +// $Id: init.cc,v 1.77 2006-01-11 18:22:12 sshwarts Exp $ ///////////////////////////////////////////////////////////////////////// // // Copyright (C) 2001 MandrakeSoft S.A. @@ -162,9 +162,12 @@ void BX_CPU_C::initialize(BX_MEM_C *addrspace) { // BX_CPU_C constructor BX_CPU_THIS_PTR set_INTR (0); + #if BX_SUPPORT_APIC - BX_CPU_THIS_PTR local_apic.init (); + BX_CPU_THIS_PTR local_apic.set_id(BX_CPU_ID); + BX_CPU_THIS_PTR local_apic.init(); #endif + // in SMP mode, the prefix of the CPU will be changed to [CPUn] in // bx_local_apic_c::set_id as soon as the apic ID is assigned. @@ -282,7 +285,7 @@ void BX_CPU_C::initialize(BX_MEM_C *addrspace) // mem = addrspace; - sprintf (name, "CPU %d", which_cpu()); + sprintf (name, "CPU %d", BX_CPU_ID); #if BX_WITH_WX static bx_bool first_time = 1; @@ -300,7 +303,6 @@ void BX_CPU_C::initialize(BX_MEM_C *addrspace) #define DEFPARAM_NORMAL(name,field) \ list->add (new bx_shadow_num_c (BXP_CPU_##name, #name, "", &(field))) - DEFPARAM_NORMAL (EAX, EAX); DEFPARAM_NORMAL (EBX, EBX); DEFPARAM_NORMAL (ECX, ECX); @@ -409,7 +411,6 @@ void BX_CPU_C::initialize(BX_MEM_C *addrspace) DEFPARAM_LAZY_EFLAG(PF); DEFPARAM_LAZY_EFLAG(CF); - // restore defaults bx_param_num_c::set_default_base (oldbase); bx_param_num_c::set_default_format (oldfmt); diff --git a/bochs/cpu/todo b/bochs/cpu/todo index c12d36e78..639e3437a 100755 --- a/bochs/cpu/todo +++ b/bochs/cpu/todo @@ -23,8 +23,11 @@ TODO (know issues in CPU model): [!] CPUID does not report 3DNow! instruction set -[!] Some of APIC functionality (like spurious interrupt vector) still - not implemented +[!] Some of APIC functionality still not implemented, for example + + - Globally disabled APIC + - NMI, SMI, INIT signals, LVT pins handling + - Filter interrupts according processor priority (PPR) [!] No support of AC flag (alignment checking) and #AC exception diff --git a/bochs/main.cc b/bochs/main.cc index 0b42bee6f..4a9d2bf9a 100644 --- a/bochs/main.cc +++ b/bochs/main.cc @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////// -// $Id: main.cc,v 1.300 2006-01-10 06:13:25 sshwarts Exp $ +// $Id: main.cc,v 1.301 2006-01-11 18:22:12 sshwarts Exp $ ///////////////////////////////////////////////////////////////////////// // // Copyright (C) 2002 MandrakeSoft S.A. @@ -199,7 +199,7 @@ int bxmain () { // read a param to decide which config interface to start. // If one exists, start it. If not, just begin. bx_param_enum_c *ci_param = SIM->get_param_enum (BXP_SEL_CONFIG_INTERFACE); - char *ci_name = ci_param->get_choice (ci_param->get ()); + char *ci_name = ci_param->get_choice (ci_param->get()); if (!strcmp(ci_name, "textconfig")) { #if BX_USE_TEXTCONFIG init_text_config_interface (); // in textconfig.h @@ -640,9 +640,9 @@ bx_bool load_and_init_display_lib () } BX_ASSERT (bx_gui == NULL); bx_param_enum_c *ci_param = SIM->get_param_enum (BXP_SEL_CONFIG_INTERFACE); - char *ci_name = ci_param->get_choice (ci_param->get ()); + char *ci_name = ci_param->get_choice (ci_param->get()); bx_param_enum_c *gui_param = SIM->get_param_enum(BXP_SEL_DISPLAY_LIBRARY); - char *gui_name = gui_param->get_choice (gui_param->get ()); + char *gui_name = gui_param->get_choice (gui_param->get()); if (!strcmp(ci_name, "wx")) { BX_ERROR(("change of the config interface to wx not implemented yet")); } @@ -652,7 +652,7 @@ bx_bool load_and_init_display_lib () BX_ERROR (("wxWidgets was not used as the configuration interface, so it cannot be used as the display library")); // choose another, hopefully different! gui_param->set (0); - gui_name = gui_param->get_choice (gui_param->get ()); + gui_name = gui_param->get_choice (gui_param->get()); if (!strcmp (gui_name, "wx")) { BX_PANIC (("no alternative display libraries are available")); return false; @@ -740,7 +740,7 @@ bx_begin_simulation (int argc, char *argv[]) { bx_init_hardware(); - if (bx_options.load32bitOSImage.OwhichOS->get ()) { + if (bx_options.load32bitOSImage.OwhichOS->get()) { void bx_load32bitOSimagehack(void); bx_load32bitOSimagehack(); } @@ -756,7 +756,7 @@ bx_begin_simulation (int argc, char *argv[]) // until init_done is set. This forces the set handler to be called, // which sets up the mouse enabled GUI-specific stuff correctly. // Not a great solution but it works. BBD - bx_options.Omouse_enabled->set (bx_options.Omouse_enabled->get ()); + bx_options.Omouse_enabled->set (bx_options.Omouse_enabled->get()); if (BX_SMP_PROCESSORS == 1) { // only one processor, run as fast as possible by not messing with @@ -791,18 +791,18 @@ int bx_init_hardware() { // all configuration has been read, now initialize everything. - if (SIM->get_param_enum(BXP_BOCHS_START)->get ()==BX_QUICK_START) { + if (SIM->get_param_enum(BXP_BOCHS_START)->get()==BX_QUICK_START) { for (int level=0; levelget_default_log_action (level); io->set_log_action (level, action); } } - bx_pc_system.init_ips(bx_options.Oips->get ()); + bx_pc_system.init_ips(bx_options.Oips->get()); if(bx_options.log.Ofilename->getptr()[0]!='-') { - BX_INFO (("using log file %s", bx_options.log.Ofilename->getptr ())); - io->init_log(bx_options.log.Ofilename->getptr ()); + BX_INFO (("using log file %s", bx_options.log.Ofilename->getptr())); + io->init_log(bx_options.log.Ofilename->getptr()); } io->set_log_prefix(bx_options.log.Oprefix->getptr()); @@ -844,86 +844,58 @@ int bx_init_hardware() BX_SUPPORT_CLGD54XX?"cirrus":"")); // Check if there is a romimage - if (strcmp(bx_options.rom.Opath->getptr (),"") == 0) { + if (strcmp(bx_options.rom.Opath->getptr(),"") == 0) { BX_ERROR(("No romimage to load. Is your bochsrc file loaded/valid ?")); } // set up memory and CPU objects - Bit32u memSize = bx_options.memory.Osize->get ()*1024*1024; + Bit32u memSize = bx_options.memory.Osize->get()*1024*1024; #if BX_SUPPORT_ICACHE pageWriteStampTable.alloc(memSize); #endif -#if BX_SMP_PROCESSORS==1 +#if BX_SMP_PROCESSORS == 1 + // the memory object is static in single CPU configuration +#else + BX_MEM(0) = new BX_MEM_C (); +#endif + BX_MEM(0)->init_memory(memSize); // First load the BIOS and VGABIOS - BX_MEM(0)->load_ROM(bx_options.rom.Opath->getptr (), bx_options.rom.Oaddress->get (), 0); - BX_MEM(0)->load_ROM(bx_options.vgarom.Opath->getptr (), 0xc0000, 1); + BX_MEM(0)->load_ROM(bx_options.rom.Opath->getptr(), bx_options.rom.Oaddress->get(), 0); + BX_MEM(0)->load_ROM(bx_options.vgarom.Opath->getptr(), 0xc0000, 1); // Then load the optional ROM images - if (strcmp(bx_options.optrom[0].Opath->getptr (),"") !=0 ) - BX_MEM(0)->load_ROM(bx_options.optrom[0].Opath->getptr (), bx_options.optrom[0].Oaddress->get (), 2); - if (strcmp(bx_options.optrom[1].Opath->getptr (),"") !=0 ) - BX_MEM(0)->load_ROM(bx_options.optrom[1].Opath->getptr (), bx_options.optrom[1].Oaddress->get (), 2); - if (strcmp(bx_options.optrom[2].Opath->getptr (),"") !=0 ) - BX_MEM(0)->load_ROM(bx_options.optrom[2].Opath->getptr (), bx_options.optrom[2].Oaddress->get (), 2); - if (strcmp(bx_options.optrom[3].Opath->getptr (),"") !=0 ) - BX_MEM(0)->load_ROM(bx_options.optrom[3].Opath->getptr (), bx_options.optrom[3].Oaddress->get (), 2); + if (strcmp(bx_options.optrom[0].Opath->getptr(), "") !=0) + BX_MEM(0)->load_ROM(bx_options.optrom[0].Opath->getptr(), bx_options.optrom[0].Oaddress->get(), 2); + if (strcmp(bx_options.optrom[1].Opath->getptr(), "") !=0 ) + BX_MEM(0)->load_ROM(bx_options.optrom[1].Opath->getptr(), bx_options.optrom[1].Oaddress->get(), 2); + if (strcmp(bx_options.optrom[2].Opath->getptr(), "") !=0) + BX_MEM(0)->load_ROM(bx_options.optrom[2].Opath->getptr(), bx_options.optrom[2].Oaddress->get(), 2); + if (strcmp(bx_options.optrom[3].Opath->getptr(), "") !=0) + BX_MEM(0)->load_ROM(bx_options.optrom[3].Opath->getptr(), bx_options.optrom[3].Oaddress->get(), 2); // Then load the optional RAM images - if (strcmp(bx_options.optram[0].Opath->getptr (),"") !=0 ) - BX_MEM(0)->load_RAM(bx_options.optram[0].Opath->getptr (), bx_options.optram[0].Oaddress->get (), 2); - if (strcmp(bx_options.optram[1].Opath->getptr (),"") !=0 ) - BX_MEM(0)->load_RAM(bx_options.optram[1].Opath->getptr (), bx_options.optram[1].Oaddress->get (), 2); - if (strcmp(bx_options.optram[2].Opath->getptr (),"") !=0 ) - BX_MEM(0)->load_RAM(bx_options.optram[2].Opath->getptr (), bx_options.optram[2].Oaddress->get (), 2); - if (strcmp(bx_options.optram[3].Opath->getptr (),"") !=0 ) - BX_MEM(0)->load_RAM(bx_options.optram[3].Opath->getptr (), bx_options.optram[3].Oaddress->get (), 2); + if (strcmp(bx_options.optram[0].Opath->getptr(), "") !=0) + BX_MEM(0)->load_RAM(bx_options.optram[0].Opath->getptr(), bx_options.optram[0].Oaddress->get(), 2); + if (strcmp(bx_options.optram[1].Opath->getptr(), "") !=0) + BX_MEM(0)->load_RAM(bx_options.optram[1].Opath->getptr(), bx_options.optram[1].Oaddress->get(), 2); + if (strcmp(bx_options.optram[2].Opath->getptr(), "") !=0) + BX_MEM(0)->load_RAM(bx_options.optram[2].Opath->getptr(), bx_options.optram[2].Oaddress->get(), 2); + if (strcmp(bx_options.optram[3].Opath->getptr(), "") !=0) + BX_MEM(0)->load_RAM(bx_options.optram[3].Opath->getptr(), bx_options.optram[3].Oaddress->get(), 2); +#if BX_SMP_PROCESSORS == 1 BX_CPU(0)->initialize(BX_MEM(0)); -#if BX_SUPPORT_APIC - BX_CPU(0)->local_apic.set_id (0); -#endif BX_CPU(0)->sanity_checks(); BX_INSTR_INIT(0); BX_CPU(0)->reset(BX_RESET_HARDWARE); #else - // SMP initialization - bx_mem_array[0] = new BX_MEM_C (); - bx_mem_array[0]->init_memory(memSize); - - // First load the BIOS and VGABIOS - bx_mem_array[0]->load_ROM(bx_options.rom.Opath->getptr (), bx_options.rom.Oaddress->get (), 0); - bx_mem_array[0]->load_ROM(bx_options.vgarom.Opath->getptr (), 0xc0000, 1); - - // Then load the optional ROM images - if (strcmp(bx_options.optrom[0].Opath->getptr (),"") !=0 ) - bx_mem_array[0]->load_ROM(bx_options.optrom[0].Opath->getptr (), bx_options.optrom[0].Oaddress->get (), 2); - if (strcmp(bx_options.optrom[1].Opath->getptr (),"") !=0 ) - bx_mem_array[0]->load_ROM(bx_options.optrom[1].Opath->getptr (), bx_options.optrom[1].Oaddress->get (), 2); - if (strcmp(bx_options.optrom[2].Opath->getptr (),"") !=0 ) - bx_mem_array[0]->load_ROM(bx_options.optrom[2].Opath->getptr (), bx_options.optrom[2].Oaddress->get (), 2); - if (strcmp(bx_options.optrom[3].Opath->getptr (),"") !=0 ) - bx_mem_array[0]->load_ROM(bx_options.optrom[3].Opath->getptr (), bx_options.optrom[3].Oaddress->get (), 2); - - // Then load the optional RAM images - if (strcmp(bx_options.optram[0].Opath->getptr (),"") !=0 ) - BX_MEM(0)->load_RAM(bx_options.optram[0].Opath->getptr (), bx_options.optram[0].Oaddress->get (), 2); - if (strcmp(bx_options.optram[1].Opath->getptr (),"") !=0 ) - BX_MEM(0)->load_RAM(bx_options.optram[1].Opath->getptr (), bx_options.optram[1].Oaddress->get (), 2); - if (strcmp(bx_options.optram[2].Opath->getptr (),"") !=0 ) - BX_MEM(0)->load_RAM(bx_options.optram[2].Opath->getptr (), bx_options.optram[2].Oaddress->get (), 2); - if (strcmp(bx_options.optram[3].Opath->getptr (),"") !=0 ) - BX_MEM(0)->load_RAM(bx_options.optram[3].Opath->getptr (), bx_options.optram[3].Oaddress->get (), 2); - for (int i=0; iinitialize(bx_mem_array[0]); - // assign apic ID from the index of this loop - // if !BX_SUPPORT_APIC, this will not compile. - BX_CPU(i)->local_apic.set_id(i); + BX_CPU(i)->initialize(BX_MEM(0)); // assign local apic id in 'initialize' method BX_CPU(i)->sanity_checks(); BX_INSTR_INIT(i); BX_CPU(i)->reset(BX_RESET_HARDWARE); @@ -1012,7 +984,7 @@ int bx_atexit(void) #if BX_SUPPORT_PCI if (SIM && SIM->get_init_done ()) { - if (bx_options.Oi440FXSupport->get ()) { + if (bx_options.Oi440FXSupport->get()) { bx_devices.pluginPciBridge->print_i440fx_state(); } }