diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-07-22 20:03:52 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-07-22 20:03:52 -0400 |
commit | 80775068dbcf849dca81316e43bcc309985956ac (patch) | |
tree | 431131746de7f983c14f88ac838f3678678e2ec6 /arch | |
parent | 7c6582b28a7debef031a8b7e31953c7d45ddb05d (diff) | |
parent | 40b7f3dfcc5ab211a0b8d916751bb22ac2290806 (diff) |
Merge branch 'x86-microcode-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip
* 'x86-microcode-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
x86, microcode, AMD: Fix section header size check
x86, microcode, AMD: Correct buf references
Diffstat (limited to 'arch')
-rw-r--r-- | arch/x86/kernel/microcode_amd.c | 21 |
1 files changed, 11 insertions, 10 deletions
diff --git a/arch/x86/kernel/microcode_amd.c b/arch/x86/kernel/microcode_amd.c index c5610384ab16..591be0ee1934 100644 --- a/arch/x86/kernel/microcode_amd.c +++ b/arch/x86/kernel/microcode_amd.c | |||
@@ -66,8 +66,8 @@ struct microcode_amd { | |||
66 | unsigned int mpb[0]; | 66 | unsigned int mpb[0]; |
67 | }; | 67 | }; |
68 | 68 | ||
69 | #define UCODE_CONTAINER_SECTION_HDR 8 | 69 | #define SECTION_HDR_SIZE 8 |
70 | #define UCODE_CONTAINER_HEADER_SIZE 12 | 70 | #define CONTAINER_HDR_SZ 12 |
71 | 71 | ||
72 | static struct equiv_cpu_entry *equiv_cpu_table; | 72 | static struct equiv_cpu_entry *equiv_cpu_table; |
73 | 73 | ||
@@ -157,7 +157,7 @@ static int apply_microcode_amd(int cpu) | |||
157 | static unsigned int verify_ucode_size(int cpu, const u8 *buf, unsigned int size) | 157 | static unsigned int verify_ucode_size(int cpu, const u8 *buf, unsigned int size) |
158 | { | 158 | { |
159 | struct cpuinfo_x86 *c = &cpu_data(cpu); | 159 | struct cpuinfo_x86 *c = &cpu_data(cpu); |
160 | unsigned int max_size, actual_size; | 160 | u32 max_size, actual_size; |
161 | 161 | ||
162 | #define F1XH_MPB_MAX_SIZE 2048 | 162 | #define F1XH_MPB_MAX_SIZE 2048 |
163 | #define F14H_MPB_MAX_SIZE 1824 | 163 | #define F14H_MPB_MAX_SIZE 1824 |
@@ -175,9 +175,9 @@ static unsigned int verify_ucode_size(int cpu, const u8 *buf, unsigned int size) | |||
175 | break; | 175 | break; |
176 | } | 176 | } |
177 | 177 | ||
178 | actual_size = buf[4] + (buf[5] << 8); | 178 | actual_size = *(u32 *)(buf + 4); |
179 | 179 | ||
180 | if (actual_size > size || actual_size > max_size) { | 180 | if (actual_size + SECTION_HDR_SIZE > size || actual_size > max_size) { |
181 | pr_err("section size mismatch\n"); | 181 | pr_err("section size mismatch\n"); |
182 | return 0; | 182 | return 0; |
183 | } | 183 | } |
@@ -191,7 +191,7 @@ get_next_ucode(int cpu, const u8 *buf, unsigned int size, unsigned int *mc_size) | |||
191 | struct microcode_header_amd *mc = NULL; | 191 | struct microcode_header_amd *mc = NULL; |
192 | unsigned int actual_size = 0; | 192 | unsigned int actual_size = 0; |
193 | 193 | ||
194 | if (buf[0] != UCODE_UCODE_TYPE) { | 194 | if (*(u32 *)buf != UCODE_UCODE_TYPE) { |
195 | pr_err("invalid type field in container file section header\n"); | 195 | pr_err("invalid type field in container file section header\n"); |
196 | goto out; | 196 | goto out; |
197 | } | 197 | } |
@@ -204,8 +204,8 @@ get_next_ucode(int cpu, const u8 *buf, unsigned int size, unsigned int *mc_size) | |||
204 | if (!mc) | 204 | if (!mc) |
205 | goto out; | 205 | goto out; |
206 | 206 | ||
207 | get_ucode_data(mc, buf + UCODE_CONTAINER_SECTION_HDR, actual_size); | 207 | get_ucode_data(mc, buf + SECTION_HDR_SIZE, actual_size); |
208 | *mc_size = actual_size + UCODE_CONTAINER_SECTION_HDR; | 208 | *mc_size = actual_size + SECTION_HDR_SIZE; |
209 | 209 | ||
210 | out: | 210 | out: |
211 | return mc; | 211 | return mc; |
@@ -229,9 +229,10 @@ static int install_equiv_cpu_table(const u8 *buf) | |||
229 | return -ENOMEM; | 229 | return -ENOMEM; |
230 | } | 230 | } |
231 | 231 | ||
232 | get_ucode_data(equiv_cpu_table, buf + UCODE_CONTAINER_HEADER_SIZE, size); | 232 | get_ucode_data(equiv_cpu_table, buf + CONTAINER_HDR_SZ, size); |
233 | 233 | ||
234 | return size + UCODE_CONTAINER_HEADER_SIZE; /* add header length */ | 234 | /* add header length */ |
235 | return size + CONTAINER_HDR_SZ; | ||
235 | } | 236 | } |
236 | 237 | ||
237 | static void free_equiv_cpu_table(void) | 238 | static void free_equiv_cpu_table(void) |