Project

General

Profile

NexusSI902xBootloader » History » Version 17

Paul Kocialkowski, 02/08/2016 07:13 PM

1 16 Paul Kocialkowski
h1. Nexus S (I902x) bootloader
2 1 Paul Kocialkowski
3 17 Paul Kocialkowski
{{>toc}}
4
5 5 Paul Kocialkowski
The Nexus S (I902x) comes with a bootrom and a set of two proprietary bootloaders. The bootrom: internal ROM (iROM) is stored read-only on the S5PC110 SoC chip. It loads the first bootloader: Samsung Primitive Bootloader (PBL), which loads the second bootloader: Samsung Secondary Bootloader (SBL). These bootloaders are proprietary software.
6 1 Paul Kocialkowski
7 11 Paul Kocialkowski
More information on the booting sequence is available on the S5PC110 User Manual, section 2 (System), part 6 (Booting sequence).
8 3 Paul Kocialkowski
9
h2. Boot device priority
10
11
The S5PC110 bootrom (iROM) allows booting from various devices such as NAND, MMC, eMMC, UART and USB. The boot device priority is selected using the Operating Mode (OM) pins. Boolean values for each pin depend on the voltage applied to the pin: a positive voltage represents a logical 1 while ground represents a logical 0.
12
13 9 Paul Kocialkowski
h3. OM_STAT register
14
15
The OM_STAT register holds the value of the OM pins. It is available at address: @0xe010e100@.
16 12 Paul Kocialkowski
The register value can be read using:
17 9 Paul Kocialkowski
<pre>
18
# devmem 0xe010e100 8                                           
19
0x09
20
</pre>
21
22 5 Paul Kocialkowski
h3. Board resistors
23 3 Paul Kocialkowski
24 4 Paul Kocialkowski
OM pins are set to boolean values using pull-up (logical 1) and pull-down (logical 0) resistors. The Nexus S (I902x) schematics show all the possible resistors connected to the pins.
25 1 Paul Kocialkowski
26 7 Paul Kocialkowski
According to the Nexus S (I902x) Schematics:
27 4 Paul Kocialkowski
!crespo_om_schematics.jpg!
28
29
Only a few are actually populated on the board:
30 15 Paul Kocialkowski
!crespo_om_board.jpg!
31 6 Paul Kocialkowski
32
According to the Nexus S (I902x) Service Manual:
33 15 Paul Kocialkowski
!crespo_om_components.jpg!
34 3 Paul Kocialkowski
35
Resistors highlighted in green are not populated on the board. Hence, the actual layout is the following:
36
37
| |_. XOM5 |_. XOM4 |_. XOM3 |_. XOM2 |_. XOM1 |_. XOM0 |
38
| Pull-up resistor | N/A | N/A | R429 | N/A | N/A | R435 |
39
| Pull-down resistor | R448 | R447 | N/A | R445 | R444 | N/A |
40
| Boolean value | 0 | 0 | 1 | 0 | 0 | 1 |
41 1 Paul Kocialkowski
42 9 Paul Kocialkowski
h3. First boot device
43
44 11 Paul Kocialkowski
According to the S5PC110 User Manual, section 2 (System), part 6.2.4 (OM pin configuration), table 6-3, such a value (0x04) indicates OnenandMux as first boot device.
45 3 Paul Kocialkowski
46 1 Paul Kocialkowski
h2. Secure boot
47
48 11 Paul Kocialkowski
According to the S5PC110 User Manual, section 2 (System), part 6 (Booting sequence), the bootrom (iROM) found on the S5PC110 SoC implements secure boot, which is enabled depending on the value of an e-fuse:
49 5 Paul Kocialkowski
<pre>
50
If you select secure booting, iROM code and first boot loader provide integrity checking function (that is it uses
51
public key algorithm) to verify loaded image. There are 160 e-fuse bits of secure boot key, and they are used to
52
authenticate loaded public key before the iROM’s integrity check.
53
</pre>
54 1 Paul Kocialkowski
55 11 Paul Kocialkowski
This implies that in secure boot mode, the bootrom (iROM) will check the signature of the first bootloader and refuse to boot if the signature doesn't match the secure boot key. More information on this topic is available on the S5PC110 User Manual, section 2 (System), part 6.2.2 (Booting sequence example), figure 6-2.
56 1 Paul Kocialkowski
57 5 Paul Kocialkowski
On the Nexus S (I902x), secure boot mode appears to be enabled: changing a single byte on the first bootloader ended up in the system refusing to boot. In addition, a few messages from the bootloaders output suggest that such signature checks are enforced: @IROM e-fused - Secure Boot Version@.
58 1 Paul Kocialkowski
59 10 Paul Kocialkowski
h3. SECKEY register
60
61 12 Paul Kocialkowski
The SECKEY register holds the public key that is used to check the bootloaders signatures. It is available at address @0xe0e00000@, as mentioned on the S5PC110 User Manual, section 1 (Overview), part 2.1.2 (Special function register map). The register is e-fused and cannot be overwritten on the Nexus S (I902x).
62 1 Paul Kocialkowski
63 12 Paul Kocialkowski
Access to the register requires the CLK_SECKEY clock to be enabled, as mentioned on the S5PC110 User Manual, section 2 (System), part 3.7.5.6 (Clock gating control register).
64 13 Paul Kocialkowski
The seckey clock can be enabled at boot-time using the following kernel patch:
65 12 Paul Kocialkowski
<pre>
66
diff --git a/arch/arm/mach-s5pv210/clock.c b/arch/arm/mach-s5pv210/clock.c
67
index 6d3e609..38ebb76 100644
68
--- a/arch/arm/mach-s5pv210/clock.c
69
+++ b/arch/arm/mach-s5pv210/clock.c
70
@@ -1479,6 +1479,7 @@ void __init_or_cpufreq s5pv210_setup_clocks(void)
71
 	unsigned int ptr;
