diff mbox series

[v3,18/27] target/arm: Restrict semi-hosting to TCG

Message ID 20190701132516.26392-19-philmd@redhat.com (mailing list archive)
State New, archived
Headers show
Series Support disabling TCG on ARM | expand

Commit Message

Philippe Mathieu-Daudé July 1, 2019, 1:25 p.m. UTC
Per Peter Maydell:

  Semihosting hooks either SVC or HLT instructions, and inside KVM
  both of those go to EL1, ie to the guest, and can't be trapped to
  KVM.

Let check_for_semihosting() return False when not running on TCG.

Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
---
v3: inline call to g_assert_not_reached if !TCG
---
 target/arm/Makefile.objs | 2 +-
 target/arm/cpu.h         | 7 +++++++
 target/arm/helper.c      | 4 +++-
 3 files changed, 11 insertions(+), 2 deletions(-)

Comments

Peter Maydell July 1, 2019, 3:25 p.m. UTC | #1
On Mon, 1 Jul 2019 at 14:26, Philippe Mathieu-Daudé <philmd@redhat.com> wrote:
>
> Per Peter Maydell:
>
>   Semihosting hooks either SVC or HLT instructions, and inside KVM
>   both of those go to EL1, ie to the guest, and can't be trapped to
>   KVM.
>
> Let check_for_semihosting() return False when not running on TCG.
>
> Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
> ---
> v3: inline call to g_assert_not_reached if !TCG
> ---
>  target/arm/Makefile.objs | 2 +-
>  target/arm/cpu.h         | 7 +++++++
>  target/arm/helper.c      | 4 +++-
>  3 files changed, 11 insertions(+), 2 deletions(-)

> diff --git a/target/arm/helper.c b/target/arm/helper.c
> index 49a0f05cd1..1b4da7aa45 100644
> --- a/target/arm/helper.c
> +++ b/target/arm/helper.c
> @@ -20,7 +20,6 @@
>  #include "qemu/qemu-print.h"
>  #include "exec/exec-all.h"
>  #include "exec/cpu_ldst.h"
> -#include "arm_ldst.h"
>  #include <zlib.h> /* For crc32 */
>  #include "hw/semihosting/semihost.h"
>  #include "sysemu/cpus.h"
> @@ -29,6 +28,9 @@
>  #include "qapi/qapi-commands-target.h"
>  #include "qapi/error.h"
>  #include "qemu/guest-random.h"
> +#ifdef CONFIG_TCG
> +#include "arm_ldst.h"
> +#endif

Should this ifdeffing of the arm_ldst.h include have gone in
another patch? It doesn't seem related to the change described
in the commit message.

thanks
-- PMM
Philippe Mathieu-Daudé July 1, 2019, 3:38 p.m. UTC | #2
On 7/1/19 5:25 PM, Peter Maydell wrote:
> On Mon, 1 Jul 2019 at 14:26, Philippe Mathieu-Daudé <philmd@redhat.com> wrote:
>>
>> Per Peter Maydell:
>>
>>   Semihosting hooks either SVC or HLT instructions, and inside KVM
>>   both of those go to EL1, ie to the guest, and can't be trapped to
>>   KVM.
>>
>> Let check_for_semihosting() return False when not running on TCG.
>>
>> Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
>> ---
>> v3: inline call to g_assert_not_reached if !TCG
>> ---
>>  target/arm/Makefile.objs | 2 +-
>>  target/arm/cpu.h         | 7 +++++++
>>  target/arm/helper.c      | 4 +++-
>>  3 files changed, 11 insertions(+), 2 deletions(-)
> 
>> diff --git a/target/arm/helper.c b/target/arm/helper.c
>> index 49a0f05cd1..1b4da7aa45 100644
>> --- a/target/arm/helper.c
>> +++ b/target/arm/helper.c
>> @@ -20,7 +20,6 @@
>>  #include "qemu/qemu-print.h"
>>  #include "exec/exec-all.h"
>>  #include "exec/cpu_ldst.h"
>> -#include "arm_ldst.h"
>>  #include <zlib.h> /* For crc32 */
>>  #include "hw/semihosting/semihost.h"
>>  #include "sysemu/cpus.h"
>> @@ -29,6 +28,9 @@
>>  #include "qapi/qapi-commands-target.h"
>>  #include "qapi/error.h"
>>  #include "qemu/guest-random.h"
>> +#ifdef CONFIG_TCG
>> +#include "arm_ldst.h"
>> +#endif
> 
> Should this ifdeffing of the arm_ldst.h include have gone in
> another patch? It doesn't seem related to the change described
> in the commit message.

