mirror of
				https://github.com/qemu/qemu.git
				synced 2025-10-31 12:07:31 +00:00 
			
		
		
		
	i386: split smm helper (sysemu)
smm is only really useful for sysemu, split in two modules around the CONFIG_USER_ONLY, in order to remove the ifdef and use the build system instead. add cpu_abort() when detecting attempts to enter SMM mode via SMI interrupt in user-mode, and assert that the cpu is not in SMM mode while translating RSM instructions. Signed-off-by: Claudio Fontana <cfontana@suse.de> Cc: Paolo Bonzini <pbonzini@redhat.com> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-Id: <20210322132800.7470-12-cfontana@suse.de> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
		
							parent
							
								
									222f3e6f19
								
							
						
					
					
						commit
						a93b55ec22
					
				| @ -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) | ||||
|  | ||||
| @ -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')) | ||||
|  | ||||
| @ -1351,7 +1351,11 @@ 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; | ||||
| #ifdef CONFIG_USER_ONLY | ||||
|         cpu_abort(CPU(cpu), "SMI interrupt: cannot enter SMM in user-mode"); | ||||
| #else | ||||
|         do_smm_enter(cpu); | ||||
| #endif /* CONFIG_USER_ONLY */ | ||||
|         break; | ||||
|     case CPU_INTERRUPT_NMI: | ||||
|         cpu_svm_check_intercept_param(env, SVM_EXIT_NMI, 0, 0); | ||||
|  | ||||
| @ -1,3 +1,4 @@ | ||||
| i386_softmmu_ss.add(when: ['CONFIG_TCG', 'CONFIG_SOFTMMU'], if_true: files( | ||||
|   'tcg-cpu.c', | ||||
|   'smm_helper.c', | ||||
| )) | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| /*
 | ||||
|  *  x86 SMM helpers | ||||
|  *  x86 SMM helpers (sysemu-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 */ | ||||
| @ -8325,9 +8325,14 @@ static target_ulong disas_insn(DisasContext *s, CPUState *cpu) | ||||
|         gen_svm_check_intercept(s, pc_start, SVM_EXIT_RSM); | ||||
|         if (!(s->flags & HF_SMM_MASK)) | ||||
|             goto illegal_op; | ||||
| #ifdef CONFIG_USER_ONLY | ||||
|         /* we should not be in SMM mode */ | ||||
|         g_assert_not_reached(); | ||||
| #else | ||||
|         gen_update_cc_op(s); | ||||
|         gen_jmp_im(s, s->pc - s->cs_base); | ||||
|         gen_helper_rsm(cpu_env); | ||||
| #endif /* CONFIG_USER_ONLY */ | ||||
|         gen_eob(s); | ||||
|         break; | ||||
|     case 0x1b8: /* SSE4.2 popcnt */ | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Claudio Fontana
						Claudio Fontana