github.com/linuxboot/fiano@v1.2.0/pkg/intel/microcode/microcode_test.go (about) 1 // Copyright 2023 the LinuxBoot Authors. All rights reserved 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package microcode 6 7 import ( 8 "bytes" 9 "testing" 10 ) 11 12 var ( 13 testMicrocode = []byte("\x01\x00\x00\x00\x24\x04\x00\x00\x22\x20\x19\x09\xa3\x06\x09\x00\x5d\xd4\xdd\xf6\x01\x00\x00\x00\x80\x00\x00\x00\x04\x00\x00\x00\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00") 14 testMicrocodeExtTable = []byte("\x01\x00\x00\x00\x24\x04\x00\x00\x22\x20\x19\x09\xa3\x06\x09\x00\x31\xd4\xdd\xf6\x01\x00\x00\x00\x80\x00\x00\x00\x04\x00\x00\x00\x60\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x06\x5a\x21\x95\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa3\x06\x09\x00\x80\x00\x00\x00\xd9\x4b\x66\xb5\xa4\x06\x09\x00\x80\x00\x00\x00\xd8\x4b\x66\xb5") 15 ) 16 17 func TestParseMicrocodeExtTable(t *testing.T) { 18 var m *Microcode 19 var err error 20 21 if m, err = ParseIntelMicrocode(bytes.NewBuffer(testMicrocodeExtTable)); err != nil { 22 t.Errorf("Failed to parse microcode %v", err) 23 return 24 } 25 if m.HeaderProcessorFlags != 0x80 { 26 t.Errorf("Got microcode processor flags %#x, expected %#x", m.HeaderProcessorFlags, 0x80) 27 } 28 if m.HeaderDataSize != 4 { 29 t.Errorf("Got microcode data size %#x, expected %#x", m.HeaderDataSize, 4) 30 } 31 if m.HeaderTotalSize != 0x60 { 32 t.Errorf("Got microcode total size %#x, expected %#x", m.HeaderTotalSize, 0x60) 33 } 34 if m.HeaderProcessorSignature != 0x906a3 { 35 t.Errorf("Got microcode processor signature %#x, expected %#x", m.HeaderProcessorSignature, 0x906a3) 36 } 37 if m.HeaderDate != 0x9192022 { 38 t.Errorf("Got microcode date %#x, expected %#x", m.HeaderDate, 0x9192022) 39 } 40 if len(m.Data) != 4 { 41 t.Errorf("Got microcode data length %d, expected %d", len(m.Data), 4) 42 } 43 if len(m.ExtendedSignatures) != 2 { 44 t.Errorf("Got extended signatures %d, expected %d", len(m.ExtendedSignatures), 2) 45 } 46 if m.ExtendedSignatures[0].ProcessorFlags != 0x80 { 47 t.Errorf("Got extended #0 microcode processor flags %#x, expected %#x", 48 m.ExtendedSignatures[0].ProcessorFlags, 0x80) 49 } 50 if m.ExtendedSignatures[0].Signature != 0x906a3 { 51 t.Errorf("Got extended #0 processor signature %#x, expected %#x", 52 m.ExtendedSignatures[0].Signature, 0x906a3) 53 } 54 if m.ExtendedSignatures[1].ProcessorFlags != 0x80 { 55 t.Errorf("Got extended #1 microcode processor flags %#x, expected %#x", 56 m.ExtendedSignatures[1].ProcessorFlags, 0x80) 57 } 58 if m.ExtendedSignatures[1].Signature != 0x906a4 { 59 t.Errorf("Got extended #1 processor signature %#x, expected %#x", 60 m.ExtendedSignatures[1].Signature, 0x906a4) 61 } 62 } 63 64 func TestParseMicrocode(t *testing.T) { 65 var m *Microcode 66 var err error 67 68 if m, err = ParseIntelMicrocode(bytes.NewBuffer(testMicrocode)); err != nil { 69 t.Errorf("Failed to parse microcode %v", err) 70 return 71 } 72 if m.HeaderProcessorFlags != 0x80 { 73 t.Errorf("Got microcode processor flags %#x, expected %#x", m.HeaderProcessorFlags, 0x80) 74 } 75 if m.HeaderDataSize != 4 { 76 t.Errorf("Got microcode data size %#x, expected %#x", m.HeaderDataSize, 4) 77 } 78 if m.HeaderTotalSize != 0x34 { 79 t.Errorf("Got microcode total size %#x, expected %#x", m.HeaderTotalSize, 0x34) 80 } 81 if m.HeaderProcessorSignature != 0x906a3 { 82 t.Errorf("Got microcode processor signature %#x, expected %#x", m.HeaderProcessorSignature, 0x906a3) 83 } 84 if m.HeaderDate != 0x9192022 { 85 t.Errorf("Got microcode date %#x, expected %#x", m.HeaderDate, 0x9192022) 86 } 87 if len(m.Data) != 4 { 88 t.Errorf("Got microcode data length %d, expected %d", len(m.Data), 4) 89 } 90 if len(m.ExtendedSignatures) != 0 { 91 t.Errorf("Got extended signatures %d, expected %d", len(m.ExtendedSignatures), 0) 92 } 93 } 94 95 func TestParseMicrocodeErrors(t *testing.T) { 96 // Invalid checksum 97 testData := make([]byte, len(testMicrocode)) 98 copy(testData, testMicrocode) 99 testData[16] += 1 100 101 if _, err := ParseIntelMicrocode(bytes.NewBuffer(testData)); err == nil { 102 t.Errorf("Exptected error but didn't get one") 103 } 104 105 // Header version invlaid 106 testData = make([]byte, len(testMicrocode)) 107 copy(testData, testMicrocode) 108 testData[0] = 2 109 110 if _, err := ParseIntelMicrocode(bytes.NewBuffer(testData)); err == nil { 111 t.Errorf("Exptected error but didn't get one") 112 } 113 114 // Datasize not multiple of 4 115 testData = make([]byte, len(testMicrocode)) 116 copy(testData, testMicrocode) 117 testData[28] += 1 118 119 if _, err := ParseIntelMicrocode(bytes.NewBuffer(testData)); err == nil { 120 t.Errorf("Exptected error but didn't get one") 121 } 122 123 // Datasize invalid 124 testData = make([]byte, len(testMicrocode)) 125 copy(testData, testMicrocode) 126 testData[28] = 8 127 128 if _, err := ParseIntelMicrocode(bytes.NewBuffer(testData)); err == nil { 129 t.Errorf("Exptected error but didn't get one") 130 } 131 132 // TotalSize invalid 133 testData = make([]byte, len(testMicrocode)) 134 copy(testData, testMicrocode) 135 testData[32] = 0 136 137 if _, err := ParseIntelMicrocode(bytes.NewBuffer(testData)); err == nil { 138 t.Errorf("Exptected error but didn't get one") 139 } 140 141 // TotalSize invalid 142 testData = make([]byte, len(testMicrocode)) 143 copy(testData, testMicrocode) 144 testData[32] += 1 145 146 if _, err := ParseIntelMicrocode(bytes.NewBuffer(testData)); err == nil { 147 t.Errorf("Exptected error but didn't get one") 148 } 149 150 // ExtTable invalid checksum 151 testData = make([]byte, len(testMicrocodeExtTable)) 152 copy(testData, testMicrocodeExtTable) 153 testData[len(testData)-1] += 1 154 155 if _, err := ParseIntelMicrocode(bytes.NewBuffer(testData)); err == nil { 156 t.Errorf("Exptected error but didn't get one") 157 } 158 159 // Input to short 160 for i := 0; i < len(testMicrocodeExtTable)-1; i++ { 161 testData = make([]byte, i) 162 copy(testData, testMicrocodeExtTable[:i]) 163 164 if _, err := ParseIntelMicrocode(bytes.NewBuffer(testData)); err == nil { 165 t.Errorf("Exptected error but didn't get one") 166 } 167 } 168 }