Project

General

Profile

ExynosModemIsolation » History » Version 5

Denis 'GNUtoo' Carikli, 03/02/2020 10:43 AM
Improve links

1 1 Paul Kocialkowski
h1. S5PC110 Hardware Design
2
3
This explains the hardware design found in many S5PC110 phones.
4
5
h2. Hardware design matrix
6
7
|_. *Chip* |_. Controlled by the CPU |_. Controlled by the modem |_. Connected to the modem |
8
| GPS | Yes | No | No? |
9
| Audio CODEC | Yes | No | Yes |
10
| NAND | Yes | No | No |
11 3 Paul Kocialkowski
| RAM | Yes | Yes (96Mib at least) | Yes |
12 1 Paul Kocialkowski
| WiFi/Bluetooth | Yes | No | No |
13
| Sensors | Yes | No | No |
14
| NFC | Yes | No | No |
15
| Camera | Yes | No | No |
16
17
h2. Modem isolation
18
19 2 Paul Kocialkowski
The modem (XMM 6160) is separated from the SoC and communicates with it via serial over 16Mib of shared memory: this is bad since it means that RAM is compromised (at least 80Mib + 16Mib = 96Mib) and can be used to spy.
20 1 Paul Kocialkowski
Regarding audio, the modem is connected to the CODEC but cannot control it (the SoC has to enable routing from/to the modem).
21
There is no evidence that the GPS is connected to the modem, but since we cannot check on the hardware, there is no proof it's not connected to it either. The SoC is able to control the GPS power though, so we can keep it off.
22
Since the SoC has to load the modem firmware over the (fake) serial, and following the datasheets, the modem is not connected to the NAND.
23
24 5 Denis 'GNUtoo' Carikli
h2. Exynos 3110 devices with RAM chips shared between the modem and the system on a chip
25 1 Paul Kocialkowski
26 5 Denis 'GNUtoo' Carikli
Affected devices:
27
* Nexus S (GT-I9020)
28
* Nexus S (GT-I9020A)
29
* Nexus S (GT-I9023)
30
31 3 Paul Kocialkowski
The modem is able to spy on (at least) 96 Mib of the main memory. So far, we cannot tell:
32
* if it can only spy 80Mib or the full memory
33 1 Paul Kocialkowski
* if it can be fixed or not
34 4 Paul Kocialkowski
35
The Linux kernel is being loaded at the beginning of the shared memory bank (0x30000000), however the kernel should be off when it loads.
36 1 Paul Kocialkowski
37
h3. Kernel details
38
39 5 Denis 'GNUtoo' Carikli
In "kernel-crespo/arch/arm/mach-s5pv210/dev-herring-phone.c":https://git.replicant.us/replicant/kernel_samsung_crespo/tree/arch/arm/mach-s5pv210/dev-herring-phone.c#n49 we have:
40 1 Paul Kocialkowski
<pre>
41
static struct resource mdmctl_res[] = {
42
[...]
43
        [2] = {
44
                .name = "onedram",
45
                .start = (S5PV210_PA_SDRAM + 0x05000000),
46
                .end = (S5PV210_PA_SDRAM + 0x05000000 + SZ_16M - 1),
47
                .flags = IORESOURCE_MEM,
48
        },
49
};
50
</pre>
51
52
* S5PV210_PA_SDRAM is 0x30000000
53 3 Paul Kocialkowski
* 0x05000000 is 80Mib
54 1 Paul Kocialkowski
* mdmctl_res goes in a platform device struct which is passed to the modem driver:
55
56
<pre>
57
static struct platform_device modemctl = {
58
        .name = "modemctl",
59
        .id = -1,
60
        .num_resources = ARRAY_SIZE(mdmctl_res),
61
        .resource = mdmctl_res,
62
        .dev = {
63
                .platform_data = &mdmctl_data,
64
        },
65
};
66
</pre>
67
68
And in the board file (in kernel-crespo/arch/arm/mach-s5pv210/mach-herring.c) we have: 
69
<pre>
70
static void __init herring_fixup(struct machine_desc *desc,
71
                struct tag *tags, char **cmdline,
72
                struct meminfo *mi)
