When autoport is run on a system without supported southbridge it won't populate the coresponding data structure. By sanitiy checking after PCI detection autoport can exit cleanly and provide a sufficient error message. Error was: panic: runtime error: invalid memory address or nil pointer dereference [signal SIGSEGV: segmentation violation code=0x1 addr=0x30 pc=0x4be595] goroutine 1 [running]: main.FIXMEEC(0xc42014af80, 0x14, 0xc42014afe0, 0x1a, 0xc4200a914f, 0x4, 0xc4200a916f, 0xf, 0xc420149e60, 0x28, ...) /coreboot/util/autoport/ec_fixme.go:14 +0x105 Change-Id: I6b0fcda76d33b0d3a0379c279f492160ce5add84 Signed-off-by: Maximilian Schander <maxschander@googlemail.com> Reviewed-on: https://review.coreboot.org/22203 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Paul Menzel <paulepanter@users.sourceforge.net> Reviewed-by: Jonathan Neuschäfer <j.neuschaefer@gmx.net>
		
			
				
	
	
		
			48 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			48 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package main
 | 
						|
 | 
						|
import "fmt"
 | 
						|
import "os"
 | 
						|
 | 
						|
var supportedPCIDevices map[uint32]PCIDevice = map[uint32]PCIDevice{}
 | 
						|
var PCIMap map[PCIAddr]PCIDevData = map[PCIAddr]PCIDevData{}
 | 
						|
 | 
						|
func ScanRoot(ctx Context) {
 | 
						|
	for _, pciDev := range ctx.InfoSource.GetPCIList() {
 | 
						|
		PCIMap[pciDev.PCIAddr] = pciDev
 | 
						|
	}
 | 
						|
	for _, pciDev := range ctx.InfoSource.GetPCIList() {
 | 
						|
		vendevid := (uint32(pciDev.PCIDevID) << 16) | uint32(pciDev.PCIVenID)
 | 
						|
 | 
						|
		dev, ok := supportedPCIDevices[vendevid]
 | 
						|
		if !ok {
 | 
						|
			if pciDev.PCIAddr.Bus != 0 {
 | 
						|
				fmt.Printf("Unknown PCI device %04x:%04x, assuming removable\n",
 | 
						|
					pciDev.PCIVenID, pciDev.PCIDevID)
 | 
						|
				continue
 | 
						|
			}
 | 
						|
			fmt.Printf("Unsupported PCI device %04x:%04x\n",
 | 
						|
				pciDev.PCIVenID, pciDev.PCIDevID)
 | 
						|
			dev = GenericPCI{Comment: fmt.Sprintf("Unsupported PCI device %04x:%04x",
 | 
						|
				pciDev.PCIVenID, pciDev.PCIDevID)}
 | 
						|
		}
 | 
						|
		dev.Scan(ctx, pciDev)
 | 
						|
	}
 | 
						|
	if SouthBridge == nil {
 | 
						|
		fmt.Println("Could not detect southbridge. Aborting!")
 | 
						|
		os.Exit(1)
 | 
						|
	}
 | 
						|
	dmi := ctx.InfoSource.GetDMI()
 | 
						|
	if !dmi.IsLaptop {
 | 
						|
		NoEC(ctx)
 | 
						|
	} else if dmi.Vendor == "LENOVO" {
 | 
						|
		LenovoEC(ctx)
 | 
						|
	} else {
 | 
						|
		FIXMEEC(ctx)
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
func RegisterPCI(VenID uint16, DevID uint16, dev PCIDevice) {
 | 
						|
	vendevid := (uint32(DevID) << 16) | uint32(VenID)
 | 
						|
	supportedPCIDevices[vendevid] = dev
 | 
						|
}
 |