]> git.proxmox.com Git - qemu.git/blob - pc-bios/bios-pq/0005_kvm-bios-smp-mtrr-support.patch
Add "static"
[qemu.git] / pc-bios / bios-pq / 0005_kvm-bios-smp-mtrr-support.patch
1 smp mtrr support (Avi Kivity)
2
3 Signed-off-by: Avi Kivity <avi@qumranet.com>
4 Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
5
6 Index: bochs/bios/rombios.h
7 ===================================================================
8 --- bochs.orig/bios/rombios.h
9 +++ bochs/bios/rombios.h
10 @@ -56,6 +56,7 @@
11 #define ACPI_DATA_SIZE 0x00010000L
12 #define PM_IO_BASE 0xb000
13 #define SMB_IO_BASE 0xb100
14 +#define SMP_MSR_ADDR 0xf010
15
16 // Define the application NAME
17 #if defined(BX_QEMU)
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
23 }
24 #endif
25
26 +void init_smp_msrs(void)
27 +{
28 + *(uint32_t *)SMP_MSR_ADDR = 0;
29 +}
30 +
31 +void wrmsr_smp(uint32_t index, uint64_t val)
32 +{
33 + static struct { uint32_t ecx, eax, edx; } *p = (void *)SMP_MSR_ADDR;
34 +
35 + wrmsr(index, val);
36 + p->ecx = index;
37 + p->eax = val;
38 + p->edx = val >> 32;
39 + ++p;
40 + p->ecx = 0;
41 +}
42 +
43 void uuid_probe(void)
44 {
45 #ifdef BX_QEMU
46 @@ -519,32 +536,32 @@ void setup_mtrr(void)
47 for (i = 0; i < 8; ++i)
48 if (ram_size >= 65536 * (i + 1))
49 u.valb[i] = 6;
50 - wrmsr(MSR_MTRRfix64K_00000, u.val);
51 + wrmsr_smp(MSR_MTRRfix64K_00000, u.val);
52 u.val = 0;
53 for (i = 0; i < 8; ++i)
54 if (ram_size >= 65536 * 8 + 16384 * (i + 1))
55 u.valb[i] = 6;
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);
76 vbase = 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)
81 vmask >>= 1;
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);
86 vbase += vmask + 1;
87 }
88 - wrmsr(MSR_MTRRdefType, 0xc00);
89 + wrmsr_smp(MSR_MTRRdefType, 0xc00);
90 }
91
92 void ram_probe(void)
93 @@ -2263,6 +2280,8 @@ void rombios32_init(uint32_t *s3_resume_
94 qemu_cfg_port = qemu_cfg_port_probe();
95 #endif
96
97 + init_smp_msrs();
98 +
99 ram_probe();
100
101 cpu_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:
108 xor %ax, %ax
109 mov %ax, %ds
110 +
111 + mov $SMP_MSR_ADDR, %ebx
112 +11:
113 + mov 0(%ebx), %ecx
114 + test %ecx, %ecx
115 + jz 12f
116 + mov 4(%ebx), %eax
117 + mov 8(%ebx), %edx
118 + wrmsr
119 + add $12, %ebx
120 + jmp 11b
121 +12:
122 lock incw smp_cpus
123 1:
124 hlt
125
126