73
{
74
        mi->bank[0].start = 0x30000000;
75
        mi->bank[0].size = 80 * SZ_1M;
76
        mi->bank[0].node = 0;
77
</pre>
78
79 3 Paul Kocialkowski
So we can suppose that there is at least one ram chip that is shared between the modem and the main CPU. Avoiding the use of this memory bank would result in loosing 80Mib of memory.
80 4 Paul Kocialkowski
81
h3. Fix attempt
82
83
An ideal fix fix would be to lose that 80Mib of RAM so that the shared memory can still be used for SoC/Modem communication but can't spy on the SoC data on RAM. The fact that it's the kernel loading address makes the task more difficult (it may require the bootloader cooperation, which is non-free).
84
85
The current diff with the Nexus S kernel is here, but it doesn't boot at all with the following changes (and mkbootimg changes):
86
87
<pre>
88
diff --git a/arch/arm/configs/herring_defconfig b/arch/arm/configs/herring_defconfig
89
old mode 100755
90
new mode 100644
91
index 11abbf0..99bf3f5
92
--- a/arch/arm/configs/herring_defconfig
93
+++ b/arch/arm/configs/herring_defconfig
94
@@ -1,7 +1,7 @@
95
 #
96
 # Automatically generated make config: don't edit
97
 # Linux kernel version: 2.6.35.7
98
-# Fri Jun  3 07:07:08 2011
99
+# Sun Apr  8 14:40:16 2012
100
 #
101
 CONFIG_ARM=y
102
 CONFIG_HAVE_PWM=y
103
@@ -418,8 +418,8 @@ CONFIG_ALIGNMENT_TRAP=y
104
 #
105
 CONFIG_ZBOOT_ROM_TEXT=0
106
 CONFIG_ZBOOT_ROM_BSS=0
107
-CONFIG_CMDLINE="console=ttyFIQ0"
108
-# CONFIG_CMDLINE_FORCE is not set
109
+CONFIG_CMDLINE="console=ttyFIQ0 no_console_suspend earlyprintk=serial,ttySAC2,115200 androidboot.serialno=3733BAB66DE200EC androidboot.bootloader=I9020XXKA3 androidboot.baseband=I9020XXKB3 androidboot.info=0x4,0x0,1 androidboot.carrier=EUR gain_code=3 s3cfb.bootloaderfb=0x34a00000 mach-herring.lcd_type=0x00000000 oem_state=unlocked"
110
+CONFIG_CMDLINE_FORCE=y
111
 # CONFIG_XIP_KERNEL is not set
112
 # CONFIG_KEXEC is not set
113
 
114
@@ -823,8 +823,6 @@ CONFIG_UEVENT_HELPER_PATH=""
115
 CONFIG_STANDALONE=y
116
 CONFIG_PREVENT_FIRMWARE_BUILD=y
117
 # CONFIG_FW_LOADER is not set
118
-# CONFIG_FIRMWARE_IN_KERNEL is not set
119
-CONFIG_EXTRA_FIRMWARE=""
120
 # CONFIG_DEBUG_DRIVER is not set
121
 # CONFIG_DEBUG_DEVRES is not set
122
 # CONFIG_SYS_HYPERVISOR is not set
123
@@ -835,7 +833,7 @@ CONFIG_MTD=y
124
 CONFIG_MTD_CONCAT=y
125
 CONFIG_MTD_PARTITIONS=y
126
 # CONFIG_MTD_REDBOOT_PARTS is not set
127
-# CONFIG_MTD_CMDLINE_PARTS is not set
128
+CONFIG_MTD_CMDLINE_PARTS=y
129
 # CONFIG_MTD_AFS_PARTS is not set
130
 # CONFIG_MTD_AR7_PARTS is not set
131
 
132
@@ -1191,6 +1189,7 @@ CONFIG_DEVKMEM=y
133
 CONFIG_SERIAL_SAMSUNG=y
134
 CONFIG_SERIAL_SAMSUNG_UARTS_4=y
135
 CONFIG_SERIAL_SAMSUNG_UARTS=4
136
+# CONFIG_SERIAL_SAMSUNG_DEBUG is not set
137
 CONFIG_SERIAL_SAMSUNG_CONSOLE=y
138
 CONFIG_SERIAL_S5PV210=y
139
 # CONFIG_SERIAL_MAX3100 is not set
140
@@ -2046,7 +2045,9 @@ CONFIG_HAVE_ARCH_KGDB=y
141
 CONFIG_DEBUG_USER=y
142
 CONFIG_DEBUG_ERRORS=y
143
 # CONFIG_DEBUG_STACK_USAGE is not set
144
-# CONFIG_DEBUG_LL is not set
145
+CONFIG_DEBUG_LL=y
146
+CONFIG_EARLY_PRINTK=y
147
+# CONFIG_DEBUG_ICEDCC is not set
148
 CONFIG_OC_ETM=y
149
 CONFIG_DEBUG_S3C_UART=2
150
 
151
diff --git a/arch/arm/mach-s5pv210/dev-herring-phone.c b/arch/arm/mach-s5pv210/dev-herring-phone.c
152
index f8798b3..ecef636 100755
153
--- a/arch/arm/mach-s5pv210/dev-herring-phone.c
154
+++ b/arch/arm/mach-s5pv210/dev-herring-phone.c
155
@@ -48,8 +48,8 @@ static struct resource mdmctl_res[] = {
156
 	},
157
 	[2] = {
158
 		.name = "onedram",
159
-		.start = (S5PV210_PA_SDRAM + 0x05000000),
160
-		.end = (S5PV210_PA_SDRAM + 0x05000000 + SZ_16M - 1),
161
+		.start = (0x30000000  + 0x05000000),
162
+		.end = (0x30000000  + 0x05000000 + SZ_16M - 1),
163
 		.flags = IORESOURCE_MEM,
164
 	},
165
 };
