-
Notifications
You must be signed in to change notification settings - Fork 4
/
linux-uek6-arch.patch
189 lines (172 loc) · 8.08 KB
/
linux-uek6-arch.patch
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
From e5d7af32b0f227ba82a831db837890747b285ef9 Mon Sep 17 00:00:00 2001
From: Dongli Zhang <[email protected]>
Date: Mon, 29 Jun 2020 23:24:56 -0700
Subject: [PATCH 1/1] linux uek6 arch
v5.4.17-2011.4.3
Signed-off-by: Dongli Zhang <[email protected]>
---
arch/x86/kernel/cpu/microcode/core.c | 79 +++++++++++++++++++++++++++
arch/x86/kernel/cpu/microcode/intel.c | 5 ++
2 files changed, 84 insertions(+)
diff --git a/arch/x86/kernel/cpu/microcode/core.c b/arch/x86/kernel/cpu/microcode/core.c
index b378d4dcc1d4..55a1beaebc82 100644
--- a/arch/x86/kernel/cpu/microcode/core.c
+++ b/arch/x86/kernel/cpu/microcode/core.c
@@ -73,6 +73,17 @@ struct cpu_info_ctx {
int err;
};
+/*
+ * 在以下使用__reload_late_ret[NR_CPUS]:
+ * - arch/x86/kernel/cpu/microcode/core.c|76| <<global>> static int __reload_late_ret[NR_CPUS];
+ * - arch/x86/kernel/cpu/microcode/core.c|630| <<__reload_late>> __reload_late_ret[cpu] = -1;
+ * - arch/x86/kernel/cpu/microcode/core.c|631| <<__reload_late>> __reload_late_ret[cpu_sibling] = -1;
+ * - arch/x86/kernel/cpu/microcode/core.c|634| <<__reload_late>> if (__reload_late_ret[cpu] == 0 && c->cpu_index == boot_cpu_data.cpu_index) {
+ * - arch/x86/kernel/cpu/microcode/core.c|658| <<__reload_late>> if (!__reload_late_ret[cpu] && !master_sibling)
+ * - arch/x86/kernel/cpu/microcode/core.c|661| <<__reload_late>> if (__reload_late_ret[cpu] == 0 && c->cpu_index != boot_cpu_data.cpu_index) {
+ * - arch/x86/kernel/cpu/microcode/core.c|673| <<__reload_late>> return __reload_late_ret[cpu];
+ * - arch/x86/kernel/cpu/microcode/core.c|691| <<microcode_reload_late>> memset(__reload_late_ret, 0, NR_CPUS * sizeof(int ));
+ */
static int __reload_late_ret[NR_CPUS];
/*
@@ -377,10 +388,19 @@ static int collect_cpu_info(int cpu)
return ret;
}
+/*
+ * called by:
+ * - arch/x86/kernel/cpu/microcode/core.c|392| <<apply_microcode_on_target>> ret = smp_call_function_single(cpu, apply_microcode_local, &err, 1);
+ * - arch/x86/kernel/cpu/microcode/core.c|591| <<__reload_late>> apply_microcode_local(&err);
+ * - arch/x86/kernel/cpu/microcode/core.c|626| <<__reload_late>> apply_microcode_local(&err);
+ */
static void apply_microcode_local(void *arg)
{
enum ucode_state *err = arg;
+ /*
+ * 例子: apply_microcode_intel()
+ */
*err = microcode_ops->apply_microcode(smp_processor_id());
}
@@ -523,7 +543,17 @@ static int check_online_cpus(void)
return 0;
}
+/*
+ * 在以下使用late_cpus_in:
+ * - arch/x86/kernel/cpu/microcode/core.c|580| <<__reload_late>> if (__wait_for_cpus(&late_cpus_in, NSEC_PER_SEC))
+ * - arch/x86/kernel/cpu/microcode/core.c|655| <<microcode_reload_late>> atomic_set(&late_cpus_in, 0);
+ */
static atomic_t late_cpus_in;
+/*
+ * 在以下使用late_cpus_out:
+ * - arch/x86/kernel/cpu/microcode/core.c|616| <<__reload_late>> if (__wait_for_cpus(&late_cpus_out, NSEC_PER_SEC))
+ * - arch/x86/kernel/cpu/microcode/core.c|656| <<microcode_reload_late>> atomic_set(&late_cpus_out, 0);
+ */
static atomic_t late_cpus_out;
static int __wait_for_cpus(atomic_t *t, long long timeout)
@@ -552,12 +582,27 @@ static int __wait_for_cpus(atomic_t *t, long long timeout)
* < 0 - on error
* 0 - success (no update done or microcode was updated)
*/
+/*
+ * reload_store()
+ * -> microcode_reload_late()
+ * -> stop_machine_cpuslocked(__reload_late, NULL, cpu_online_mask);
+ * -> __reload_late()
+ * -> pr_info("Reload completed, microcode revision: 0x%x\n", boot_cpu_data.microcode);
+ *
+ * called by:
+ * - arch/x86/kernel/cpu/microcode/core.c|649| <<microcode_reload_late>> ret = stop_machine_cpuslocked(__reload_late, NULL, cpu_online_mask);
+ *
+ * stop_machine_cpuslocked()调用的时候每个online cpu都会调用__reload_late()
+ */
static int __reload_late(void *info)
{
int cpu = smp_processor_id();
struct cpuinfo_x86 *c = &cpu_data(cpu);
enum ucode_state err;
struct cpumask *siblmsk = topology_sibling_cpumask(cpu);
+ /*
+ * 这里返回是否是同为sibling的第一个cpu
+ */
bool master_sibling = (cpumask_first(topology_sibling_cpumask(cpu)) ==
cpu);
int cpu_sibling;
@@ -570,6 +615,11 @@ static int __reload_late(void *info)
* Wait for all CPUs to arrive. A load will not be attempted unless all
* CPUs show up.
* */
+ /*
+ * 在以下使用late_cpus_in:
+ * - arch/x86/kernel/cpu/microcode/core.c|580| <<__reload_late>> if (__wait_for_cpus(&late_cpus_in, NSEC_PER_SEC))
+ * - arch/x86/kernel/cpu/microcode/core.c|655| <<microcode_reload_late>> atomic_set(&late_cpus_in, 0);
+ */
if (__wait_for_cpus(&late_cpus_in, NSEC_PER_SEC))
return -1;
@@ -580,6 +630,9 @@ static int __reload_late(void *info)
* loading attempts happen on multiple threads of an SMT core. See
* below.
*/
+ /*
+ * master_sibling表示是否是同为sibling的第一个cpu
+ */
if (master_sibling)
apply_microcode_local(&err);
else
@@ -591,6 +644,17 @@ static int __reload_late(void *info)
__reload_late_ret[cpu_sibling] = -1;
}
+ /*
+ * 在以下使用__reload_late_ret[NR_CPUS]:
+ * - arch/x86/kernel/cpu/microcode/core.c|76| <<global>> static int __reload_late_ret[NR_CPUS];
+ * - arch/x86/kernel/cpu/microcode/core.c|630| <<__reload_late>> __reload_late_ret[cpu] = -1;
+ * - arch/x86/kernel/cpu/microcode/core.c|631| <<__reload_late>> __reload_late_ret[cpu_sibling] = -1;
+ * - arch/x86/kernel/cpu/microcode/core.c|634| <<__reload_late>> if (__reload_late_ret[cpu] == 0 && c->cpu_index == boot_cpu_data.cpu_index) {
+ * - arch/x86/kernel/cpu/microcode/core.c|658| <<__reload_late>> if (!__reload_late_ret[cpu] && !master_sibling)
+ * - arch/x86/kernel/cpu/microcode/core.c|661| <<__reload_late>> if (__reload_late_ret[cpu] == 0 && c->cpu_index != boot_cpu_data.cpu_index) {
+ * - arch/x86/kernel/cpu/microcode/core.c|673| <<__reload_late>> return __reload_late_ret[cpu];
+ * - arch/x86/kernel/cpu/microcode/core.c|691| <<microcode_reload_late>> memset(__reload_late_ret, 0, NR_CPUS * sizeof(int ));
+ */
if (__reload_late_ret[cpu] == 0 && c->cpu_index == boot_cpu_data.cpu_index) {
cpu_clear_bug_bits(c);
@@ -630,6 +694,17 @@ static int __reload_late(void *info)
get_cpu_cap(c);
}
+ /*
+ * 在以下使用__reload_late_ret[NR_CPUS]:
+ * - arch/x86/kernel/cpu/microcode/core.c|76| <<global>> static int __reload_late_ret[NR_CPUS];
+ * - arch/x86/kernel/cpu/microcode/core.c|630| <<__reload_late>> __reload_late_ret[cpu] = -1;
+ * - arch/x86/kernel/cpu/microcode/core.c|631| <<__reload_late>> __reload_late_ret[cpu_sibling] = -1;
+ * - arch/x86/kernel/cpu/microcode/core.c|634| <<__reload_late>> if (__reload_late_ret[cpu] == 0 && c->cpu_index == boot_cpu_data.cpu_index) {
+ * - arch/x86/kernel/cpu/microcode/core.c|658| <<__reload_late>> if (!__reload_late_ret[cpu] && !master_sibling)
+ * - arch/x86/kernel/cpu/microcode/core.c|661| <<__reload_late>> if (__reload_late_ret[cpu] == 0 && c->cpu_index != boot_cpu_data.cpu_index) {
+ * - arch/x86/kernel/cpu/microcode/core.c|673| <<__reload_late>> return __reload_late_ret[cpu];
+ * - arch/x86/kernel/cpu/microcode/core.c|691| <<microcode_reload_late>> memset(__reload_late_ret, 0, NR_CPUS * sizeof(int ));
+ */
return __reload_late_ret[cpu];
}
@@ -637,6 +712,10 @@ static int __reload_late(void *info)
* Reload microcode late on all CPUs. Wait for a sec until they
* all gather together.
*/
+/*
+ * called by:
+ * - arch/x86/kernel/cpu/microcode/core.c|685| <<reload_store>> ret = microcode_reload_late();
+ */
static int microcode_reload_late(void)
{
int ret;
diff --git a/arch/x86/kernel/cpu/microcode/intel.c b/arch/x86/kernel/cpu/microcode/intel.c
index 0036d3cc8ab9..8aeada8af94a 100644
--- a/arch/x86/kernel/cpu/microcode/intel.c
+++ b/arch/x86/kernel/cpu/microcode/intel.c
@@ -946,6 +946,11 @@ static enum ucode_state generic_load_microcode(int cpu, struct iov_iter *iter)
return ret;
}
+/*
+ * called by:
+ * - arch/x86/kernel/cpu/microcode/intel.c|982| <<request_microcode_fw>> if (is_blacklisted(cpu))
+ * - arch/x86/kernel/cpu/microcode/intel.c|1009| <<request_microcode_user>> if (is_blacklisted(cpu))
+ */
static bool is_blacklisted(unsigned int cpu)
{
struct cpuinfo_x86 *c = &cpu_data(cpu);
--
2.17.1