aboutsummaryrefslogtreecommitdiffstats
path: root/tools/ioemu/include/pc_system.h
diff options
context:
space:
mode:
Diffstat (limited to 'tools/ioemu/include/pc_system.h')
-rw-r--r--tools/ioemu/include/pc_system.h199
1 files changed, 199 insertions, 0 deletions
diff --git a/tools/ioemu/include/pc_system.h b/tools/ioemu/include/pc_system.h
new file mode 100644
index 0000000000..c35c35bf52
--- /dev/null
+++ b/tools/ioemu/include/pc_system.h
@@ -0,0 +1,199 @@
+/////////////////////////////////////////////////////////////////////////
+// $Id: pc_system.h,v 1.25 2003/03/02 23:59:08 cbothamy Exp $
+/////////////////////////////////////////////////////////////////////////
+//
+// Copyright (C) 2002 MandrakeSoft S.A.
+//
+// MandrakeSoft S.A.
+// 43, rue d'Aboukir
+// 75002 Paris - France
+// http://www.linux-mandrake.com/
+// http://www.mandrakesoft.com/
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+
+
+#define BX_MAX_TIMERS 64
+#define BX_NULL_TIMER_HANDLE 10000
+
+
+#if BX_SHOW_IPS
+extern unsigned long ips_count;
+#endif
+
+
+typedef void (*bx_timer_handler_t)(void *);
+
+
+BOCHSAPI extern class bx_pc_system_c bx_pc_system;
+
+#ifdef PROVIDE_M_IPS
+extern double m_ips;
+#endif
+
+class BOCHSAPI bx_pc_system_c : private logfunctions {
+private:
+
+ // ===============================
+ // Timer oriented private features
+ // ===============================
+
+ struct {
+ bx_bool inUse; // Timer slot is in-use (currently registered).
+ Bit64u period; // Timer periodocity in cpu ticks.
+ Bit64u timeToFire; // Time to fire next (in absolute ticks).
+ bx_bool active; // 0=inactive, 1=active.
+ bx_bool continuous; // 0=one-shot timer, 1=continuous periodicity.
+ bx_timer_handler_t funct; // A callback function for when the
+ // timer fires.
+ void *this_ptr; // The this-> pointer for C++ callbacks
+ // has to be stored as well.
+#define BxMaxTimerIDLen 32
+ char id[BxMaxTimerIDLen]; // String ID of timer.
+ } timer[BX_MAX_TIMERS];
+
+ unsigned numTimers; // Number of currently allocated timers.
+ Bit32u currCountdown; // Current countdown ticks value (decrements to 0).
+ Bit32u currCountdownPeriod; // Length of current countdown period.
+ Bit64u ticksTotal; // Num ticks total since start of emulator execution.
+ Bit64u lastTimeUsec; // Last sequentially read time in usec.
+ Bit64u usecSinceLast; // Number of useconds claimed since then.
+
+ // A special null timer is always inserted in the timer[0] slot. This
+ // make sure that at least one timer is always active, and that the
+ // duration is always less than a maximum 32-bit integer, so a 32-bit
+ // counter can be used for the current countdown.
+ static const Bit64u NullTimerInterval;
+ static void nullTimer(void* this_ptr);
+
+#if !defined(PROVIDE_M_IPS)
+ // This is the emulator speed, as measured in millions of
+ // x86 instructions per second that it can emulate on some hypothetically
+ // nomimal workload.
+ double m_ips; // Millions of Instructions Per Second
+#endif
+
+ // This handler is called when the function which decrements the clock
+ // ticks finds that an event has occurred.
+ void countdownEvent(void);
+
+public:
+
+ // ==============================
+ // Timer oriented public features
+ // ==============================
+
+ void init_ips(Bit32u ips);
+ int register_timer( void *this_ptr, bx_timer_handler_t, Bit32u useconds,
+ bx_bool continuous, bx_bool active, const char *id);
+ unsigned unregisterTimer(int timerID);
+ void start_timers(void);
+ void activate_timer( unsigned timer_index, Bit32u useconds,
+ bx_bool continuous );
+ void deactivate_timer( unsigned timer_index );
+ static BX_CPP_INLINE void tick1(void) {
+#if BX_SHOW_IPS
+ {
+ extern unsigned long ips_count;
+ ips_count++;
+ }
+#endif
+ if (--bx_pc_system.currCountdown == 0) {
+ bx_pc_system.countdownEvent();
+ }
+ }
+ static BX_CPP_INLINE void tickn(Bit64u n) {
+#if BX_SHOW_IPS
+ {
+ extern unsigned long ips_count;
+ ips_count += n;
+ }
+#endif
+ while (n >= Bit64u(bx_pc_system.currCountdown)) {
+ n -= Bit64u(bx_pc_system.currCountdown);
+ bx_pc_system.currCountdown = 0;
+ bx_pc_system.countdownEvent();
+ // bx_pc_system.currCountdown is adjusted to new value by countdownevent().
+ };
+ // 'n' is not (or no longer) >= the countdown size. We can just decrement
+ // the remaining requested ticks and continue.
+ bx_pc_system.currCountdown -= Bit32u(n);
+ }
+
+ int register_timer_ticks(void* this_ptr, bx_timer_handler_t, Bit64u ticks,
+ bx_bool continuous, bx_bool active, const char *id);
+ void activate_timer_ticks(unsigned index, Bit64u instructions,
+ bx_bool continuous);
+ Bit64u time_usec();
+ Bit64u time_usec_sequential();
+ static BX_CPP_INLINE Bit64u time_ticks() {
+ return bx_pc_system.ticksTotal +
+ Bit64u(bx_pc_system.currCountdownPeriod - bx_pc_system.currCountdown);
+ }
+ static BX_CPP_INLINE Bit64u getTicksTotal(void) {
+ return bx_pc_system.ticksTotal;
+ }
+
+ static BX_CPP_INLINE Bit32u getNumCpuTicksLeftNextEvent(void) {
+ return bx_pc_system.currCountdown;
+ }
+#if BX_DEBUGGER
+ static void timebp_handler(void* this_ptr);
+#endif
+
+
+ // ===========================
+ // Non-timer oriented features
+ // ===========================
+
+ bx_bool HRQ; // Hold Request
+ //bx_bool INTR; // Interrupt
+
+
+ // Address line 20 control:
+ // 1 = enabled: extended memory is accessible
+ // 0 = disabled: A20 address line is forced low to simulate
+ // an 8088 address map
+ bx_bool enable_a20;
+
+ // start out masking physical memory addresses to:
+ // 8086: 20 bits
+ // 286: 24 bits
+ // 386: 32 bits
+ // when A20 line is disabled, mask physical memory addresses to:
+ // 286: 20 bits
+ // 386: 20 bits
+ //
+ Bit32u a20_mask;
+
+ void set_HRQ(bx_bool val); // set the Hold ReQuest line
+ void set_INTR(bx_bool value); // set the INTR line to value
+
+ int IntEnabled( void );
+ int InterruptSignal( PCS_OP operation );
+ int ResetSignal( PCS_OP operation );
+ Bit8u IAC(void);
+
+ bx_pc_system_c(void);
+
+ Bit32u inp(Bit16u addr, unsigned io_len) BX_CPP_AttrRegparmN(2);
+ void outp(Bit16u addr, Bit32u value, unsigned io_len) BX_CPP_AttrRegparmN(3);
+ void set_enable_a20(Bit8u value) BX_CPP_AttrRegparmN(1);
+ bx_bool get_enable_a20(void);
+ void exit(void);
+
+ };