1 smp mtrr support (Avi Kivity)
3 Signed-off-by: Avi Kivity <avi@qumranet.com>
4 Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
6 Index: bochs/bios/rombios.h
7 ===================================================================
8 --- bochs.orig/bios/rombios.h
9 +++ bochs/bios/rombios.h
11 #define ACPI_DATA_SIZE 0x00010000L
12 #define PM_IO_BASE 0xb000
13 #define SMB_IO_BASE 0xb100
14 +#define SMP_MSR_ADDR 0xf010
16 // Define the application NAME
18 Index: bochs/bios/rombios32.c
19 ===================================================================
20 --- bochs.orig/bios/rombios32.c
21 +++ bochs/bios/rombios32.c
22 @@ -472,6 +472,23 @@ void qemu_cfg_read(uint8_t *buf, int len
26 +void init_smp_msrs(void)
28 + *(uint32_t *)SMP_MSR_ADDR = 0;
31 +void wrmsr_smp(uint32_t index, uint64_t val)
33 + static struct { uint32_t ecx, eax, edx; } *p = (void *)SMP_MSR_ADDR;
46 @@ -519,32 +536,32 @@ void setup_mtrr(void)
47 for (i = 0; i < 8; ++i)
48 if (ram_size >= 65536 * (i + 1))
50 - wrmsr(MSR_MTRRfix64K_00000, u.val);
51 + wrmsr_smp(MSR_MTRRfix64K_00000, u.val);
53 for (i = 0; i < 8; ++i)
54 if (ram_size >= 65536 * 8 + 16384 * (i + 1))
56 - wrmsr(MSR_MTRRfix16K_80000, u.val);
57 - wrmsr(MSR_MTRRfix16K_A0000, 0);
58 - wrmsr(MSR_MTRRfix4K_C0000, 0);
59 - wrmsr(MSR_MTRRfix4K_C8000, 0);
60 - wrmsr(MSR_MTRRfix4K_D0000, 0);
61 - wrmsr(MSR_MTRRfix4K_D8000, 0);
62 - wrmsr(MSR_MTRRfix4K_E0000, 0);
63 - wrmsr(MSR_MTRRfix4K_E8000, 0);
64 - wrmsr(MSR_MTRRfix4K_F0000, 0);
65 - wrmsr(MSR_MTRRfix4K_F8000, 0);
66 + wrmsr_smp(MSR_MTRRfix16K_80000, u.val);
67 + wrmsr_smp(MSR_MTRRfix16K_A0000, 0);
68 + wrmsr_smp(MSR_MTRRfix4K_C0000, 0);
69 + wrmsr_smp(MSR_MTRRfix4K_C8000, 0);
70 + wrmsr_smp(MSR_MTRRfix4K_D0000, 0);
71 + wrmsr_smp(MSR_MTRRfix4K_D8000, 0);
72 + wrmsr_smp(MSR_MTRRfix4K_E0000, 0);
73 + wrmsr_smp(MSR_MTRRfix4K_E8000, 0);
74 + wrmsr_smp(MSR_MTRRfix4K_F0000, 0);
75 + wrmsr_smp(MSR_MTRRfix4K_F8000, 0);
77 --vcnt; /* leave one mtrr for VRAM */
78 for (i = 0; i < vcnt && vbase < ram_size; ++i) {
79 vmask = (1ull << 40) - 1;
80 while (vbase + vmask + 1 > ram_size)
82 - wrmsr(MTRRphysBase_MSR(i), vbase | 6);
83 - wrmsr(MTRRphysMask_MSR(i), (~vmask & 0xfffffff000ull) | 0x800);
84 + wrmsr_smp(MTRRphysBase_MSR(i), vbase | 6);
85 + wrmsr_smp(MTRRphysMask_MSR(i), (~vmask & 0xfffffff000ull) | 0x800);
88 - wrmsr(MSR_MTRRdefType, 0xc00);
89 + wrmsr_smp(MSR_MTRRdefType, 0xc00);
93 @@ -2263,6 +2280,8 @@ void rombios32_init(uint32_t *s3_resume_
94 qemu_cfg_port = qemu_cfg_port_probe();
102 Index: bochs/bios/rombios32start.S
103 ===================================================================
104 --- bochs.orig/bios/rombios32start.S
105 +++ bochs/bios/rombios32start.S
106 @@ -49,6 +49,18 @@ _start:
107 smp_ap_boot_code_start:
111 + mov $SMP_MSR_ADDR, %ebx