-
Notifications
You must be signed in to change notification settings - Fork 11
/
Copy pathmain.go
112 lines (86 loc) · 2.28 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
// Copyright (c) WithSecure Corporation
//
// Use of this source code is governed by the license
// that can be found in the LICENSE file.
package main
import (
"fmt"
"log"
"github.com/usbarmory/armory-boot/config"
"github.com/usbarmory/armory-boot/disk"
"github.com/usbarmory/armory-boot/exec"
usbarmory "github.com/usbarmory/tamago/board/usbarmory/mk2"
"github.com/usbarmory/tamago/soc/nxp/imx6ul"
"github.com/usbarmory/tamago/soc/nxp/usdhc"
)
var Build string
var Revision string
var Boot string
var Start string
// signify/minisign authentication when defined
var PublicKeyStr string
func init() {
log.SetFlags(0)
switch imx6ul.Model() {
case "i.MX6ULL", "i.MX6ULZ":
imx6ul.SetARMFreq(imx6ul.FreqMax)
case "i.MX6UL":
imx6ul.SetARMFreq(imx6ul.Freq528)
}
}
func preLaunch() {
usbarmory.LED("blue", false)
usbarmory.LED("white", false)
}
func main() {
var card *usdhc.USDHC
usbarmory.LED("blue", false)
usbarmory.LED("white", false)
switch Boot {
case "eMMC":
card = usbarmory.MMC
case "uSD":
card = usbarmory.SD
default:
panic("invalid boot parameter")
}
part, err := disk.Detect(card, Start)
if err != nil {
panic(fmt.Sprintf("boot media error, %v\n", err))
}
usbarmory.LED("blue", true)
if len(PublicKeyStr) == 0 {
log.Printf("armory-boot: no public key, skipping signature verification")
}
conf, err := config.Load(part, config.DefaultConfigPath, config.DefaultSignaturePath, PublicKeyStr)
if err != nil {
panic(fmt.Sprintf("configuration error, %v\n", err))
}
log.Printf("\n%s", conf.JSON)
usbarmory.LED("white", true)
var image exec.BootImage
if conf.ELF {
image = &exec.ELFImage{
Region: mem,
ELF: conf.Kernel(),
}
} else {
image = &exec.LinuxImage{
Region: mem,
Kernel: conf.Kernel(),
DeviceTreeBlob: conf.DeviceTreeBlob(),
InitialRamDisk: conf.InitialRamDisk(),
KernelOffset: kernelOffset,
DeviceTreeBlobOffset: paramsOffset,
InitialRamDiskOffset: initrdOffset,
CmdLine: conf.CmdLine,
}
}
if err = image.Load(); err != nil {
panic(fmt.Sprintf("load error, %v\n", err))
}
log.Printf("armory-boot: starting kernel@%.8x\n", image.Entry())
if err = image.Boot(preLaunch); err != nil {
panic(fmt.Sprintf("load error, %v\n", err))
}
}