2014-10-15 21:51:47 +02:00
|
|
|
package main
|
|
|
|
|
|
|
|
import "fmt"
|
autoport: Fix nil pointer deref when run without bd82x6x
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>
2017-10-27 15:26:15 +02:00
|
|
|
import "os"
|
2014-10-15 21:51:47 +02:00
|
|
|
|
|
|
|
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)
|
|
|
|
}
|
autoport: Fix nil pointer deref when run without bd82x6x
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>
2017-10-27 15:26:15 +02:00
|
|
|
if SouthBridge == nil {
|
|
|
|
fmt.Println("Could not detect southbridge. Aborting!")
|
|
|
|
os.Exit(1)
|
|
|
|
}
|
2014-10-15 21:51:47 +02:00
|
|
|
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
|
|
|
|
}
|