Surely patch 22 "Move M profile routines to m_helper.c"
Philippe Mathieu-Daudé July 1, 2019, 4:10 p.m. UTC | #3
On 7/1/19 5:38 PM, Philippe Mathieu-Daudé wrote:
> On 7/1/19 5:25 PM, Peter Maydell wrote:
>> On Mon, 1 Jul 2019 at 14:26, Philippe Mathieu-Daudé <philmd@redhat.com> wrote:
>>>
>>> Per Peter Maydell:
>>>
>>>   Semihosting hooks either SVC or HLT instructions, and inside KVM
>>>   both of those go to EL1, ie to the guest, and can't be trapped to
>>>   KVM.
>>>
>>> Let check_for_semihosting() return False when not running on TCG.
>>>
>>> Signed-off-by: Philippe Mathieu-Daudé <philmd@redhat.com>
>>> ---
>>> v3: inline call to g_assert_not_reached if !TCG
>>> ---
>>>  target/arm/Makefile.objs | 2 +-
>>>  target/arm/cpu.h         | 7 +++++++
>>>  target/arm/helper.c      | 4 +++-
>>>  3 files changed, 11 insertions(+), 2 deletions(-)
>>
>>> diff --git a/target/arm/helper.c b/target/arm/helper.c
>>> index 49a0f05cd1..1b4da7aa45 100644
>>> --- a/target/arm/helper.c
>>> +++ b/target/arm/helper.c
>>> @@ -20,7 +20,6 @@
>>>  #include "qemu/qemu-print.h"
>>>  #include "exec/exec-all.h"
>>>  #include "exec/cpu_ldst.h"
>>> -#include "arm_ldst.h"
>>>  #include <zlib.h> /* For crc32 */
>>>  #include "hw/semihosting/semihost.h"
>>>  #include "sysemu/cpus.h"
>>> @@ -29,6 +28,9 @@
>>>  #include "qapi/qapi-commands-target.h"
>>>  #include "qapi/error.h"
>>>  #include "qemu/guest-random.h"
>>> +#ifdef CONFIG_TCG
>>> +#include "arm_ldst.h"
>>> +#endif
>>
>> Should this ifdeffing of the arm_ldst.h include have gone in
>> another patch? It doesn't seem related to the change described
>> in the commit message.
> 
> Surely patch 22 "Move M profile routines to m_helper.c"

The ifdef belongs to this patch, but some part of this patch slipped to
"Move M profile routines to m_helper.c" while rebasing:

-- >8 --
@@ -10401,6 +8260,7 @@ static void arm_cpu_do_interrupt_aarch64(CPUState
*cs)

 static inline bool check_for_semihosting(CPUState *cs)
 {
+#ifdef CONFIG_TCG
     /* Check whether this exception is a semihosting call; if so
      * then handle it and return true; otherwise return false.
      */
@@ -10476,6 +8336,9 @@ static inline bool check_for_semihosting(CPUState
*cs)
         env->regs[0] = do_arm_semihosting(env);
         return true;
     }
+#else
+    return false;
+#endif
 }
---

check_for_semihosting() is the only code using the ldst API.

Thanks for noticing this,

Phil.
diff mbox series

Patch

diff --git a/target/arm/Makefile.objs b/target/arm/Makefile.objs
index 294433da88..82bedefc3d 100644
--- a/target/arm/Makefile.objs
+++ b/target/arm/Makefile.objs
@@ -1,4 +1,4 @@ 
-obj-y += arm-semi.o
+obj-$(CONFIG_TCG) += arm-semi.o
 obj-y += helper.o vfp_helper.o
 obj-y += cpu.o gdbstub.o
 obj-$(TARGET_AARCH64) += cpu64.o gdbstub64.o
diff --git a/target/arm/cpu.h b/target/arm/cpu.h
index a9be18660f..94c990cddb 100644
--- a/target/arm/cpu.h
+++ b/target/arm/cpu.h
@@ -964,7 +964,14 @@  static inline void aarch64_sve_change_el(CPUARMState *env, int o,
 { }
 #endif
 
+#if !defined(CONFIG_TCG)
+static inline target_ulong do_arm_semihosting(CPUARMState *env)
+{
+    g_assert_not_reached();
+}
+#else
 target_ulong do_arm_semihosting(CPUARMState *env);
+#endif
 void aarch64_sync_32_to_64(CPUARMState *env);
 void aarch64_sync_64_to_32(CPUARMState *env);
 
diff --git a/target/arm/helper.c b/target/arm/helper.c
index 49a0f05cd1..1b4da7aa45 100644
--- a/target/arm/helper.c
+++ b/target/arm/helper.c
@@ -20,7 +20,6 @@ 
 #include "qemu/qemu-print.h"
 #include "exec/exec-all.h"
 #include "exec/cpu_ldst.h"
-#include "arm_ldst.h"
 #include <zlib.h> /* For crc32 */
 #include "hw/semihosting/semihost.h"
 #include "sysemu/cpus.h"
@@ -29,6 +28,9 @@ 
 #include "qapi/qapi-commands-target.h"
 #include "qapi/error.h"
 #include "qemu/guest-random.h"
+#ifdef CONFIG_TCG
+#include "arm_ldst.h"
+#endif
 
 #define ARM_CPU_FREQ 1000000000 /* FIXME: 1 GHz, should be configurable */