1 /////////////////////////////////////////////////////////////////////////
2 // $Id: pc_system.h,v 1.44 2008/03/19 18:36:17 sshwarts Exp $
3 /////////////////////////////////////////////////////////////////////////
5 // Copyright (C) 2004 MandrakeSoft S.A.
9 // 75002 Paris - France
10 // http://www.linux-mandrake.com/
11 // http://www.mandrakesoft.com/
13 // This library is free software; you can redistribute it and/or
14 // modify it under the terms of the GNU Lesser General Public
15 // License as published by the Free Software Foundation; either
16 // version 2 of the License, or (at your option) any later version.
18 // This library is distributed in the hope that it will be useful,
19 // but WITHOUT ANY WARRANTY; without even the implied warranty of
20 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21 // Lesser General Public License for more details.
23 // You should have received a copy of the GNU Lesser General Public
24 // License along with this library; if not, write to the Free Software
25 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
30 #define BX_MAX_TIMERS 64
31 #define BX_NULL_TIMER_HANDLE 10000
33 typedef void (*bx_timer_handler_t
)(void *);
35 BOCHSAPI
extern class bx_pc_system_c bx_pc_system
;
41 class BOCHSAPI bx_pc_system_c
: private logfunctions
{
44 // ===============================
45 // Timer oriented private features
46 // ===============================
49 bx_bool inUse
; // Timer slot is in-use (currently registered).
50 Bit64u period
; // Timer periodocity in cpu ticks.
51 Bit64u timeToFire
; // Time to fire next (in absolute ticks).
52 bx_bool active
; // 0=inactive, 1=active.
53 bx_bool continuous
; // 0=one-shot timer, 1=continuous periodicity.
54 bx_timer_handler_t funct
; // A callback function for when the
56 void *this_ptr
; // The this-> pointer for C++ callbacks
57 // has to be stored as well.
58 #define BxMaxTimerIDLen 32
59 char id
[BxMaxTimerIDLen
]; // String ID of timer.
60 } timer
[BX_MAX_TIMERS
];
62 unsigned numTimers
; // Number of currently allocated timers.
63 unsigned triggeredTimer
; // ID of the actually triggered timer.
64 Bit32u currCountdown
; // Current countdown ticks value (decrements to 0).
65 Bit32u currCountdownPeriod
; // Length of current countdown period.
66 Bit64u ticksTotal
; // Num ticks total since start of emulator execution.
67 Bit64u lastTimeUsec
; // Last sequentially read time in usec.
68 Bit64u usecSinceLast
; // Number of useconds claimed since then.
70 // A special null timer is always inserted in the timer[0] slot. This
71 // make sure that at least one timer is always active, and that the
72 // duration is always less than a maximum 32-bit integer, so a 32-bit
73 // counter can be used for the current countdown.
74 static const Bit64u NullTimerInterval
;
75 static void nullTimer(void* this_ptr
);
77 #if !defined(PROVIDE_M_IPS)
78 // This is the emulator speed, as measured in millions of
79 // x86 instructions per second that it can emulate on some hypothetically
81 double m_ips
; // Millions of Instructions Per Second
84 // This handler is called when the function which decrements the clock
85 // ticks finds that an event has occurred.
86 void countdownEvent(void);
90 // ==============================
91 // Timer oriented public features
92 // ==============================
94 void initialize(Bit32u ips
);
95 int register_timer(void *this_ptr
, bx_timer_handler_t
, Bit32u useconds
,
96 bx_bool continuous
, bx_bool active
, const char *id
);
97 bx_bool
unregisterTimer(unsigned timerID
);
98 void start_timers(void);
99 void activate_timer(unsigned timer_index
, Bit32u useconds
, bx_bool continuous
);
100 void deactivate_timer(unsigned timer_index
);
101 unsigned triggeredTimerID(void) {
102 return triggeredTimer
;
104 static BX_CPP_INLINE
void tick1(void) {
105 if (--bx_pc_system
.currCountdown
== 0) {
106 bx_pc_system
.countdownEvent();
109 static BX_CPP_INLINE
void tickn(Bit32u n
) {
110 while (n
>= bx_pc_system
.currCountdown
) {
111 n
-= bx_pc_system
.currCountdown
;
112 bx_pc_system
.currCountdown
= 0;
113 bx_pc_system
.countdownEvent();
114 // bx_pc_system.currCountdown is adjusted to new value by countdownevent().
116 // 'n' is not (or no longer) >= the countdown size. We can just decrement
117 // the remaining requested ticks and continue.
118 bx_pc_system
.currCountdown
-= n
;
121 int register_timer_ticks(void* this_ptr
, bx_timer_handler_t
, Bit64u ticks
,
122 bx_bool continuous
, bx_bool active
, const char *id
);
123 void activate_timer_ticks(unsigned index
, Bit64u instructions
,
126 Bit64u
time_usec_sequential();
127 static BX_CPP_INLINE Bit64u
time_ticks() {
128 return bx_pc_system
.ticksTotal
+
129 Bit64u(bx_pc_system
.currCountdownPeriod
- bx_pc_system
.currCountdown
);
132 static BX_CPP_INLINE Bit32u
getNumCpuTicksLeftNextEvent(void) {
133 return bx_pc_system
.currCountdown
;
136 static void timebp_handler(void* this_ptr
);
138 static void benchmarkTimer(void* this_ptr
);
140 // ===========================
141 // Non-timer oriented features
142 // ===========================
144 bx_bool HRQ
; // Hold Request
146 // Address line 20 control:
147 // 1 = enabled: extended memory is accessible
148 // 0 = disabled: A20 address line is forced low to simulate
149 // an 8088 address map
152 // start out masking physical memory addresses to:
156 // when A20 line is disabled, mask physical memory addresses to:
159 bx_phy_address a20_mask
;
161 volatile bx_bool kill_bochs_request
;
163 void set_HRQ(bx_bool val
); // set the Hold ReQuest line
164 void set_INTR(bx_bool value
); // set the INTR line to value
166 // Cpu and System Reset
167 int Reset(unsigned type
);
172 Bit32u
inp(Bit16u addr
, unsigned io_len
) BX_CPP_AttrRegparmN(2);
173 void outp(Bit16u addr
, Bit32u value
, unsigned io_len
) BX_CPP_AttrRegparmN(3);
174 void set_enable_a20(bx_bool value
);
175 bx_bool
get_enable_a20(void);
176 void MemoryMappingChanged(void); // flush TLB in all CPUs
177 void invlpg(bx_address addr
); // flush TLB page in all CPUs
179 void register_state(void);