diff mbox series

[RFC,v18,08/15] i386: split smm helper (softmmu)

Message ID 20210212123622.15834-9-cfontana@suse.de (mailing list archive)
State New, archived
Headers show
Series i386 cleanup PART 2 | expand

Commit Message

Claudio Fontana Feb. 12, 2021, 12:36 p.m. UTC
smm is only really useful for softmmu, split in two modules
around the CONFIG_USER_ONLY, in order to remove the ifdef
and use the build system instead.

Signed-off-by: Claudio Fontana <cfontana@suse.de>
---
 target/i386/helper.h                       |  4 ++++
 target/i386/tcg/seg_helper.c               |  2 ++
 target/i386/tcg/{ => softmmu}/smm_helper.c | 19 ++-----------------
 target/i386/tcg/translate.c                |  2 ++
 target/i386/tcg/meson.build                |  1 -
 target/i386/tcg/softmmu/meson.build        |  1 +
 6 files changed, 11 insertions(+), 18 deletions(-)
 rename target/i386/tcg/{ => softmmu}/smm_helper.c (98%)

Comments

Claudio Fontana Feb. 15, 2021, 11:51 a.m. UTC | #1
On 2/12/21 1:36 PM, Claudio Fontana wrote:
> smm is only really useful for softmmu, split in two modules
> around the CONFIG_USER_ONLY, in order to remove the ifdef
> and use the build system instead.
> 
> Signed-off-by: Claudio Fontana <cfontana@suse.de>
> ---
>  target/i386/helper.h                       |  4 ++++
>  target/i386/tcg/seg_helper.c               |  2 ++
>  target/i386/tcg/{ => softmmu}/smm_helper.c | 19 ++-----------------
>  target/i386/tcg/translate.c                |  2 ++
>  target/i386/tcg/meson.build                |  1 -
>  target/i386/tcg/softmmu/meson.build        |  1 +
>  6 files changed, 11 insertions(+), 18 deletions(-)
>  rename target/i386/tcg/{ => softmmu}/smm_helper.c (98%)
> 
> diff --git a/target/i386/helper.h b/target/i386/helper.h
> index c2ae2f7e61..8ffda4cdc6 100644
> --- a/target/i386/helper.h
> +++ b/target/i386/helper.h
> @@ -70,7 +70,11 @@ DEF_HELPER_1(clac, void, env)
>  DEF_HELPER_1(stac, void, env)
>  DEF_HELPER_3(boundw, void, env, tl, int)
>  DEF_HELPER_3(boundl, void, env, tl, int)
> +
> +#ifndef CONFIG_USER_ONLY
>  DEF_HELPER_1(rsm, void, env)
> +#endif /* !CONFIG_USER_ONLY */
> +
>  DEF_HELPER_2(into, void, env, int)
>  DEF_HELPER_2(cmpxchg8b_unlocked, void, env, tl)
>  DEF_HELPER_2(cmpxchg8b, void, env, tl)
> diff --git a/target/i386/tcg/seg_helper.c b/target/i386/tcg/seg_helper.c
> index 180d47f0e9..f0cb1bffe7 100644
> --- a/target/i386/tcg/seg_helper.c
> +++ b/target/i386/tcg/seg_helper.c
> @@ -1351,7 +1351,9 @@ bool x86_cpu_exec_interrupt(CPUState *cs, int interrupt_request)
>      case CPU_INTERRUPT_SMI:
>          cpu_svm_check_intercept_param(env, SVM_EXIT_SMI, 0, 0);
>          cs->interrupt_request &= ~CPU_INTERRUPT_SMI;
> +#ifndef CONFIG_USER_ONLY
>          do_smm_enter(cpu);
> +#endif
>          break;
>      case CPU_INTERRUPT_NMI:
>          cpu_svm_check_intercept_param(env, SVM_EXIT_NMI, 0, 0);
> diff --git a/target/i386/tcg/smm_helper.c b/target/i386/tcg/softmmu/smm_helper.c
> similarity index 98%
> rename from target/i386/tcg/smm_helper.c
> rename to target/i386/tcg/softmmu/smm_helper.c
> index 62d027abd3..ee53b26629 100644
> --- a/target/i386/tcg/smm_helper.c
> +++ b/target/i386/tcg/softmmu/smm_helper.c
> @@ -1,5 +1,5 @@
>  /*
> - *  x86 SMM helpers
> + *  x86 SMM helpers (softmmu-only)
>   *
>   *  Copyright (c) 2003 Fabrice Bellard
>   *
> @@ -18,27 +18,14 @@
>   */
>  
>  #include "qemu/osdep.h"
> -#include "qemu/main-loop.h"
>  #include "cpu.h"
>  #include "exec/helper-proto.h"
>  #include "exec/log.h"
> -#include "helper-tcg.h"
> +#include "tcg/helper-tcg.h"
>  
>  
>  /* SMM support */
>  
> -#if defined(CONFIG_USER_ONLY)
> -
> -void do_smm_enter(X86CPU *cpu)
> -{
> -}
> -
> -void helper_rsm(CPUX86State *env)
> -{
> -}
> -
> -#else
> -
>  #ifdef TARGET_X86_64
>  #define SMM_REVISION_ID 0x00020064
>  #else
> @@ -330,5 +317,3 @@ void helper_rsm(CPUX86State *env)
>      qemu_log_mask(CPU_LOG_INT, "SMM: after RSM\n");
>      log_cpu_state_mask(CPU_LOG_INT, CPU(cpu), CPU_DUMP_CCOP);
>  }
> -
> -#endif /* !CONFIG_USER_ONLY */
> diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c
> index af1faf9342..5075ac4830 100644
> --- a/target/i386/tcg/translate.c
> +++ b/target/i386/tcg/translate.c
> @@ -8321,7 +8321,9 @@ static target_ulong disas_insn(DisasContext *s, CPUState *cpu)
>              goto illegal_op;
>          gen_update_cc_op(s);
>          gen_jmp_im(s, s->pc - s->cs_base);
> +#ifndef CONFIG_USER_ONLY
>          gen_helper_rsm(cpu_env);
> +#endif /* CONFIG_USER_ONLY */
>          gen_eob(s);
>          break;

