[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH 3/3] arm: semihosting: Wire up A64 HLT 0xf000
From: |
Peter Maydell |
Subject: |
Re: [Qemu-devel] [PATCH 3/3] arm: semihosting: Wire up A64 HLT 0xf000 |
Date: |
Tue, 31 Mar 2015 12:22:57 +0100 |
On 28 March 2015 at 12:27, Christopher Covington
<address@hidden> wrote:
> Hi Peter,
>
> On Fri, Mar 27, 2015 at 12:40 PM, Peter Maydell
> <address@hidden> wrote:
>> On 27 March 2015 at 16:22, Christopher Covington
>> <address@hidden> wrote:
>>> + args = env->xregs[1];
>>> + if (nr != env->xregs[0] || nr != TARGET_SYS_EXIT) {
>>
>> What is the first part of this if condition intended to do?
>> (Note that the semihosting API number is passed in W0,
>> not X0...)
>
> The intention was to check that none of bits 63 through 32 were set,
> even if the lower half looked good.
However the spec for this API says w0, so we should ignore
the upper bits.
> Yes, w0 as opposed to x0 makes the
> most sense for moving the call number into its register, but I'd
> prefer to double check. Maybe using target_ulong for args would be
> better, as the default case of the switch statement would handle high
> bits being set on A64.
target_ulong is a bit odd here, because for a 32-bit
CPU being run from qemu-system-aarch64 it will be a
64 bit type even though the semihosting ABI should be
using 32 bit types. I would be wary of using it...
>>> @@ -1544,7 +1544,11 @@ static void disas_exc(DisasContext *s, uint32_t insn)
>>> break;
>>> }
>>> /* HLT */
>>> - unsupported_encoding(s, insn);
>>> + if (imm16 == 0xf000) {
>>
>> You need to have the semihosting_enabled check here rather
>> than in the do_interrupt code, because otherwise we won't
>> behave correctly in the disabled case.
>
> I don't think that's what A32 does, but I like it.
For A32/T32 we always take the exception, because the
"not enabled" case can fall through to the standard
bkpt/SWI handling code. Because for A64 there is no
handling for HLT there's nothing to fall through to.
In theory you could make the do_interrupt code handle
EXCP_SEMI with semihosting disabled correctly, but it's
much easier to just not generate it in the first place.
-- PMM
- Re: [Qemu-devel] arm: semihosting: Preliminary AArch64 support, (continued)
[Qemu-devel] [PATCH 2/3] arm: semihosting: Create unsupported call function, Christopher Covington, 2015/03/27
[Qemu-devel] [PATCH 1/3] arm: semihosting: Improve debug prints, Christopher Covington, 2015/03/27
[Qemu-devel] [PATCH 3/3] arm: semihosting: Wire up A64 HLT 0xf000, Christopher Covington, 2015/03/27