diff --git a/bochs/iodev/cmos.cc b/bochs/iodev/cmos.cc index 708eed437..c08825a63 100644 --- a/bochs/iodev/cmos.cc +++ b/bochs/iodev/cmos.cc @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////// -// $Id: cmos.cc,v 1.50 2005-09-18 07:16:28 vruppert Exp $ +// $Id: cmos.cc,v 1.51 2005-12-04 17:43:09 vruppert Exp $ ///////////////////////////////////////////////////////////////////////// // // Copyright (C) 2002 MandrakeSoft S.A. @@ -139,7 +139,7 @@ bx_cmos_c::~bx_cmos_c(void) void bx_cmos_c::init(void) { - BX_DEBUG(("Init $Id: cmos.cc,v 1.50 2005-09-18 07:16:28 vruppert Exp $")); + BX_DEBUG(("Init $Id: cmos.cc,v 1.51 2005-12-04 17:43:09 vruppert Exp $")); // CMOS RAM & RTC DEV_register_ioread_handler(this, read_handler, 0x0070, "CMOS RAM", 1); @@ -197,7 +197,6 @@ bx_cmos_c::init(void) // load CMOS from image file if requested. if (bx_options.cmosimage.Oenabled->get ()) { - // CMOS image file requested int fd, ret; struct stat stat_buf; @@ -257,8 +256,7 @@ bx_cmos_c::init(void) BX_CMOS_THIS s.timeval_change = 0; } - void -bx_cmos_c::reset(unsigned type) +void bx_cmos_c::reset(unsigned type) { BX_CMOS_THIS s.cmos_mem_address = 0; @@ -278,8 +276,26 @@ bx_cmos_c::reset(unsigned type) BX_CMOS_THIS CRA_change(); } - void -bx_cmos_c::CRA_change(void) +void bx_cmos_c::save_image(void) +{ + int fd, ret; + + // save CMOS to image file if requested. + if (bx_options.cmosimage.Oenabled->get ()) { + fd = open(bx_options.cmosimage.Opath->getptr (), O_WRONLY +#ifdef O_BINARY + | O_BINARY +#endif + ); + ret = ::write(fd, (bx_ptr_t) BX_CMOS_THIS s.reg, 128); + if (ret != 128) { + BX_PANIC(("CMOS: error writing cmos file.")); + } + close(fd); + } +} + +void bx_cmos_c::CRA_change(void) { Bit8u nibble, dcc; diff --git a/bochs/iodev/cmos.h b/bochs/iodev/cmos.h index 69bff9bb8..fa61c5627 100644 --- a/bochs/iodev/cmos.h +++ b/bochs/iodev/cmos.h @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////// -// $Id: cmos.h,v 1.12 2005-09-11 20:03:56 vruppert Exp $ +// $Id: cmos.h,v 1.13 2005-12-04 17:43:09 vruppert Exp $ ///////////////////////////////////////////////////////////////////////// // // Copyright (C) 2002 MandrakeSoft S.A. @@ -42,6 +42,7 @@ public: virtual void init(void); virtual void checksum_cmos(void); virtual void reset(unsigned type); + virtual void save_image(void); virtual Bit32u get_reg(unsigned reg) { return s.reg[reg]; diff --git a/bochs/iodev/iodev.h b/bochs/iodev/iodev.h index b6c4a0a02..0f80eb497 100644 --- a/bochs/iodev/iodev.h +++ b/bochs/iodev/iodev.h @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////// -// $Id: iodev.h,v 1.66 2005-12-02 17:27:19 vruppert Exp $ +// $Id: iodev.h,v 1.67 2005-12-04 17:43:09 vruppert Exp $ ///////////////////////////////////////////////////////////////////////// // // Copyright (C) 2002 MandrakeSoft S.A. @@ -173,12 +173,14 @@ class BOCHSAPI bx_cmos_stub_c : public bx_devmodel_c { STUBFUNC(cmos, set_reg); } virtual time_t get_timeval() { - // STUBFUNC(cmos, get_timeval); return 0; } virtual void checksum_cmos(void) { STUBFUNC(cmos, checksum); } + virtual void save_image(void) { + STUBFUNC(cmos, save_image); + } }; class BOCHSAPI bx_dma_stub_c : public bx_devmodel_c { diff --git a/bochs/pc_system.cc b/bochs/pc_system.cc index 4640dc8e7..bb3573fc0 100644 --- a/bochs/pc_system.cc +++ b/bochs/pc_system.cc @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////// -// $Id: pc_system.cc,v 1.44 2005-10-18 18:07:51 sshwarts Exp $ +// $Id: pc_system.cc,v 1.45 2005-12-04 17:43:08 vruppert Exp $ ///////////////////////////////////////////////////////////////////////// // // Copyright (C) 2002 MandrakeSoft S.A. @@ -221,6 +221,7 @@ Bit8u bx_pc_system_c::IAC(void) void bx_pc_system_c::exit(void) { + DEV_cmos_save_image(); if (DEV_hd_present()) DEV_hd_close_harddrive(); diff --git a/bochs/plugin.h b/bochs/plugin.h index a21d4dc2c..63d95cb32 100644 --- a/bochs/plugin.h +++ b/bochs/plugin.h @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////// -// $Id: plugin.h,v 1.44 2005-12-02 17:27:18 vruppert Exp $ +// $Id: plugin.h,v 1.45 2005-12-04 17:43:09 vruppert Exp $ ///////////////////////////////////////////////////////////////////////// // // This file provides macros and types needed for plugins. It is based on @@ -101,6 +101,7 @@ extern "C" { #define DEV_cmos_set_reg(a,b) (bx_devices.pluginCmosDevice->set_reg(a,b)) #define DEV_cmos_checksum() (bx_devices.pluginCmosDevice->checksum_cmos()) #define DEV_cmos_get_timeval() (bx_devices.pluginCmosDevice->get_timeval()) +#define DEV_cmos_save_image() (bx_devices.pluginCmosDevice->save_image()) ///////// keyboard macros #define DEV_mouse_motion(dx, dy, state) \