Hello Alex,

this is something I wanted to bring in the foreground:

while before we were generating an empty helper call for CONFIG_USER_ONLY,
now we are not generating anything.



>      case 0x1b8: /* SSE4.2 popcnt */
> diff --git a/target/i386/tcg/meson.build b/target/i386/tcg/meson.build
> index 68fa0c3187..ec5daa1edc 100644
> --- a/target/i386/tcg/meson.build
> +++ b/target/i386/tcg/meson.build
> @@ -8,7 +8,6 @@ i386_ss.add(when: 'CONFIG_TCG', if_true: files(
>    'misc_helper.c',
>    'mpx_helper.c',
>    'seg_helper.c',
> -  'smm_helper.c',
>    'svm_helper.c',
>    'tcg-cpu.c',
>    'translate.c'), if_false: files('tcg-stub.c'))
> diff --git a/target/i386/tcg/softmmu/meson.build b/target/i386/tcg/softmmu/meson.build
> index 4ab30cc32e..35ba16dc3d 100644
> --- a/target/i386/tcg/softmmu/meson.build
> +++ b/target/i386/tcg/softmmu/meson.build
> @@ -1,3 +1,4 @@
>  i386_softmmu_ss.add(when: ['CONFIG_TCG', 'CONFIG_SOFTMMU'], if_true: files(
>    'tcg-cpu.c',
> +  'smm_helper.c',
>  ))
>
Alex Bennée Feb. 15, 2021, 12:32 p.m. UTC | #2
Claudio Fontana <cfontana@suse.de> writes:

