Commit 8fa211e881ff386f8555c113b409aa3373dca7e1
1 parent
69dd5c9f
Implement tick interrupt disable bits
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6122 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
2 changed files
with
22 additions
and
10 deletions
hw/sun4u.c
| @@ -57,6 +57,9 @@ | @@ -57,6 +57,9 @@ | ||
| 57 | 57 | ||
| 58 | #define MAX_PILS 16 | 58 | #define MAX_PILS 16 |
| 59 | 59 | ||
| 60 | +#define TICK_INT_DIS 0x8000000000000000ULL | ||
| 61 | +#define TICK_MAX 0x7fffffffffffffffULL | ||
| 62 | + | ||
| 60 | struct hwdef { | 63 | struct hwdef { |
| 61 | const char * const default_cpu_model; | 64 | const char * const default_cpu_model; |
| 62 | uint16_t machine_id; | 65 | uint16_t machine_id; |
| @@ -269,11 +272,14 @@ static void main_cpu_reset(void *opaque) | @@ -269,11 +272,14 @@ static void main_cpu_reset(void *opaque) | ||
| 269 | CPUState *env = s->env; | 272 | CPUState *env = s->env; |
| 270 | 273 | ||
| 271 | cpu_reset(env); | 274 | cpu_reset(env); |
| 272 | - ptimer_set_limit(env->tick, 0x7fffffffffffffffULL, 1); | 275 | + env->tick_cmpr = TICK_INT_DIS | 0; |
| 276 | + ptimer_set_limit(env->tick, TICK_MAX, 1); | ||
| 273 | ptimer_run(env->tick, 0); | 277 | ptimer_run(env->tick, 0); |
| 274 | - ptimer_set_limit(env->stick, 0x7fffffffffffffffULL, 1); | 278 | + env->stick_cmpr = TICK_INT_DIS | 0; |
| 279 | + ptimer_set_limit(env->stick, TICK_MAX, 1); | ||
| 275 | ptimer_run(env->stick, 0); | 280 | ptimer_run(env->stick, 0); |
| 276 | - ptimer_set_limit(env->hstick, 0x7fffffffffffffffULL, 1); | 281 | + env->hstick_cmpr = TICK_INT_DIS | 0; |
| 282 | + ptimer_set_limit(env->hstick, TICK_MAX, 1); | ||
| 277 | ptimer_run(env->hstick, 0); | 283 | ptimer_run(env->hstick, 0); |
| 278 | env->gregs[1] = 0; // Memory start | 284 | env->gregs[1] = 0; // Memory start |
| 279 | env->gregs[2] = ram_size; // Memory size | 285 | env->gregs[2] = ram_size; // Memory size |
| @@ -286,24 +292,29 @@ static void tick_irq(void *opaque) | @@ -286,24 +292,29 @@ static void tick_irq(void *opaque) | ||
| 286 | { | 292 | { |
| 287 | CPUState *env = opaque; | 293 | CPUState *env = opaque; |
| 288 | 294 | ||
| 289 | - env->softint |= SOFTINT_TIMER; | ||
| 290 | - cpu_interrupt(env, CPU_INTERRUPT_TIMER); | 295 | + if (!(env->tick_cmpr & TICK_INT_DIS)) { |
| 296 | + env->softint |= SOFTINT_TIMER; | ||
| 297 | + cpu_interrupt(env, CPU_INTERRUPT_TIMER); | ||
| 298 | + } | ||
| 291 | } | 299 | } |
| 292 | 300 | ||
| 293 | static void stick_irq(void *opaque) | 301 | static void stick_irq(void *opaque) |
| 294 | { | 302 | { |
| 295 | CPUState *env = opaque; | 303 | CPUState *env = opaque; |
| 296 | 304 | ||
| 297 | - env->softint |= SOFTINT_TIMER; | ||
| 298 | - cpu_interrupt(env, CPU_INTERRUPT_TIMER); | 305 | + if (!(env->stick_cmpr & TICK_INT_DIS)) { |
| 306 | + env->softint |= SOFTINT_STIMER; | ||
| 307 | + cpu_interrupt(env, CPU_INTERRUPT_TIMER); | ||
| 308 | + } | ||
| 299 | } | 309 | } |
| 300 | 310 | ||
| 301 | static void hstick_irq(void *opaque) | 311 | static void hstick_irq(void *opaque) |
| 302 | { | 312 | { |
| 303 | CPUState *env = opaque; | 313 | CPUState *env = opaque; |
| 304 | 314 | ||
| 305 | - env->softint |= SOFTINT_TIMER; | ||
| 306 | - cpu_interrupt(env, CPU_INTERRUPT_TIMER); | 315 | + if (!(env->hstick_cmpr & TICK_INT_DIS)) { |
| 316 | + cpu_interrupt(env, CPU_INTERRUPT_TIMER); | ||
| 317 | + } | ||
| 307 | } | 318 | } |
| 308 | 319 | ||
| 309 | void cpu_tick_set_count(void *opaque, uint64_t count) | 320 | void cpu_tick_set_count(void *opaque, uint64_t count) |
target-sparc/cpu.h
| @@ -330,7 +330,8 @@ typedef struct CPUSPARCState { | @@ -330,7 +330,8 @@ typedef struct CPUSPARCState { | ||
| 330 | uint64_t hpstate, htstate[MAXTL_MAX], hintp, htba, hver, hstick_cmpr, ssr; | 330 | uint64_t hpstate, htstate[MAXTL_MAX], hintp, htba, hver, hstick_cmpr, ssr; |
| 331 | void *hstick; // UA 2005 | 331 | void *hstick; // UA 2005 |
| 332 | uint32_t softint; | 332 | uint32_t softint; |
| 333 | -#define SOFTINT_TIMER 1 | 333 | +#define SOFTINT_TIMER 1 |
| 334 | +#define SOFTINT_STIMER (1 << 16) | ||
| 334 | #endif | 335 | #endif |
| 335 | sparc_def_t *def; | 336 | sparc_def_t *def; |
| 336 | } CPUSPARCState; | 337 | } CPUSPARCState; |