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  }