> On 2/12/21 1:36 PM, Claudio Fontana wrote:
>> smm is only really useful for softmmu, split in two modules
>> around the CONFIG_USER_ONLY, in order to remove the ifdef
>> and use the build system instead.
>> 
>> Signed-off-by: Claudio Fontana <cfontana@suse.de>
>> ---
>>  target/i386/helper.h                       |  4 ++++
>>  target/i386/tcg/seg_helper.c               |  2 ++
>>  target/i386/tcg/{ => softmmu}/smm_helper.c | 19 ++-----------------
>>  target/i386/tcg/translate.c                |  2 ++
>>  target/i386/tcg/meson.build                |  1 -
>>  target/i386/tcg/softmmu/meson.build        |  1 +
>>  6 files changed, 11 insertions(+), 18 deletions(-)
>>  rename target/i386/tcg/{ => softmmu}/smm_helper.c (98%)
>> 
>> diff --git a/target/i386/helper.h b/target/i386/helper.h
>> index c2ae2f7e61..8ffda4cdc6 100644
>> --- a/target/i386/helper.h
>> +++ b/target/i386/helper.h
>> @@ -70,7 +70,11 @@ DEF_HELPER_1(clac, void, env)
>>  DEF_HELPER_1(stac, void, env)
>>  DEF_HELPER_3(boundw, void, env, tl, int)
>>  DEF_HELPER_3(boundl, void, env, tl, int)
>> +
>> +#ifndef CONFIG_USER_ONLY
>>  DEF_HELPER_1(rsm, void, env)
>> +#endif /* !CONFIG_USER_ONLY */
>> +
>>  DEF_HELPER_2(into, void, env, int)
>>  DEF_HELPER_2(cmpxchg8b_unlocked, void, env, tl)
>>  DEF_HELPER_2(cmpxchg8b, void, env, tl)
>> diff --git a/target/i386/tcg/seg_helper.c b/target/i386/tcg/seg_helper.c
>> index 180d47f0e9..f0cb1bffe7 100644
>> --- a/target/i386/tcg/seg_helper.c
>> +++ b/target/i386/tcg/seg_helper.c
>> @@ -1351,7 +1351,9 @@ bool x86_cpu_exec_interrupt(CPUState *cs, int interrupt_request)
>>      case CPU_INTERRUPT_SMI:
>>          cpu_svm_check_intercept_param(env, SVM_EXIT_SMI, 0, 0);
>>          cs->interrupt_request &= ~CPU_INTERRUPT_SMI;
>> +#ifndef CONFIG_USER_ONLY
>>          do_smm_enter(cpu);
>> +#endif
>>          break;
>>      case CPU_INTERRUPT_NMI:
>>          cpu_svm_check_intercept_param(env, SVM_EXIT_NMI, 0, 0);
>> diff --git a/target/i386/tcg/smm_helper.c b/target/i386/tcg/softmmu/smm_helper.c
>> similarity index 98%
>> rename from target/i386/tcg/smm_helper.c
>> rename to target/i386/tcg/softmmu/smm_helper.c
>> index 62d027abd3..ee53b26629 100644
>> --- a/target/i386/tcg/smm_helper.c
>> +++ b/target/i386/tcg/softmmu/smm_helper.c
>> @@ -1,5 +1,5 @@
>>  /*
>> - *  x86 SMM helpers
>> + *  x86 SMM helpers (softmmu-only)
>>   *
>>   *  Copyright (c) 2003 Fabrice Bellard
>>   *
>> @@ -18,27 +18,14 @@
>>   */
>>  
>>  #include "qemu/osdep.h"
>> -#include "qemu/main-loop.h"
>>  #include "cpu.h"
>>  #include "exec/helper-proto.h"
>>  #include "exec/log.h"
>> -#include "helper-tcg.h"
>> +#include "tcg/helper-tcg.h"
>>  
>>  
>>  /* SMM support */
>>  
>> -#if defined(CONFIG_USER_ONLY)
>> -
>> -void do_smm_enter(X86CPU *cpu)
>> -{
>> -}
>> -
>> -void helper_rsm(CPUX86State *env)
>> -{
>> -}
>> -
>> -#else
>> -
>>  #ifdef TARGET_X86_64
>>  #define SMM_REVISION_ID 0x00020064
>>  #else
>> @@ -330,5 +317,3 @@ void helper_rsm(CPUX86State *env)
>>      qemu_log_mask(CPU_LOG_INT, "SMM: after RSM\n");
>>      log_cpu_state_mask(CPU_LOG_INT, CPU(cpu), CPU_DUMP_CCOP);
>>  }
>> -
>> -#endif /* !CONFIG_USER_ONLY */
>> diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c
>> index af1faf9342..5075ac4830 100644
>> --- a/target/i386/tcg/translate.c
>> +++ b/target/i386/tcg/translate.c
>> @@ -8321,7 +8321,9 @@ static target_ulong disas_insn(DisasContext *s, CPUState *cpu)
>>              goto illegal_op;
>>          gen_update_cc_op(s);
>>          gen_jmp_im(s, s->pc - s->cs_base);
>> +#ifndef CONFIG_USER_ONLY
>>          gen_helper_rsm(cpu_env);
>> +#endif /* CONFIG_USER_ONLY */
>>          gen_eob(s);
>>          break;
>
> Hello Alex,
>
> this is something I wanted to bring in the foreground:
>
> while before we were generating an empty helper call for CONFIG_USER_ONLY,
> now we are not generating anything.

Surely that says we only generate the helper call when we are not
CONFIG_USER_ONLY?