166
diff --git a/arch/arm/mach-s5pv210/mach-herring.c b/arch/arm/mach-s5pv210/mach-herring.c
167
index c3a0182..67fa1cf 100755
168
--- a/arch/arm/mach-s5pv210/mach-herring.c
169
+++ b/arch/arm/mach-s5pv210/mach-herring.c
170
@@ -5494,21 +5494,17 @@ static void __init herring_fixup(struct machine_desc *desc,
171
 		struct tag *tags, char **cmdline,
172
 		struct meminfo *mi)
173
 {
174
-	mi->bank[0].start = 0x30000000;
175
-	mi->bank[0].size = 80 * SZ_1M;
176
+	mi->bank[0].start = 0x40000000;
177
+	mi->bank[0].size = 256 * SZ_1M;
178
 	mi->bank[0].node = 0;
179
 
180
-	mi->bank[1].start = 0x40000000;
181
-	mi->bank[1].size = 256 * SZ_1M;
182
-	mi->bank[1].node = 1;
183
-
184
-	mi->bank[2].start = 0x50000000;
185
+	mi->bank[1].start = 0x50000000;
186
 	/* 1M for ram_console buffer */
187
-	mi->bank[2].size = 127 * SZ_1M;
188
-	mi->bank[2].node = 2;
189
-	mi->nr_banks = 3;
190
+	mi->bank[1].size = 127 * SZ_1M;
191
+	mi->bank[1].node = 1;
192
+	mi->nr_banks = 2;
193
 
194
-	ram_console_start = mi->bank[2].start + mi->bank[2].size;
195
+	ram_console_start = mi->bank[1].start + mi->bank[1].size;
196
 	ram_console_size = SZ_1M - SZ_4K;
197
 
198
 	pm_debug_scratchpad = ram_console_start + ram_console_size;
199
</pre>
200
201
<pre>
202
diff --git a/BoardConfigCommon.mk b/BoardConfigCommon.mk
203
index fff6d1b..c09d935 100755
204
--- a/BoardConfigCommon.mk
205
+++ b/BoardConfigCommon.mk
206
@@ -51,10 +51,10 @@ DEFAULT_FB_NUM := 2
207
 
208
 BOARD_NAND_PAGE_SIZE := 4096 -s 128
209
 
210
-BOARD_KERNEL_BASE := 0x30000000
211
+BOARD_KERNEL_BASE := 0x40000000
212
 BOARD_KERNEL_PAGESIZE := 4096
213
-BOARD_KERNEL_CMDLINE := console=ttyFIQ0 no_console_suspend
214
-
215
+BOARD_KERNEL_CMDLINE := console=ttyFIQ0 no_console_suspend earlyprintk=serial,ttySAC2,115200 bootmem_debug
216
+BOARD_FORCE_RAMDISK_ADDRESS := 0x41000000
217
 #TARGET_RECOVERY_UI_LIB := librecovery_ui_crespo
218
 TARGET_RELEASETOOLS_EXTENSIONS := device/samsung/crespo
219
</pre>