72
 	u32 clkdiv0, clkdiv1;
73
 	struct clksrc_clk *pclkSrc;
74
+	int i;
75
 
76
 	/* Set functions for clk_fout_epll */
77
 	clk_fout_epll.enable = s5p_epll_enable;
78
@@ -1564,6 +1565,16 @@ void __init_or_cpufreq s5pv210_setup_clocks(void)
79
 		/* Display the clock source */
80
 		s3c_set_clksrc(pclkSrc, true);
81
 	}
82
+
83
+	for (i = 0; i < ARRAY_SIZE(init_clocks_off); i++) {
84
+		if (init_clocks_off[i].name == NULL)
85
+			break;
86
+
87
+		if (strcmp("seckey", init_clocks_off[i].name) == 0) {
88
+			printk(KERN_INFO "%s: Enabling seckey clock\n", __func__);
89
+			clk_enable(&init_clocks_off[i]);
90
+		}
91
+	}
92
 }
93
 
94
 static struct clk *clks[] __initdata = {
95
</pre>
96 1 Paul Kocialkowski
97 12 Paul Kocialkowski
The register value can then be read using:
98
<pre>
99
# devmem 0xE0E00018 32   
100
0x07F0600F
101
</pre>
102
103
A non-zero value on the register indicates that secure boot is enabled, while a zero value indicates that secure boot is disabled. Hence, secure boot is enabled on the Nexus S (I902x).
104
105 10 Paul Kocialkowski
h3. Bootloaders secure boot
106 5 Paul Kocialkowski
107 3 Paul Kocialkowski
The first bootloader (PBL) appears to be implementing and enforcing a similar secure boot mechanism. However, there is no signature check enforced regarding the Linux kernel.
108 8 Paul Kocialkowski
109 1 Paul Kocialkowski
Since signature checks are enforced by the bootrom and provided that there is apparently no easy way of replacing the public key the signatures are checked against, running free software bootloaders on the Nexus S (I902x) seems impossible.
110
111 8 Paul Kocialkowski
It is however possible to run a free software bootloader (U-Boot) as second bootloader using a version of the first bootloader (PBL) that does not enforce the signature check.
112 10 Paul Kocialkowski
113 8 Paul Kocialkowski
114 12 Paul Kocialkowski
h2. Bootloaders output
115 1 Paul Kocialkowski
116
<pre>
117
-----------------------------------------------------------
118
   Samsung Primitive Bootloader (PBL) v3.0
119
   Copyright (C) Samsung Electronics Co., Ltd. 2006-2010
120
-----------------------------------------------------------
121
122
Muxed [[OneNAND]] 512MB (0x50) Sync
123
Scanning Bad Block .......
124
Bad Block 77 (5)
125
Bad Block 295 (5)
126
Bad Block 1232 (5)
127
Bad Block 1646 (5)
128
Bad Block 1831 (5)
129
Bad Block 2047 (0)
130
SBL loadding success
131
132
Set cpu clk. from 400MHz to 800MHz.
133
OM=0x9, device=OnenandMux(Audi)
134
IROM e-fused - Secure Boot Version.
135
136
-----------------------------------------------------------
137
   Samsung Secondary Bootloader (SBL) v3.0
138
   Copyright (C) Samsung Electronics Co., Ltd. 2006-2010
139
140
   Board Name: HERRING REV 52
141
   Build On: Jan 20 2011 17:19:41
142
-----------------------------------------------------------
143
144
MMC SEM16G 15188 MB
145
Re_partition: magic code(0x0)
146
Muxed [[OneNAND]] 512MB (0x50) Sync
147
Scanning Bad Block .......
148
Bad Block 77 (5)
149
Bad Block 295 (5)
150
Bad Block 1232 (5)
151
Bad Block 1646 (5)
152
Bad Block 1831 (5)
153
Bad Block 2047 (0)
154
Partitions loading success
155
Read image(PARAM) from flash .......
156
Done
157
init_fuel_gauge: vcell = 4083mV, soc = 94
158
PMIC_IRQ1    = 0xc0 
159
PMIC_IRQ2    = 0x0 
160
PMIC_IRQ3    = 0x0 
161
PMIC_IRQ4    = 0x0 
162
PMIC_STATUS1 = 0x0 
163
PMIC_STATUS2 = 0x0 
164
PMIC_STATUS3 = 0x0 
165
PMIC_STATUS4 = 0x0 
166
PMIC_STATUS5 = 0x0 
167
PMIC_SMPL    = 0x0 
168
Key scan = 0x0
169
message.command = 
170
message.status = 
171
message.recovery = 
172
173
BOOT_MODE_NORMAL (SW_RST(0x00000004), INFORM(0x000000ee))
174
LCD ID = 0x0060a953
175
Done
176
Kernel(boot.img) read success from partition no.5
177
Setting param.serialnr = 0x3733bab6 0x6de200ec
178
Setting param.board_rev = 0x34
179
Setting param.cmdline = console=ttyFIQ0 no_console_suspend androidboot.serialno=3733BAB66DE200EC androidboot.bootloader=I9020XXKA3 androidboot.baseband=I9020XXKB3 androidboot.info=0x4,0xee,1 androidboot.carrier=EUR gain_code=3 s3cfb.bootloaderfb=0x34a00000 mach-herring.lcd_type=0x00000000 oem_state=unlocked 
180
Setting param.initrd_start = 0x31000000, param.initrd_size = 0x23265
181
182
Starting kernel at 0x30008000...
183
184
Uncompressing Linux... done, booting the kernel.
185 4 Paul Kocialkowski
</pre>
186
187
h2. References
188
189
* S5PC110 User Manual: http://dl.project-voodoo.org/documentation/S5PC110_EVT1_UM10.pdf
190 7 Paul Kocialkowski
* Nexus S (I902x) Service Manual and Schematics: http://mobilcoms.ru/load/1-1-0-4499
191 4 Paul Kocialkowski
192 14 Paul Kocialkowski
*These documents are the propriety of Samsung Electronics and are not hosted by the Replicant project.*
193
*However, some excerpts from these documents are provided, for the purpose of providing technical evidence of the facts that are mentioned in this page. We believe that this particular use of the copyrighted work is fair use.*
194 8 Paul Kocialkowski
195
* Create your own I9000/S8500 (& all S5PC110 based devices) bootloader&ultimate unbrick (XDA): http://forum.xda-developers.com/showthread.php?t=1233273 
196
* Hummingbird Interceptor BootLoader: https://code.google.com/p/hummingbird-hibl/
197
* U-Boot second bootloader port: https://github.com/hackqiang/crespo-bootloader
198
* Bootrom (iROM) dump and disassembly: https://github.com/OSLL/boots/tree/master/S5PC110