>
>
>
>>      case 0x1b8: /* SSE4.2 popcnt */
>> diff --git a/target/i386/tcg/meson.build b/target/i386/tcg/meson.build
>> index 68fa0c3187..ec5daa1edc 100644
>> --- a/target/i386/tcg/meson.build
>> +++ b/target/i386/tcg/meson.build
>> @@ -8,7 +8,6 @@ i386_ss.add(when: 'CONFIG_TCG', if_true: files(
>>    'misc_helper.c',
>>    'mpx_helper.c',
>>    'seg_helper.c',
>> -  'smm_helper.c',
>>    'svm_helper.c',
>>    'tcg-cpu.c',
>>    'translate.c'), if_false: files('tcg-stub.c'))
>> diff --git a/target/i386/tcg/softmmu/meson.build b/target/i386/tcg/softmmu/meson.build
>> index 4ab30cc32e..35ba16dc3d 100644
>> --- a/target/i386/tcg/softmmu/meson.build
>> +++ b/target/i386/tcg/softmmu/meson.build
>> @@ -1,3 +1,4 @@
>>  i386_softmmu_ss.add(when: ['CONFIG_TCG', 'CONFIG_SOFTMMU'], if_true: files(
>>    'tcg-cpu.c',
>> +  'smm_helper.c',
>>  ))
>>
Claudio Fontana Feb. 15, 2021, 12:59 p.m. UTC | #3
On 2/15/21 1:32 PM, Alex Bennée wrote:
> 
> Claudio Fontana <cfontana@suse.de> writes:
> 
>> On 2/12/21 1:36 PM, Claudio Fontana wrote:
>>> smm is only really useful for softmmu, split in two modules
>>> around the CONFIG_USER_ONLY, in order to remove the ifdef
>>> and use the build system instead.
>>>
>>> Signed-off-by: Claudio Fontana <cfontana@suse.de>
>>> ---
>>>  target/i386/helper.h                       |  4 ++++
>>>  target/i386/tcg/seg_helper.c               |  2 ++
>>>  target/i386/tcg/{ => softmmu}/smm_helper.c | 19 ++-----------------
>>>  target/i386/tcg/translate.c                |  2 ++
>>>  target/i386/tcg/meson.build                |  1 -
>>>  target/i386/tcg/softmmu/meson.build        |  1 +
>>>  6 files changed, 11 insertions(+), 18 deletions(-)
>>>  rename target/i386/tcg/{ => softmmu}/smm_helper.c (98%)
>>>
>>> diff --git a/target/i386/helper.h b/target/i386/helper.h
>>> index c2ae2f7e61..8ffda4cdc6 100644
>>> --- a/target/i386/helper.h
>>> +++ b/target/i386/helper.h
>>> @@ -70,7 +70,11 @@ DEF_HELPER_1(clac, void, env)
>>>  DEF_HELPER_1(stac, void, env)
>>>  DEF_HELPER_3(boundw, void, env, tl, int)
>>>  DEF_HELPER_3(boundl, void, env, tl, int)
>>> +
>>> +#ifndef CONFIG_USER_ONLY
>>>  DEF_HELPER_1(rsm, void, env)
>>> +#endif /* !CONFIG_USER_ONLY */
>>> +
>>>  DEF_HELPER_2(into, void, env, int)
>>>  DEF_HELPER_2(cmpxchg8b_unlocked, void, env, tl)
>>>  DEF_HELPER_2(cmpxchg8b, void, env, tl)
>>> diff --git a/target/i386/tcg/seg_helper.c b/target/i386/tcg/seg_helper.c
>>> index 180d47f0e9..f0cb1bffe7 100644
>>> --- a/target/i386/tcg/seg_helper.c
>>> +++ b/target/i386/tcg/seg_helper.c
>>> @@ -1351,7 +1351,9 @@ bool x86_cpu_exec_interrupt(CPUState *cs, int interrupt_request)
>>>      case CPU_INTERRUPT_SMI:
>>>          cpu_svm_check_intercept_param(env, SVM_EXIT_SMI, 0, 0);
>>>          cs->interrupt_request &= ~CPU_INTERRUPT_SMI;
>>> +#ifndef CONFIG_USER_ONLY
>>>          do_smm_enter(cpu);
>>> +#endif
>>>          break;
>>>      case CPU_INTERRUPT_NMI:
>>>          cpu_svm_check_intercept_param(env, SVM_EXIT_NMI, 0, 0);
>>> diff --git a/target/i386/tcg/smm_helper.c b/target/i386/tcg/softmmu/smm_helper.c
>>> similarity index 98%
>>> rename from target/i386/tcg/smm_helper.c
>>> rename to target/i386/tcg/softmmu/smm_helper.c
>>> index 62d027abd3..ee53b26629 100644
>>> --- a/target/i386/tcg/smm_helper.c
>>> +++ b/target/i386/tcg/softmmu/smm_helper.c
>>> @@ -1,5 +1,5 @@
>>>  /*
>>> - *  x86 SMM helpers
>>> + *  x86 SMM helpers (softmmu-only)
>>>   *
>>>   *  Copyright (c) 2003 Fabrice Bellard
>>>   *
>>> @@ -18,27 +18,14 @@
>>>   */
>>>  
>>>  #include "qemu/osdep.h"
>>> -#include "qemu/main-loop.h"
>>>  #include "cpu.h"
>>>  #include "exec/helper-proto.h"
>>>  #include "exec/log.h"
>>> -#include "helper-tcg.h"
>>> +#include "tcg/helper-tcg.h"
>>>  
>>>  
>>>  /* SMM support */
>>>  
>>> -#if defined(CONFIG_USER_ONLY)
>>> -
>>> -void do_smm_enter(X86CPU *cpu)
>>> -{
>>> -}
>>> -
>>> -void helper_rsm(CPUX86State *env)
>>> -{
>>> -}
>>> -
>>> -#else
>>> -
>>>  #ifdef TARGET_X86_64
>>>  #define SMM_REVISION_ID 0x00020064
>>>  #else
>>> @@ -330,5 +317,3 @@ void helper_rsm(CPUX86State *env)
>>>      qemu_log_mask(CPU_LOG_INT, "SMM: after RSM\n");
>>>      log_cpu_state_mask(CPU_LOG_INT, CPU(cpu), CPU_DUMP_CCOP);
>>>  }
>>> -
>>> -#endif /* !CONFIG_USER_ONLY */
>>> diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c
>>> index af1faf9342..5075ac4830 100644
>>> --- a/target/i386/tcg/translate.c
>>> +++ b/target/i386/tcg/translate.c
>>> @@ -8321,7 +8321,9 @@ static target_ulong disas_insn(DisasContext *s, CPUState *cpu)
>>>              goto illegal_op;
>>>          gen_update_cc_op(s);
>>>          gen_jmp_im(s, s->pc - s->cs_base);
>>> +#ifndef CONFIG_USER_ONLY
>>>          gen_helper_rsm(cpu_env);
>>> +#endif /* CONFIG_USER_ONLY */
>>>          gen_eob(s);
>>>          break;
>>
>> Hello Alex,
>>
>> this is something I wanted to bring in the foreground:
>>
>> while before we were generating an empty helper call for CONFIG_USER_ONLY,
>> now we are not generating anything.
> 
> Surely that says we only generate the helper call when we are not
> CONFIG_USER_ONLY?

