@@ -186,47 +186,58 @@ static u32 cpuid_to_ucode_rev(unsigned int val)
186186 return p .ucode_rev ;
187187}
188188
189+ static u32 get_cutoff_revision (u32 rev )
190+ {
191+ switch (rev >> 8 ) {
192+ case 0x80012 : return 0x8001277 ; break ;
193+ case 0x80082 : return 0x800820f ; break ;
194+ case 0x83010 : return 0x830107c ; break ;
195+ case 0x86001 : return 0x860010e ; break ;
196+ case 0x86081 : return 0x8608108 ; break ;
197+ case 0x87010 : return 0x8701034 ; break ;
198+ case 0x8a000 : return 0x8a0000a ; break ;
199+ case 0xa0010 : return 0xa00107a ; break ;
200+ case 0xa0011 : return 0xa0011da ; break ;
201+ case 0xa0012 : return 0xa001243 ; break ;
202+ case 0xa0082 : return 0xa00820e ; break ;
203+ case 0xa1011 : return 0xa101153 ; break ;
204+ case 0xa1012 : return 0xa10124e ; break ;
205+ case 0xa1081 : return 0xa108109 ; break ;
206+ case 0xa2010 : return 0xa20102f ; break ;
207+ case 0xa2012 : return 0xa201212 ; break ;
208+ case 0xa4041 : return 0xa404109 ; break ;
209+ case 0xa5000 : return 0xa500013 ; break ;
210+ case 0xa6012 : return 0xa60120a ; break ;
211+ case 0xa7041 : return 0xa704109 ; break ;
212+ case 0xa7052 : return 0xa705208 ; break ;
213+ case 0xa7080 : return 0xa708009 ; break ;
214+ case 0xa70c0 : return 0xa70C009 ; break ;
215+ case 0xaa001 : return 0xaa00116 ; break ;
216+ case 0xaa002 : return 0xaa00218 ; break ;
217+ case 0xb0021 : return 0xb002146 ; break ;
218+ case 0xb1010 : return 0xb101046 ; break ;
219+ case 0xb2040 : return 0xb204031 ; break ;
220+ case 0xb4040 : return 0xb404031 ; break ;
221+ case 0xb6000 : return 0xb600031 ; break ;
222+ case 0xb7000 : return 0xb700031 ; break ;
223+ default : break ;
224+
225+ }
226+ return 0 ;
227+ }
228+
189229static bool need_sha_check (u32 cur_rev )
190230{
231+ u32 cutoff ;
232+
191233 if (!cur_rev ) {
192234 cur_rev = cpuid_to_ucode_rev (bsp_cpuid_1_eax );
193235 pr_info_once ("No current revision, generating the lowest one: 0x%x\n" , cur_rev );
194236 }
195237
196- switch (cur_rev >> 8 ) {
197- case 0x80012 : return cur_rev <= 0x8001277 ; break ;
198- case 0x80082 : return cur_rev <= 0x800820f ; break ;
199- case 0x83010 : return cur_rev <= 0x830107c ; break ;
200- case 0x86001 : return cur_rev <= 0x860010e ; break ;
201- case 0x86081 : return cur_rev <= 0x8608108 ; break ;
202- case 0x87010 : return cur_rev <= 0x8701034 ; break ;
203- case 0x8a000 : return cur_rev <= 0x8a0000a ; break ;
204- case 0xa0010 : return cur_rev <= 0xa00107a ; break ;
205- case 0xa0011 : return cur_rev <= 0xa0011da ; break ;
206- case 0xa0012 : return cur_rev <= 0xa001243 ; break ;
207- case 0xa0082 : return cur_rev <= 0xa00820e ; break ;
208- case 0xa1011 : return cur_rev <= 0xa101153 ; break ;
209- case 0xa1012 : return cur_rev <= 0xa10124e ; break ;
210- case 0xa1081 : return cur_rev <= 0xa108109 ; break ;
211- case 0xa2010 : return cur_rev <= 0xa20102f ; break ;
212- case 0xa2012 : return cur_rev <= 0xa201212 ; break ;
213- case 0xa4041 : return cur_rev <= 0xa404109 ; break ;
214- case 0xa5000 : return cur_rev <= 0xa500013 ; break ;
215- case 0xa6012 : return cur_rev <= 0xa60120a ; break ;
216- case 0xa7041 : return cur_rev <= 0xa704109 ; break ;
217- case 0xa7052 : return cur_rev <= 0xa705208 ; break ;
218- case 0xa7080 : return cur_rev <= 0xa708009 ; break ;
219- case 0xa70c0 : return cur_rev <= 0xa70C009 ; break ;
220- case 0xaa001 : return cur_rev <= 0xaa00116 ; break ;
221- case 0xaa002 : return cur_rev <= 0xaa00218 ; break ;
222- case 0xb0021 : return cur_rev <= 0xb002146 ; break ;
223- case 0xb1010 : return cur_rev <= 0xb101046 ; break ;
224- case 0xb2040 : return cur_rev <= 0xb204031 ; break ;
225- case 0xb4040 : return cur_rev <= 0xb404031 ; break ;
226- case 0xb6000 : return cur_rev <= 0xb600031 ; break ;
227- case 0xb7000 : return cur_rev <= 0xb700031 ; break ;
228- default : break ;
229- }
238+ cutoff = get_cutoff_revision (cur_rev );
239+ if (cutoff )
240+ return cur_rev <= cutoff ;
230241
231242 pr_info ("You should not be seeing this. Please send the following couple of lines to x86-<at>-kernel.org\n" );
232243 pr_info ("CPUID(1).EAX: 0x%x, current revision: 0x%x\n" , bsp_cpuid_1_eax , cur_rev );
@@ -473,6 +484,7 @@ static int verify_patch(const u8 *buf, size_t buf_size, u32 *patch_size)
473484{
474485 u8 family = x86_family (bsp_cpuid_1_eax );
475486 struct microcode_header_amd * mc_hdr ;
487+ u32 cur_rev , cutoff , patch_rev ;
476488 u32 sh_psize ;
477489 u16 proc_id ;
478490 u8 patch_fam ;
@@ -512,11 +524,32 @@ static int verify_patch(const u8 *buf, size_t buf_size, u32 *patch_size)
512524 proc_id = mc_hdr -> processor_rev_id ;
513525 patch_fam = 0xf + (proc_id >> 12 );
514526
515- ucode_dbg ("Patch-ID 0x%08x: family: 0x%x\n" , mc_hdr -> patch_id , patch_fam );
516-
517527 if (patch_fam != family )
518528 return 1 ;
519529
530+ cur_rev = get_patch_level ();
531+
532+ /* No cutoff revision means old/unaffected by signing algorithm weakness => matches */
533+ cutoff = get_cutoff_revision (cur_rev );
534+ if (!cutoff )
535+ goto ok ;
536+
537+ patch_rev = mc_hdr -> patch_id ;
538+
539+ ucode_dbg ("cur_rev: 0x%x, cutoff: 0x%x, patch_rev: 0x%x\n" ,
540+ cur_rev , cutoff , patch_rev );
541+
542+ if (cur_rev <= cutoff && patch_rev <= cutoff )
543+ goto ok ;
544+
545+ if (cur_rev > cutoff && patch_rev > cutoff )
546+ goto ok ;
547+
548+ return 1 ;
549+
550+ ok :
551+ ucode_dbg ("Patch-ID 0x%08x: family: 0x%x\n" , mc_hdr -> patch_id , patch_fam );
552+
520553 return 0 ;
521554}
522555
@@ -585,8 +618,6 @@ static size_t parse_container(u8 *ucode, size_t size, struct cont_desc *desc)
585618
586619 mc = (struct microcode_amd * )(buf + SECTION_HDR_SIZE );
587620
588- ucode_dbg ("patch_id: 0x%x\n" , mc -> hdr .patch_id );
589-
590621 if (mc_patch_matches (mc , eq_id )) {
591622 desc -> psize = patch_size ;
592623 desc -> mc = mc ;
0 commit comments