On 28 March 2015 at 12:27, Christopher Covington <christopher.coving...@linaro.org> wrote: > Hi Peter, > > On Fri, Mar 27, 2015 at 12:40 PM, Peter Maydell > <peter.mayd...@linaro.org> wrote: >> On 27 March 2015 at 16:22, Christopher Covington >> <christopher.coving...@linaro.org> 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