Yes. The difference between before the patch and after the patch
is that before we were still going through all the code in tcg_gen_callN,
via the call to gen_helper_rsm macro, only to call finally an empty function for CONFIG_USER_ONLY (helper_rsm() {}),

while now we do not generate anything, we do not call the gen_helper_rsm macro at all, so we don't go through tcg_gen_callN.

> 
> 
>>
>>
>>
>>>      case 0x1b8: /* SSE4.2 popcnt */
>>> diff --git a/target/i386/tcg/meson.build b/target/i386/tcg/meson.build
>>> index 68fa0c3187..ec5daa1edc 100644
>>> --- a/target/i386/tcg/meson.build
>>> +++ b/target/i386/tcg/meson.build
>>> @@ -8,7 +8,6 @@ i386_ss.add(when: 'CONFIG_TCG', if_true: files(
>>>    'misc_helper.c',
>>>    'mpx_helper.c',
>>>    'seg_helper.c',
>>> -  'smm_helper.c',
>>>    'svm_helper.c',
>>>    'tcg-cpu.c',
>>>    'translate.c'), if_false: files('tcg-stub.c'))
>>> diff --git a/target/i386/tcg/softmmu/meson.build b/target/i386/tcg/softmmu/meson.build
>>> index 4ab30cc32e..35ba16dc3d 100644
>>> --- a/target/i386/tcg/softmmu/meson.build
>>> +++ b/target/i386/tcg/softmmu/meson.build
>>> @@ -1,3 +1,4 @@
>>>  i386_softmmu_ss.add(when: ['CONFIG_TCG', 'CONFIG_SOFTMMU'], if_true: files(
>>>    'tcg-cpu.c',
>>> +  'smm_helper.c',
>>>  ))
>>>
> 
>
Paolo Bonzini Feb. 15, 2021, 1:30 p.m. UTC | #4
On 15/02/21 13:59, Claudio Fontana wrote:
> Yes. The difference between before the patch and after the patch
> is that before we were still going through all the code in tcg_gen_callN,
> via the call to gen_helper_rsm macro, only to call finally an empty function for CONFIG_USER_ONLY (helper_rsm() {}),
> 
> while now we do not generate anything, we do not call the gen_helper_rsm macro at all, so we don't go through tcg_gen_callN.
> 

