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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
|
# Commit 3659f54e9bd31f0f59268402fd67fb4b4118e184
# Date 2020-06-02 19:18:44 +0100
# Author Andrew Cooper <andrew.cooper3@citrix.com>
# Committer Andrew Cooper <andrew.cooper3@citrix.com>
x86/ucode: Fix errors with start/end_update()
c/s 9267a439c "x86/ucode: Document the behaviour of the microcode_ops hooks"
identified several poor behaviours of the start_update()/end_update_percpu()
hooks.
AMD have subsequently confirmed that OSVW don't, and are not expected to,
change across a microcode load, rendering all of this complexity unecessary.
Instead of fixing up the logic to not leave the OSVW state reset in a number
of corner cases, delete the logic entirely.
This in turn allows for the removal of the poorly-named 'start_update'
parameter to microcode_update_one(), and for svm_host_osvw_{init,reset}() to
become static.
Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Reviewed-by: Roger Pau Monné <roger.pau@citrix.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
--- a/xen/arch/x86/acpi/power.c
+++ b/xen/arch/x86/acpi/power.c
@@ -286,7 +286,7 @@ static int enter_state(u32 state)
console_end_sync();
watchdog_enable();
- microcode_update_one(true);
+ microcode_update_one();
if ( !recheck_cpu_features(0) )
panic("Missing previously available feature(s)\n");
--- a/xen/arch/x86/microcode_amd.c
+++ b/xen/arch/x86/microcode_amd.c
@@ -24,7 +24,6 @@
#include <asm/msr.h>
#include <asm/processor.h>
#include <asm/microcode.h>
-#include <asm/hvm/svm/svm.h>
#define pr_debug(x...) ((void)0)
@@ -590,27 +589,10 @@ static struct microcode_patch *cpu_reque
return patch;
}
-#ifdef CONFIG_HVM
-static int start_update(void)
-{
- /*
- * svm_host_osvw_init() will be called on each cpu by calling '.end_update'
- * in common code.
- */
- svm_host_osvw_reset();
-
- return 0;
-}
-#endif
-
static const struct microcode_ops microcode_amd_ops = {
.cpu_request_microcode = cpu_request_microcode,
.collect_cpu_info = collect_cpu_info,
.apply_microcode = apply_microcode,
-#ifdef CONFIG_HVM
- .start_update = start_update,
- .end_update_percpu = svm_host_osvw_init,
-#endif
.free_patch = free_patch,
.compare_patch = compare_patch,
.match_cpu = match_cpu,
--- a/xen/arch/x86/microcode.c
+++ b/xen/arch/x86/microcode.c
@@ -578,9 +578,6 @@ static int do_microcode_update(void *pat
else
ret = secondary_thread_fn();
- if ( microcode_ops->end_update_percpu )
- microcode_ops->end_update_percpu();
-
return ret;
}
@@ -652,16 +649,6 @@ static long microcode_update_helper(void
}
spin_unlock(µcode_mutex);
- if ( microcode_ops->start_update )
- {
- ret = microcode_ops->start_update();
- if ( ret )
- {
- microcode_free_patch(patch);
- goto put;
- }
- }
-
cpumask_clear(&cpu_callin_map);
atomic_set(&cpu_out, 0);
atomic_set(&cpu_updated, 0);
@@ -760,28 +747,14 @@ static int __init microcode_init(void)
__initcall(microcode_init);
/* Load a cached update to current cpu */
-int microcode_update_one(bool start_update)
+int microcode_update_one(void)
{
- int err;
-
if ( !microcode_ops )
return -EOPNOTSUPP;
microcode_ops->collect_cpu_info(&this_cpu(cpu_sig));
- if ( start_update && microcode_ops->start_update )
- {
- err = microcode_ops->start_update();
- if ( err )
- return err;
- }
-
- err = microcode_update_cpu(NULL);
-
- if ( microcode_ops->end_update_percpu )
- microcode_ops->end_update_percpu();
-
- return err;
+ return microcode_update_cpu(NULL);
}
/* BSP calls this function to parse ucode blob and then apply an update. */
@@ -825,7 +798,7 @@ int __init early_microcode_update_cpu(vo
spin_unlock(µcode_mutex);
ASSERT(rc);
- return microcode_update_one(true);
+ return microcode_update_one();
}
int __init early_microcode_init(void)
--- a/xen/arch/x86/hvm/svm/svm.c
+++ b/xen/arch/x86/hvm/svm/svm.c
@@ -1082,7 +1082,7 @@ static void svm_guest_osvw_init(struct d
spin_unlock(&osvw_lock);
}
-void svm_host_osvw_reset()
+static void svm_host_osvw_reset(void)
{
spin_lock(&osvw_lock);
@@ -1092,7 +1092,7 @@ void svm_host_osvw_reset()
spin_unlock(&osvw_lock);
}
-void svm_host_osvw_init()
+static void svm_host_osvw_init(void)
{
spin_lock(&osvw_lock);
--- a/xen/arch/x86/smpboot.c
+++ b/xen/arch/x86/smpboot.c
@@ -358,7 +358,7 @@ void start_secondary(void *unused)
initialize_cpu_data(cpu);
- microcode_update_one(false);
+ microcode_update_one();
/*
* If MSR_SPEC_CTRL is available, apply Xen's default setting and discard
--- a/xen/include/asm-x86/hvm/svm/svm.h
+++ b/xen/include/asm-x86/hvm/svm/svm.h
@@ -93,9 +93,6 @@ extern u32 svm_feature_flags;
#define DEFAULT_TSC_RATIO 0x0000000100000000ULL
#define TSC_RATIO_RSVD_BITS 0xffffff0000000000ULL
-extern void svm_host_osvw_reset(void);
-extern void svm_host_osvw_init(void);
-
/* EXITINFO1 fields on NPT faults */
#define _NPT_PFEC_with_gla 32
#define NPT_PFEC_with_gla (1UL<<_NPT_PFEC_with_gla)
--- a/xen/include/asm-x86/microcode.h
+++ b/xen/include/asm-x86/microcode.h
@@ -24,8 +24,6 @@ struct microcode_ops {
size_t size);
int (*collect_cpu_info)(struct cpu_signature *csig);
int (*apply_microcode)(const struct microcode_patch *patch);
- int (*start_update)(void);
- void (*end_update_percpu)(void);
void (*free_patch)(void *mc);
bool (*match_cpu)(const struct microcode_patch *patch);
enum microcode_match_result (*compare_patch)(
--- a/xen/include/asm-x86/processor.h
+++ b/xen/include/asm-x86/processor.h
@@ -586,7 +586,7 @@ void microcode_set_module(unsigned int);
int microcode_update(XEN_GUEST_HANDLE_PARAM(const_void), unsigned long len);
int early_microcode_update_cpu(void);
int early_microcode_init(void);
-int microcode_update_one(bool start_update);
+int microcode_update_one(void);
int microcode_init_intel(void);
int microcode_init_amd(void);
|