summary refs log tree commit diff stats
path: root/results/classifier/105/semantic/2007
blob: af21a48f141970580851a612f4877c311f52d828 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
semantic: 0.833
device: 0.796
instruction: 0.778
graphic: 0.731
other: 0.657
network: 0.617
assembly: 0.594
vnc: 0.565
socket: 0.476
KVM: 0.441
boot: 0.428
mistranslation: 0.424

Unable to update APIC_TPR when x2APIC is enabled and -global kvm-pit.lost_tick_policy=discard parameter provided
Description of problem:
I am developing a custom OS and I wanted to implement x2APIC support. I was able to enable x2APIC, read and write some registers, like APIC_VER and APIC_SIVR. Everything looks good, except that I cannot update APIC_TPR register. Reading it always returns 0. The code I wrote works properly on bare metal. Below some observations:

Scenario 1:
1. Enable x2APIC
2. Write to CR8 - success
3. Read from CR8 - gives correct value
4. Read from APIC_TPR - gives correct value

Scenario 2:
1. Enable x2APIC
2. Read from APIC_TPR - gives 0
3. Write to APIC_TPR
4. Read from APIC_TPR - gives 0 again

Scenario 3:
1. Initialize APIC (LAPIC or xAPIC)
2. Write to APIC_TPR
3. Read from APIC_TPR - gives correct value
4. Switch to x2APIC
5. Read from APIC_TPR - gives correct value stored in pt. 2
6. Write to APIC_TPR
7. Read from APIC_TPR - gives values stored in pt.2, not in point 6!

Looks like APIC_TPR is stuck at value stored there before switching to x2APIC and it cannot be updated with MSR. Only update CR8 works.
I have checked parameters I passed to qemu. After removing `-global kvm-pit.lost_tick_policy=discard` problem is gone and APIC_TPR is updated correctly.
Additional information:
Please let me know if you need additional information.