Can we even have an abort() for such cases?

Paolo
Claudio Fontana Feb. 15, 2021, 2:05 p.m. UTC | #5
On 2/15/21 2:30 PM, Paolo Bonzini wrote:
> On 15/02/21 13:59, Claudio Fontana wrote:
>> Yes. The difference between before the patch and after the patch
>> is that before we were still going through all the code in tcg_gen_callN,
>> via the call to gen_helper_rsm macro, only to call finally an empty function for CONFIG_USER_ONLY (helper_rsm() {}),
>>
>> while now we do not generate anything, we do not call the gen_helper_rsm macro at all, so we don't go through tcg_gen_callN.
>>
> 
> Can we even have an abort() for such cases?
> 
> Paolo
> 

Hi Paolo,

where are you suggesting to have an abort()?

You mean that we should abort() QEMU as soon as we detect in translate.c an RSM instruction in user-mode?

Again the translate.c code for reference:

    case 0x1aa: /* rsm */
        gen_svm_check_intercept(s, pc_start, SVM_EXIT_RSM);
        if (!(s->flags & HF_SMM_MASK))
            goto illegal_op;
        gen_update_cc_op(s);
        gen_jmp_im(s, s->pc - s->cs_base);
#ifndef CONFIG_USER_ONLY
        gen_helper_rsm(cpu_env);
#endif /* CONFIG_USER_ONLY */
        gen_eob(s);
        break;

---

Thanks,

CLaudio
Paolo Bonzini Feb. 15, 2021, 2:13 p.m. UTC | #6
On 15/02/21 15:05, Claudio Fontana wrote:
> On 2/15/21 2:30 PM, Paolo Bonzini wrote:
>> On 15/02/21 13:59, Claudio Fontana wrote:
>>> Yes. The difference between before the patch and after the patch 
>>> is that before we were still going through all the code in
>>> tcg_gen_callN, via the call to gen_helper_rsm macro, only to call
>>> finally an empty function for CONFIG_USER_ONLY (helper_rsm()
>>> {}),
>>> 
>>> while now we do not generate anything, we do not call the
>>> gen_helper_rsm macro at all, so we don't go through
>>> tcg_gen_callN.
>>> 
>> 
>> Can we even have an abort() for such cases?
>> 
>> Paolo
>> 
> 
> Hi Paolo,
> 
> where are you suggesting to have an abort()?
> 
> You mean that we should abort() QEMU as soon as we detect in
> translate.c an RSM instruction in user-mode?

Translating it is okay (it's just a guaranteed SIGILL), but I'm thinking
of aborting if s->flags & HF_SMM_MASK is true.  Likewise if we see
CPU_INTERRUPT_SMI.

Paolo

> 
>     case 0x1aa: /* rsm */
>         gen_svm_check_intercept(s, pc_start, SVM_EXIT_RSM);
>         if (!(s->flags & HF_SMM_MASK))
>             goto illegal_op;
>         gen_update_cc_op(s);
>         gen_jmp_im(s, s->pc - s->cs_base);
> #ifndef CONFIG_USER_ONLY
>         gen_helper_rsm(cpu_env);
> #endif /* CONFIG_USER_ONLY */
>         gen_eob(s);
>         break;
Claudio Fontana Feb. 15, 2021, 2:39 p.m. UTC | #7
On 2/15/21 3:13 PM, Paolo Bonzini wrote:
> On 15/02/21 15:05, Claudio Fontana wrote:
>> On 2/15/21 2:30 PM, Paolo Bonzini wrote:
>>> On 15/02/21 13:59, Claudio Fontana wrote:
>>>> Yes. The difference between before the patch and after the patch 
>>>> is that before we were still going through all the code in
>>>> tcg_gen_callN, via the call to gen_helper_rsm macro, only to call
>>>> finally an empty function for CONFIG_USER_ONLY (helper_rsm()
>>>> {}),
>>>>
>>>> while now we do not generate anything, we do not call the
>>>> gen_helper_rsm macro at all, so we don't go through
>>>> tcg_gen_callN.
>>>>
>>>
>>> Can we even have an abort() for such cases?
>>>
>>> Paolo
>>>
>>
>> Hi Paolo,
>>
>> where are you suggesting to have an abort()?
>>
>> You mean that we should abort() QEMU as soon as we detect in
>> translate.c an RSM instruction in user-mode?
> 
> Translating it is okay (it's just a guaranteed SIGILL), but I'm thinking
> of aborting if s->flags & HF_SMM_MASK is true.  Likewise if we see
> CPU_INTERRUPT_SMI.
> 
> Paolo
> 

Ok, will rework as you suggest, thanks!

>>
>>     case 0x1aa: /* rsm */
>>         gen_svm_check_intercept(s, pc_start, SVM_EXIT_RSM);
>>         if (!(s->flags & HF_SMM_MASK))
>>             goto illegal_op;
>>         gen_update_cc_op(s);
>>         gen_jmp_im(s, s->pc - s->cs_base);
>> #ifndef CONFIG_USER_ONLY
>>         gen_helper_rsm(cpu_env);
>> #endif /* CONFIG_USER_ONLY */
>>         gen_eob(s);
>>         break;
> 
>
Claudio Fontana Feb. 15, 2021, 3:33 p.m. UTC | #8
On 2/15/21 3:39 PM, Claudio Fontana wrote:
> On 2/15/21 3:13 PM, Paolo Bonzini wrote:
>> On 15/02/21 15:05, Claudio Fontana wrote:
>>> On 2/15/21 2:30 PM, Paolo Bonzini wrote:
>>>> On 15/02/21 13:59, Claudio Fontana wrote:
>>>>> Yes. The difference between before the patch and after the patch 
>>>>> is that before we were still going through all the code in
>>>>> tcg_gen_callN, via the call to gen_helper_rsm macro, only to call
>>>>> finally an empty function for CONFIG_USER_ONLY (helper_rsm()
>>>>> {}),
>>>>>
>>>>> while now we do not generate anything, we do not call the
>>>>> gen_helper_rsm macro at all, so we don't go through
>>>>> tcg_gen_callN.
>>>>>
>>>>
>>>> Can we even have an abort() for such cases?
>>>>
>>>> Paolo
>>>>
>>>
>>> Hi Paolo,
>>>
>>> where are you suggesting to have an abort()?
>>>
>>> You mean that we should abort() QEMU as soon as we detect in
>>> translate.c an RSM instruction in user-mode?
>>
>> Translating it is okay (it's just a guaranteed SIGILL), but I'm thinking
>> of aborting if s->flags & HF_SMM_MASK is true.  Likewise if we see
>> CPU_INTERRUPT_SMI.
>>
>> Paolo
>>
> 
> Ok, will rework as you suggest, thanks!


By the way, in the case of gen_bpt_io, is it a similar situation,
where we should abort in user-mode if we see s->flags & HF_IOBPT_MASK ?


static void gen_bpt_io(DisasContext *s, TCGv_i32 t_port, int ot)
{
#ifndef CONFIG_USER_ONLY
    if (s->flags & HF_IOBPT_MASK) {
        TCGv_i32 t_size = tcg_const_i32(1 << ot);
        TCGv t_next = tcg_const_tl(s->pc - s->cs_base);

        gen_helper_bpt_io(cpu_env, t_port, t_size, t_next);
        tcg_temp_free_i32(t_size);
        tcg_temp_free(t_next);
    }
#endif /* !CONFIG_USER_ONLY */
}



What about other cases like


        case 0xd8: /* VMRUN */

            if (!(s->flags & HF_SVME_MASK) || !s->pe) {
                goto illegal_op;
            }

          ...

            gen_helper_vmrun(cpu_env, tcg_const_i32(s->aflag - 1),
                             tcg_const_i32(s->pc - pc_start));


should we abort there as well if CONFIG_USER_ONLY?

And there are many more probably, should it be its own patch?

Ciao,

Claudio

> 
>>>
>>>     case 0x1aa: /* rsm */
>>>         gen_svm_check_intercept(s, pc_start, SVM_EXIT_RSM);
>>>         if (!(s->flags & HF_SMM_MASK))
>>>             goto illegal_op;
>>>         gen_update_cc_op(s);
>>>         gen_jmp_im(s, s->pc - s->cs_base);
>>> #ifndef CONFIG_USER_ONLY
>>>         gen_helper_rsm(cpu_env);
>>> #endif /* CONFIG_USER_ONLY */
>>>         gen_eob(s);
>>>         break;
>>
>>
> 
>
diff mbox series

Patch

diff --git a/target/i386/helper.h b/target/i386/helper.h
index c2ae2f7e61..8ffda4cdc6 100644
--- a/target/i386/helper.h
+++ b/target/i386/helper.h
@@ -70,7 +70,11 @@  DEF_HELPER_1(clac, void, env)
 DEF_HELPER_1(stac, void, env)
 DEF_HELPER_3(boundw, void, env, tl, int)
 DEF_HELPER_3(boundl, void, env, tl, int)
+
+#ifndef CONFIG_USER_ONLY
 DEF_HELPER_1(rsm, void, env)
+#endif /* !CONFIG_USER_ONLY */
+
 DEF_HELPER_2(into, void, env, int)
 DEF_HELPER_2(cmpxchg8b_unlocked, void, env, tl)
 DEF_HELPER_2(cmpxchg8b, void, env, tl)
diff --git a/target/i386/tcg/seg_helper.c b/target/i386/tcg/seg_helper.c
index 180d47f0e9..f0cb1bffe7 100644
--- a/target/i386/tcg/seg_helper.c
+++ b/target/i386/tcg/seg_helper.c
@@ -1351,7 +1351,9 @@  bool x86_cpu_exec_interrupt(CPUState *cs, int interrupt_request)
     case CPU_INTERRUPT_SMI:
         cpu_svm_check_intercept_param(env, SVM_EXIT_SMI, 0, 0);
         cs->interrupt_request &= ~CPU_INTERRUPT_SMI;
+#ifndef CONFIG_USER_ONLY
         do_smm_enter(cpu);
+#endif
         break;
     case CPU_INTERRUPT_NMI:
         cpu_svm_check_intercept_param(env, SVM_EXIT_NMI, 0, 0);
diff --git a/target/i386/tcg/smm_helper.c b/target/i386/tcg/softmmu/smm_helper.c
similarity index 98%
rename from target/i386/tcg/smm_helper.c
rename to target/i386/tcg/softmmu/smm_helper.c
index 62d027abd3..ee53b26629 100644
--- a/target/i386/tcg/smm_helper.c
+++ b/target/i386/tcg/softmmu/smm_helper.c
@@ -1,5 +1,5 @@ 
 /*
- *  x86 SMM helpers
+ *  x86 SMM helpers (softmmu-only)
  *
  *  Copyright (c) 2003 Fabrice Bellard
  *
@@ -18,27 +18,14 @@ 
  */
 
 #include "qemu/osdep.h"
-#include "qemu/main-loop.h"
 #include "cpu.h"
 #include "exec/helper-proto.h"
 #include "exec/log.h"
-#include "helper-tcg.h"
+#include "tcg/helper-tcg.h"
 
 
 /* SMM support */
 
-#if defined(CONFIG_USER_ONLY)
-
-void do_smm_enter(X86CPU *cpu)
-{
-}
-
-void helper_rsm(CPUX86State *env)
-{
-}
-
-#else
-
 #ifdef TARGET_X86_64
 #define SMM_REVISION_ID 0x00020064
 #else
@@ -330,5 +317,3 @@  void helper_rsm(CPUX86State *env)
     qemu_log_mask(CPU_LOG_INT, "SMM: after RSM\n");
     log_cpu_state_mask(CPU_LOG_INT, CPU(cpu), CPU_DUMP_CCOP);
 }
-
-#endif /* !CONFIG_USER_ONLY */
diff --git a/target/i386/tcg/translate.c b/target/i386/tcg/translate.c
index af1faf9342..5075ac4830 100644
--- a/target/i386/tcg/translate.c
+++ b/target/i386/tcg/translate.c
@@ -8321,7 +8321,9 @@  static target_ulong disas_insn(DisasContext *s, CPUState *cpu)
             goto illegal_op;
         gen_update_cc_op(s);
         gen_jmp_im(s, s->pc - s->cs_base);
+#ifndef CONFIG_USER_ONLY
         gen_helper_rsm(cpu_env);
+#endif /* CONFIG_USER_ONLY */
         gen_eob(s);
         break;
     case 0x1b8: /* SSE4.2 popcnt */
diff --git a/target/i386/tcg/meson.build b/target/i386/tcg/meson.build
index 68fa0c3187..ec5daa1edc 100644
--- a/target/i386/tcg/meson.build
+++ b/target/i386/tcg/meson.build
@@ -8,7 +8,6 @@  i386_ss.add(when: 'CONFIG_TCG', if_true: files(
   'misc_helper.c',
   'mpx_helper.c',
   'seg_helper.c',
-  'smm_helper.c',
   'svm_helper.c',
   'tcg-cpu.c',
   'translate.c'), if_false: files('tcg-stub.c'))
diff --git a/target/i386/tcg/softmmu/meson.build b/target/i386/tcg/softmmu/meson.build
index 4ab30cc32e..35ba16dc3d 100644
--- a/target/i386/tcg/softmmu/meson.build
+++ b/target/i386/tcg/softmmu/meson.build
@@ -1,3 +1,4 @@ 
 i386_softmmu_ss.add(when: ['CONFIG_TCG', 'CONFIG_SOFTMMU'], if_true: files(
   'tcg-cpu.c',
+  'smm_helper.c',
 ))