hw/i386/apic: Ensure own APIC use in apic_msr_{read,write}
Avoids the `current_cpu` global and seems more robust by not "forgetting" the own APIC and then re-determining it by cpu_get_current_apic() which uses the global. Signed-off-by: Bernhard Beschow <shentey@gmail.com> Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> Message-ID: <20251019210303.104718-9-shentey@gmail.com> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
This commit is contained in:
parent
2fd15a24ca
commit
337eece9c0
4 changed files with 8 additions and 14 deletions
|
|
@ -881,11 +881,8 @@ static uint64_t apic_mem_read(void *opaque, hwaddr addr, unsigned size)
|
|||
return val;
|
||||
}
|
||||
|
||||
int apic_msr_read(int index, uint64_t *val)
|
||||
int apic_msr_read(APICCommonState *s, int index, uint64_t *val)
|
||||
{
|
||||
APICCommonState *s;
|
||||
|
||||
s = cpu_get_current_apic();
|
||||
if (!s) {
|
||||
return -1;
|
||||
}
|
||||
|
|
@ -1079,11 +1076,8 @@ static void apic_mem_write(void *opaque, hwaddr addr, uint64_t val,
|
|||
apic_register_write(index, val);
|
||||
}
|
||||
|
||||
int apic_msr_write(int index, uint64_t val)
|
||||
int apic_msr_write(APICCommonState *s, int index, uint64_t val)
|
||||
{
|
||||
APICCommonState *s;
|
||||
|
||||
s = cpu_get_current_apic();
|
||||
if (!s) {
|
||||
return -1;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -19,8 +19,8 @@ void apic_sipi(APICCommonState *s);
|
|||
void apic_poll_irq(APICCommonState *s);
|
||||
void apic_designate_bsp(APICCommonState *s, bool bsp);
|
||||
int apic_get_highest_priority_irr(APICCommonState *s);
|
||||
int apic_msr_read(int index, uint64_t *val);
|
||||
int apic_msr_write(int index, uint64_t val);
|
||||
int apic_msr_read(APICCommonState *s, int index, uint64_t *val);
|
||||
int apic_msr_write(APICCommonState *s, int index, uint64_t val);
|
||||
bool is_x2apic_mode(APICCommonState *s);
|
||||
|
||||
/* pc.c */
|
||||
|
|
|
|||
|
|
@ -527,7 +527,7 @@ void hvf_simulate_rdmsr(CPUState *cs)
|
|||
int ret;
|
||||
int index = (uint32_t)env->regs[R_ECX] - MSR_APIC_START;
|
||||
|
||||
ret = apic_msr_read(index, &val);
|
||||
ret = apic_msr_read(cpu->apic_state, index, &val);
|
||||
if (ret < 0) {
|
||||
x86_emul_raise_exception(env, EXCP0D_GPF, 0);
|
||||
}
|
||||
|
|
@ -638,7 +638,7 @@ void hvf_simulate_wrmsr(CPUState *cs)
|
|||
int ret;
|
||||
int index = (uint32_t)env->regs[R_ECX] - MSR_APIC_START;
|
||||
|
||||
ret = apic_msr_write(index, data);
|
||||
ret = apic_msr_write(cpu->apic_state, index, data);
|
||||
if (ret < 0) {
|
||||
x86_emul_raise_exception(env, EXCP0D_GPF, 0);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -299,7 +299,7 @@ void helper_wrmsr(CPUX86State *env)
|
|||
int index = (uint32_t)env->regs[R_ECX] - MSR_APIC_START;
|
||||
|
||||
bql_lock();
|
||||
ret = apic_msr_write(index, val);
|
||||
ret = apic_msr_write(env_archcpu(env)->apic_state, index, val);
|
||||
bql_unlock();
|
||||
if (ret < 0) {
|
||||
goto error;
|
||||
|
|
@ -477,7 +477,7 @@ void helper_rdmsr(CPUX86State *env)
|
|||
int index = (uint32_t)env->regs[R_ECX] - MSR_APIC_START;
|
||||
|
||||
bql_lock();
|
||||
ret = apic_msr_read(index, &val);
|
||||
ret = apic_msr_read(x86_cpu->apic_state, index, &val);
|
||||
bql_unlock();
|
||||
if (ret < 0) {
|
||||
raise_exception_err_ra(env, EXCP0D_GPF, 0, GETPC());
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue