[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v2 6/8] cpu: make CPU_INTERRUPT_RESET available
From: |
Peter Maydell |
Subject: |
Re: [Qemu-devel] [PATCH v2 6/8] cpu: make CPU_INTERRUPT_RESET available on all targets |
Date: |
Sat, 24 May 2014 16:54:09 +0100 |
On 24 May 2014 13:59, Paolo Bonzini <address@hidden> wrote:
> Il 24/05/2014 10:30, Peter Maydell ha scritto:
>> Well, I'm planning to move the bodies of all the ifdefs into
>> a cpu_check_interrupts() provided by the target's cpu.h[*].
>> This x86 bit is just awkward because it means there's
>> x86 stuff both before and after the generic reset code.
>
> What about
>
> if (interrupt_request & CPU_INTERRUPT_DEBUG) {
> cpu->interrupt_request &= ~CPU_INTERRUPT_DEBUG;
> cpu->exception_index = EXCP_DEBUG;
> cpu_loop_exit(cpu);
> }
> if (!cpu_check_interrupts(...)) {
> if (interrupt_request & CPU_INTERRUPT_HALT) {
> cpu->interrupt_request &= ~CPU_INTERRUPT_HALT;
> cpu->halted = 1;
> cpu->exception_index = EXCP_HLT;
> cpu_loop_exit(cpu);
> }
> if (interrupt_request & CPU_INTERRUPT_RESET) {
> cpu_reset(cpu);
> }
> }
>
> Then:
> - only X86 returns 1 for CPU_INTERRUPT_RESET
> - all except ARM/SPARC/MIPS/PPC/Alpha/cris/MicroBlaze/LM32/Unicore32
> return 1 for CPU_INTERRUPT_HALT
That last point sounds wrong, at least -- halt should work
the same way for everything. If the target doesn't want
to halt it should never set the HALT bit in interrupt_request.
>> [*] not a cpu method since it seemed like it would be
>> a bad idea to have a function pointer call every
>> time round the main loop when there's a blocked
>> interrupt...
>
> We have that already for cc->do_interrupt, which could be
> "devirtualized" if you add a check_interrupts method... In
> the end you'd be adding a function pointer call for all
> interrupt requests but removing one for CPU_INTERRUPT_HARD
> (and FIQ too on ARM). That should be a wash.
But we only call cc->do_interrupt if we're going to actually
*take* an interrupt, in which case the bulk of the cost is
actually doing the work. I don't want to call via a pointer
just for the other end to say "actually PSTATE_I is set
because the guest has interrupts blocked, so don't do
anything".
thanks
-- PMM
- [Qemu-devel] [PATCH v2 7/8] pc: port 92 reset requires a low->high transition, (continued)
[Qemu-devel] [PATCH v2 8/8] x86: correctly implement soft reset, Paolo Bonzini, 2014/05/02
Re: [Qemu-devel] [PATCH v2 0/8] x86: correctly implement soft reset, Michael S. Tsirkin, 2014/05/05