Commit 9230e66e5c711bd077705465d34161d6b1e7fee7
1 parent
0523c6b7
CR8 support
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1237 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
3 changed files
with
21 additions
and
11 deletions
hw/apic.c
| ... | ... | @@ -100,6 +100,18 @@ uint64_t cpu_get_apic_base(CPUState *env) |
| 100 | 100 | return s->apicbase; |
| 101 | 101 | } |
| 102 | 102 | |
| 103 | +void cpu_set_apic_tpr(CPUX86State *env, uint8_t val) | |
| 104 | +{ | |
| 105 | + APICState *s = env->apic_state; | |
| 106 | + s->tpr = (val & 0x0f) << 4; | |
| 107 | +} | |
| 108 | + | |
| 109 | +uint8_t cpu_get_apic_tpr(CPUX86State *env) | |
| 110 | +{ | |
| 111 | + APICState *s = env->apic_state; | |
| 112 | + return s->tpr >> 4; | |
| 113 | +} | |
| 114 | + | |
| 103 | 115 | /* return -1 if no bit is set */ |
| 104 | 116 | static int get_highest_priority_int(uint32_t *tab) |
| 105 | 117 | { | ... | ... |
target-i386/cpu.h
| ... | ... | @@ -509,15 +509,6 @@ typedef struct CPUX86State { |
| 509 | 509 | void *opaque; |
| 510 | 510 | } CPUX86State; |
| 511 | 511 | |
| 512 | -#ifndef IN_OP_I386 | |
| 513 | -void cpu_x86_outb(CPUX86State *env, int addr, int val); | |
| 514 | -void cpu_x86_outw(CPUX86State *env, int addr, int val); | |
| 515 | -void cpu_x86_outl(CPUX86State *env, int addr, int val); | |
| 516 | -int cpu_x86_inb(CPUX86State *env, int addr); | |
| 517 | -int cpu_x86_inw(CPUX86State *env, int addr); | |
| 518 | -int cpu_x86_inl(CPUX86State *env, int addr); | |
| 519 | -#endif | |
| 520 | - | |
| 521 | 512 | CPUX86State *cpu_x86_init(void); |
| 522 | 513 | int cpu_x86_exec(CPUX86State *s); |
| 523 | 514 | void cpu_x86_close(CPUX86State *s); |
| ... | ... | @@ -615,6 +606,10 @@ uint64_t cpu_get_tsc(CPUX86State *env); |
| 615 | 606 | |
| 616 | 607 | void cpu_set_apic_base(CPUX86State *env, uint64_t val); |
| 617 | 608 | uint64_t cpu_get_apic_base(CPUX86State *env); |
| 609 | +void cpu_set_apic_tpr(CPUX86State *env, uint8_t val); | |
| 610 | +#ifndef NO_CPU_IO_DEFS | |
| 611 | +uint8_t cpu_get_apic_tpr(CPUX86State *env); | |
| 612 | +#endif | |
| 618 | 613 | |
| 619 | 614 | /* will be suppressed */ |
| 620 | 615 | void cpu_x86_update_cr0(CPUX86State *env, uint32_t new_cr0); | ... | ... |
target-i386/translate.c
| ... | ... | @@ -5631,17 +5631,20 @@ static target_ulong disas_insn(DisasContext *s, target_ulong pc_start) |
| 5631 | 5631 | case 2: |
| 5632 | 5632 | case 3: |
| 5633 | 5633 | case 4: |
| 5634 | + case 8: | |
| 5634 | 5635 | if (b & 2) { |
| 5635 | 5636 | gen_op_mov_TN_reg[ot][0][rm](); |
| 5636 | 5637 | gen_op_movl_crN_T0(reg); |
| 5637 | 5638 | gen_jmp_im(s->pc - s->cs_base); |
| 5638 | 5639 | gen_eob(s); |
| 5639 | 5640 | } else { |
| 5640 | - gen_op_movtl_T0_env(offsetof(CPUX86State,cr[reg])); | |
| 5641 | + if (reg == 8) | |
| 5642 | + gen_op_movtl_T0_cr8(); | |
| 5643 | + else | |
| 5644 | + gen_op_movtl_T0_env(offsetof(CPUX86State,cr[reg])); | |
| 5641 | 5645 | gen_op_mov_reg_T0[ot][rm](); |
| 5642 | 5646 | } |
| 5643 | 5647 | break; |
| 5644 | - /* XXX: add CR8 for x86_64 */ | |
| 5645 | 5648 | default: |
| 5646 | 5649 | goto illegal_op; |
| 5647 | 5650 | } | ... | ... |