Речь пойдет о методе программной защиты, реализованном в самом процессоре.
Для экспериментов я выбрал мультимедийную консоль Comigo Quattro. Цель — запустить собственное ядро Linux.
Краткий обзор
На первый взгляд программное обеспечение консоли представляет собой клон Android. Доступ по ssh отключен.Работает только при наличии действующей подписки от дистрибьютора.
Стоковая прошивка полностью зашифрована.
Все тихо, как в танке.
Подготовка
Первым делом я подробно ознакомился с техническим описанием процессора.Меня порадовали две вещи: процессор имел интерфейс UART и поддерживал загрузку системы из разных источников (USB, SD и т.д.), которые можно было настроить извне с помощью конфигурационного регистра.
На борту приставки также было место для mSD-карты, но разъем не был припаян.
Для того, чтобы найти места конфигурационного регистра и контакты UART, мне пришлось перепаять процессор и прозвонить дорожки.
Когда все контакты были найдены, я подключил UART адаптер и запустил приставку.
На экране появился U-Boot. Загрузка системы была прервана нажатием клавиш, и U-Boot перешел в режим ввода, но не реагировал ни на какие клавиши, кроме ввода.
И эту лазейку тоже закрыли.
U-загрузка
На этом этапе с оригинальным U-Boot сделать ничего не удалось, поэтому я решил проверить загрузку с mSD-карты.QA5:A;SVN:B72;POC:17F;STS:0;BOOT:0;INIT:0;READ:0;CHECK:0;PASS:0; no sdio debug board detected TE : 1583722 BT : 19:30:15 Apr 13 2015 PMU:NONE ##### VDDEE voltage = 0x044c CPU clock is 792MHz DDR mode: 32 bit mode DDR size: 1GB DDR check: Pass! DDR clock: 792MHz with 2T mode DDR pll bypass: Disabled DDR init use : 13644 us HHH Boot From SDIO C SD_boot_type: 00000002 card_type: 00000003 0x0000009f Aml log : M8-R2048 TPL pass! ucl decompress.pass 0x12345678 Boot from internal device 1st tSD/fSD on SDIO C TE : 1867612 System Started ==================COMIGO BOOTLOADER================== ==========12fc92:S:Enc (Apr 13 2015 - 19:29:55)========== clr h-ram DRAM: 1 GiB relocation Offset is: 2febc000 show partition table: part: 0, name : logo, size : 800000 part: 1, name : recovery_bak, size : 1000000 part: 2, name : recovery, size : 1000000 part: 3, name : boot, size : 1000000 part: 4, name : system, size : 32000000 part: 5, name : data, size : 8c000000 part: 6, name : cache, size : 20800000 part: 7, name : sec_gpt, size : end aml_card_type=0x100 MMC: out reg=c1108058,value=fffcf800 out reg=c1108058,value=fffcfa00 [mmc_register] add mmc dev_num=0, port=1, if_type=6 [mmc_register] add mmc dev_num=1, port=2, if_type=6 SDIO Port B: 0, SDIO Port C: 1 power init out reg=c110804c,value=dfffffff IR init done! register usb cfg[0][1] = 3ff6fcf4 register usb cfg[2][0] = 3ff72a6c NAND: EMMC BOOT: not init nand do not init nand : cause boot_device_flag without nand get_boot_device_flag: init_ret -1 get_boot_device_flag EMMC BOOT: init_part Emmckey: Access range is illegal! Emmckey: Access range is illegal! Unknown partition type on device 'SDIO Port C' Device 'SDIO Port C' wp size=8388608 port=2 [mmc_init] SDIO Port C:1, if_type=6, initialized OK! mmc_device_init mmc_get_partition_table Start mmc_get_partition_table Partition table get from SPL is : name offset size flag =================================================================================== 0: pri_gpt 0 800000 0 1: env 800000 800000 0 2: reserved 1000000 4000000 0 3: logo 5000000 800000 1 4: recovery_bak 5800000 1000000 1 5: recovery 6800000 1000000 1 6: boot 7800000 1000000 1 7: system 8800000 32000000 1 8: data 3a800000 8c000000 4 9: cache c6800000 20800000 2 10: sec_gpt eb800000 800000 0 mmc read lba=0x8000, blocks=0x1 mmc read lba=0x8001, blocks=0x1 mmc_read_partition_tbl: mmc read partition OK! eMMC/TSD partition table have been checked OK! i=0,register --- emmc_key MMC BOOT, emmc_env_relocate_spec : env_relocate_spec 59 set_storage_device_flag: store 2 [imgread]Secure kernel sz 0x5b36a0 Aml log : M8-R2048 IMG pass! vpu clk_level in dts: 3 set vpu clk: 182150000Hz, readback: 182150000Hz(0x701) Net: Meson_Ethernet init suspend firmware done. (ret:0) cvbs trimming.1.v5: 0xa0, 0x0 upgrade_comigo_environment: expect 6 active 6 init_comigo_environment type:flash,start to read mac. device init start aml_keys: version 0 can not be init 3ff72c68 current storer:emmc_key flash init key ok!! init flash success all key names list are(ret=18): uuid serialno mac 4:3:3:0:3:a:4:2:3:3:3:a:3:3:3:9:3:a:3:0:3:2:3:a:3:1:4:6:3:a:3:4:3:9: mac is: 43:30:3a:42:33:3a:33:39:3a:30:32:3a:31:46:3a:34:39: read ok!! read mac success,mac=C0:B3:39:02:1F:49 androidboot.mac is exist in bootargs, mac=C0:B3:39:02:1F:49 androidboot.serialno=A0652602C5706198 androidboot.uuid=4a3842462f47694d364b6f544d3236596b34374e3977 BOARD VERSION=2 reboot_mode=charging hdcp get form storage medium: auto don't found keyname,uboot_key_read:1634 prefetch hdcp keys from auto failed AKSV invalid hdmi tx power init mode = 6 vic = 4 set HDMI vic: 4 mode is: 6 viu chan = 1 config HPLL config HPLL done reconfig packet setting done key save in emmc key size=44 the key name is : the key data is :4a3842462f47694d364b6f544d3236596b34374e3977 key size=32 the key name is :serialno the key data is :41303635323630324335373036313938 A0652602C5706198 efuse version is not selected. Hit ENTER key to stop autoboot: 1 tstc enter exit abortboot: 1 COMIGO#
Для этого я припаял разъем и подключил пару контактов регистра конфигурации к земле, чтобы процессор загружал систему с карты.
Новый U-Boot был взят из экспериментальной платы ODROID-C, основанной на том же процессоре.
Собрав все это, я вставил SD-карту, включил консоль и.
увидел это: SERIAL:4;STS:0;BOOT:1;INIT:0;READ:0;CHECK:FFFFBF00;USB:3;
И этот текст повторялся каждую секунду снова и снова.
Процессор вообще не собирался нагружать мой U-Boot и это меня расстраивало.
Поиск причины
Мне стало ясно, что на процессоре включена безопасная загрузка и он проверяет код на подлинность перед его запуском.Параметр CHECK:FFFFBF00 указывал на то, что код, загруженный с карты mSD, по какой-то причине более чем полностью удовлетворил процессор.
Для сравнения загрузка оригинала начиналась поочередно так: QA5:A;SVN:B72;POC:17F;STS:0;BOOT:0;INIT:0;READ:0;CHECK:0;PASS:0;
Что проверял процессор? Я надеялся найти этот ответ в ресурсах U-Boot для AMLogic. После недолгих поисков я увидел, что часть SPL из U-Boot заканчивается этой структурой typedef struct {
unsigned int nSizeH; ///4@0
struct st_secure{
unsigned int nORGFileLen; ///4@4
unsigned int nSkippedLen; ///4@8
unsigned int nHASHLength; ///4@12
unsigned int nAESLength; ///4@16
unsigned char szHashKey[32];//32@20
unsigned char szTmCreate[24]; //24@52
unsigned char szReserved[60]; //60@76
}secure; //136@136
unsigned char szAES_Key_IMG[60];//60@136
unsigned char szTmCreate[48]; //48@196
unsigned int nSizeT; ///4@244
unsigned int nVer; ///4@248
unsigned int unAMLID; ///4@252
}st_aml_chk_blk; //256
Небольшое отступление.
Двухступенчатая система загрузки очень часто применяется на встраиваемом оборудовании.
Те.
ПЗУ процессора сначала загружает небольшую часть кода (так называемый SPL) и передает ему управление.
Тот, в свою очередь, после основных настроек загружает вторую, более крупную часть (TPL) и передает ей управление.
Ну а TPL после окончательных настроек загружает ядро и запускает его.
Забегая немного вперед, скажу, что сам SPL состоит из 32 КБ, в конце которого находится структура st_aml_chk_blk, которая в расшифрованном виде выглядит так:
Следовательно, процессор использует этот блок данных для проверки уровня SPL.
Ищем решение
Чтобы заставить процессор загружать мой U-Boot, я попробовал много вариантов.
Но все они не принесли желаемого результата — процессор упорно выдавал CHECK:FFFFBF00. Постепенно пришёл к выводу, что защита сделана на 100% и дыр нет.
После очередной неудачной попытки я отошел от консоли и пошел на кухню (разумеется, за чаем), думая о подключении JTAG, а когда вернулся, меня ждал вот такой результат: SERIAL:4;STS:0;BOOT:1;INIT:0;READ:0;CHECK:FFFFBF00;USB:3;SERIAL:4;STS:0;BOOT:1;INIT:0;READ:0;CHECK:FFFFBF00;USB:3;SERIAL:4;STS:0;BOOT:1;INIT:0;READ:0;CHECK:FFFFBF00;USB:3;SERIAL:4;STS:0;BOOT:1;INIT:0;READ:0;CHECK:FFFFBF00;USB:3;SERIAL:4;STS:0;BOOT:1;INIT:0;READ:0;CHECK:FFFFBF00;USB:3;SERIAL:4;STS:0;BOOT:1;INIT:0;READ:0;CHECK:FFFFBF00;USB:3;SERIAL:4;STS:0;BOOT:1;INIT:0;READ:0;CHECK:0;PASS:1;
-----------------------------------------------------------------------
* Welcome to Hardkernel's ODROID-C. (Built at 19:33:00 Dec 8 2014) *
-----------------------------------------------------------------------
CPU : AMLogic S805
MEM : 1024MB (DDR3@792MHz)
BID : <Unknown>
S/N :
***** Warning!! *****************************************************
* This board have not been autorized or product keys are not valid. *
* Please contact with Hardkernel or your distributor *
*********************************************************************
Ой как! Через некоторое время (это было около 40 секунд) процессор выдал CHECK:0;PASS:1; и загрузил свой U-Boot. Конечно, потом оно зависло, но это не беда, доступ к системе был получен.
Анализ
Первым делом я написал программу, которая сбрасывала ПЗУ процессора и фьюз (это участок памяти в процессоре, который можно прошить только один раз.Здесь хранятся ключи AES, публичный RSA и некоторые конфигурации процессора).
Получив таким образом ключ AES, я расшифровал оригинальный U-Boot и проанализировал ПЗУ.
Принцип загрузки SPL был следующий: ПЗУ сначала считывало конфигурацию из фьюза и сохраняло ее как переменную.
Далее загрузил с флэшки в память 32 КБ и посмотрел, что показала конфигурация, чтобы проверить подпись и шифрование.
В нашем случае ПЗУ затем прочитал показатель степени e и модуль N из фьюза, собрал PublicKey(e,N), с помощью которого расшифровал st_aml_chk_blk, затем решил sha2 из SPL без st_aml_chk_blk и сравнил полученное с ключом из st_aml_chk_blk. И в случае несоответствия дальнейших действий не предпринимал (новую подпись сделать невозможно, так как в фьюзе невозможно прописать новый публичный ключ RSA, а приватного дистрибьютора конечно у нас нет ключ тоже).
Так что же заставило процессор выполнить мой SPL? Подпись все равно не совпадает. Для поддержки RSA в ПЗУ включена (скорее всего) библиотека PolarSSL (разобрав ПЗУ, я нашел параллели с ресурсами этой библиотеки).
Но он поддерживал алгоритм AES на аппаратном уровне, если мне не изменяет память.
ROM управляет свободной памятью, используя свой собственный механизм (похожий на malloc и memfree).
Перед вызовом функций из библиотеки PolarSSL ПЗУ выделяло ей определенный участок памяти, но в некоторых случаях не всегда освобождало ее.
Например, когда функция RSA отвалилась из-за невозможности расшифровать невалидный блок, который я в этой попытке использовал в своем SPL. Что случилось? ПЗУ выделил память, попытался расшифровать мою фейковую подпись, забыл освободить память, выдал ошибку CHECK:FFFFBF00 и цикл повторился.
В какой-то момент другая часть новой памяти перезапишет переменную Fuse, которую ПЗУ сохранило в самом начале.
В следующем цикле эта переменная уже имела значение 0, что означало: просто загрузите все, что у вас есть, и запустите.
Дальше в принципе ничего интересного не было.
Я пересобрал исходную версию U-Boot, удалил проверку TPL, проверку ядра команды bootm и включил интерпретатор Hush, чтобы он реагировал на команды.
Расшифровав ядро и собрав минимум на BusyBox, я запустил Linux из переделанного U-Boot, который начал загружаться через 40 секунд. Оригинальный U-Boot с включенным терминалом ==================COMIGO BOOTLOADER==================
==========395456:S:Enc (Nov 03 2015 - 19:33:53)==========
clr h-ram
DRAM: 1 GiB
relocation Offset is: 2febc000
show partition table:
part: 0, name : logo, size : 800000
part: 1, name : recovery_bak, size : 1000000
part: 2, name : recovery, size : 1000000
part: 3, name : boot, size : 1000000
part: 4, name : system, size : 32000000
part: 5, name : data, size : 8c000000
part: 6, name : cache, size : 20800000
part: 7, name : sec_gpt, size : end
aml_card_type=0x100
MMC: out reg=c1108058,value=fffffdff
out reg=c1108058,value=ffffffff
[mmc_register] add mmc dev_num=0, port=1, if_type=6
[mmc_register] add mmc dev_num=1, port=2, if_type=6
SDIO Port B: 0, SDIO Port C: 1
power init
out reg=c110804c,value=dfffffff
IR init done!
register usb cfg[0][1] = 3ff6fd14
register usb cfg[2][0] = 3ff72a8c
NAND: CARD BOOT: not init nand
do not init nand : cause boot_device_flag without nand
get_boot_device_flag: init_ret -1
get_boot_device_flag CARD BOOT:
BOOT FROM CARD? env_relocate_spec
SF: Unsupported manufacturer 00
Failed to initialize SPI flash at 0:2
Unknown command 'nand' - try 'help'
init_part
Emmckey: Access range is illegal!
Emmckey: Access range is illegal!
Unknown partition type on device 'SDIO Port C'
Device 'SDIO Port C' wp size=8388608 port=2
[mmc_init] SDIO Port C:1, if_type=6, initialized OK!
mmc_device_init
mmc_get_partition_table
Start mmc_get_partition_table
Partition table get from SPL is :
name offset size flag
===================================================================================
0: pri_gpt 0 800000 0
1: env 800000 800000 0
2: reserved 1000000 4000000 0
3: logo 5000000 800000 1
4: recovery_bak 5800000 1000000 1
5: recovery 6800000 1000000 1
6: boot 7800000 1000000 1
7: system 8800000 32000000 1
8: data 3a800000 8c000000 4
9: cache c6800000 20800000 2
10: sec_gpt eb800000 800000 0
mmc read lba=0x8000, blocks=0x1
mmc read lba=0x8001, blocks=0x1
mmc_read_partition_tbl: mmc read partition OK!
eMMC/TSD partition table have been checked OK!
i=0,register --- emmc_key
Device: SDIO Port C
Manufacturer ID: 0
OEM: 0
Name: ETran Speed: 25000000
Rd Block Len: 512
MMC version 4.0
High Capacity: Yes
Capacity: 3959422976
Boot Part Size: 2097152
Bus Width: 4-bit
MMC BOOT, emmc_env_relocate_spec env_relocate_spec 77
set_storage_device_flag: store 3
Err imgread(L129):Fmt unsupported!genFmt 0x0 != 0x3
check dts: FDT_ERR_BADMAGIC, load default vpu parameters
vpu clk_level = 3
set vpu clk: 182150000Hz, readback: 182150000Hz(0x701)
Net: Meson_Ethernet
msg:====>upgrade_step=0<=====
init_part
[mmc_init] SDIO Port B:0, if_type=7, initialized OK!
Device: SDIO Port B
Manufacturer ID: 0
OEM: 0
Name: Tran Speed: 20000000
Rd Block Len: 512
SD version 2.0
High Capacity: Yes
Capacity: 15523119104
Boot Part Size: 0
Bus Width: 4-bit
** Unable to use mmc 0:1 for fatload **
init suspend firmware done. (ret:0)
cvbs trimming.1.v5: 0xa0, 0x0
upgrade_comigo_environment: expect 9 active 9
init_comigo_environment
type:flash,start to read mac.
device init start
aml_keys: version 0 can not be init 3ff72c88
current storer:emmc_key
flash init key ok!!
init flash success
all key names list are(ret=18):
uuid
serialno
mac
4:3:3:0:3:a:4:2:3:3:3:a:3:3:3:9:3:a:3:0:3:1:3:a:3:3:3:5:3:a:3:0:3:5:
mac is: 43:30:3a:42:33:3a:33:39:3a:30:31:3a:33:35:3a:30:35:
read ok!!
read mac success,mac=C0:B3:39:01:35:05
androidboot.mac is exist in bootargs, mac=C0:B3:39:01:35:05 androidboot.serialno=A0651002B9205401 androidboot.uuid=48304142556a6c66367a5450774c6d6671692f737241
BOARD VERSION=2
reboot_mode=charging
hdcp get form storage medium: auto
don't found keyname,uboot_key_read:1634
prefetch hdcp keys from auto failed
hdmi tx power init
mode = 6 vic = 4
set HDMI vic: 4
mode is: 6
viu chan = 1
config HPLL
config HPLL done
reconfig packet setting done
Err imgread(L526):head magic error
There is no valid bmp file at the given address
key save in emmc
don't found keyname,uboot_key_read:1634
read error!!
Saving Environment to eMMC.
BOOT FROM CARD?
SF: Unsupported manufacturer 00
Failed to initialize SPI flash at 0:2
Unknown command 'nand' - try 'help'
Device: SDIO Port C
Manufacturer ID: 0
OEM: 0
Name: ETran Speed: 25000000
Rd Block Len: 512
MMC version 4.0
High Capacity: Yes
Capacity: 3959422976
Boot Part Size: 2097152
Bus Width: 4-bit
MMC BOOT, emmc_saveenv saveenv 119
mmc save env ok
key size=44
the key name is :
the key data is :48304142556a6c66367a5450774c6d6671692f737241
key size=32
the key name is :serialno
the key data is :41303635313030324239323035343031
A0651002B9205401
efuse version is not selected.
Hit ENTER key to stop autoboot: 1 tstc enter
WELCOME>
WELCOME>version
395456:S:Enc (Nov 03 2015 - 19:33:53)
arm-none-eabi-gcc (Sourcery G++ Lite 2010q1-188) 4.4.1
GNU ld (Sourcery G++ Lite 2010q1-188) 2.19.51.20090709
WELCOME>
Загрузка ядра ODROID с новым TPL U-boot-00000-ge6d5633(odroidc@e6d5633f) (Feb 12 2016 - 19:16:57)
I2C: clear pinmux reg1[24]=0
clear pinmux reg1[1]=0
out reg=c1108058,value=ffffffff
set output en 0xc1108054[21]=0
set output val 0xc1108058[21]=0
clear pinmux reg1[25]=0
clear pinmux reg8[12]=0
clear pinmux reg1[3]=0
clear pinmux reg1[2]=0
set output en 0xc1108054[20]=1
clear pinmux reg1[24]=0
clear pinmux reg1[1]=0
out reg=c1108058,value=ffffffff
set output en 0xc1108054[21]=0
set output val 0xc1108058[21]=0
clear pinmux reg1[25]=0
clear pinmux reg8[12]=0
clear pinmux reg1[3]=0
clear pinmux reg1[2]=0
out reg=c1108058,value=ffffffff
set output en 0xc1108054[20]=0
set output val 0xc1108058[20]=0
clear pinmux reg1[25]=0
clear pinmux reg8[12]=0
clear pinmux reg1[3]=0
clear pinmux reg1[2]=0
set output en 0xc1108054[20]=1
clear pinmux reg1[24]=0
clear pinmux reg1[1]=0
out reg=c1108058,value=ffdfffff
set output en 0xc1108054[21]=0
set output val 0xc1108058[21]=0
clear pinmux reg1[24]=0
clear pinmux reg1[1]=0
out reg=c1108058,value=ffffffff
set output en 0xc1108054[21]=0
set output val 0xc1108058[21]=0
clear pinmux reg1[24]=0
clear pinmux reg1[1]=0
out reg=c1108058,value=ffdfffff
set output en 0xc1108054[21]=0
set output val 0xc1108058[21]=0
clear pinmux reg1[24]=0
clear pinmux reg1[1]=0
out reg=c1108058,value=ffffffff
set output en 0xc1108054[21]=0
set output val 0xc1108058[21]=0
clear pinmux reg1[24]=0
clear pinmux reg1[1]=0
out reg=c1108058,value=ffdfffff
set output en 0xc1108054[21]=0
set output val 0xc1108058[21]=0
clear pinmux reg1[24]=0
clear pinmux reg1[1]=0
out reg=c1108058,value=ffffffff
set output en 0xc1108054[21]=0
set output val 0xc1108058[21]=0
clear pinmux reg1[24]=0
clear pinmux reg1[1]=0
out reg=c1108058,value=ffdfffff
set output en 0xc1108054[21]=0
set output val 0xc1108058[21]=0
clear pinmux reg1[24]=0
clear pinmux reg1[1]=0
out reg=c1108058,value=ffffffff
set output en 0xc1108054[21]=0
set output val 0xc1108058[21]=0
clear pinmux reg1[24]=0
clear pinmux reg1[1]=0
out reg=c1108058,value=ffdfffff
set output en 0xc1108054[21]=0
set output val 0xc1108058[21]=0
clear pinmux reg1[24]=0
clear pinmux reg1[1]=0
out reg=c1108058,value=ffffffff
set output en 0xc1108054[21]=0
set output val 0xc1108058[21]=0
clear pinmux reg1[24]=0
clear pinmux reg1[1]=0
out reg=c1108058,value=ffdfffff
set output en 0xc1108054[21]=0
set output val 0xc1108058[21]=0
clear pinmux reg1[24]=0
clear pinmux reg1[1]=0
out reg=c1108058,value=ffffffff
set output en 0xc1108054[21]=0
set output val 0xc1108058[21]=0
clear pinmux reg1[24]=0
clear pinmux reg1[1]=0
out reg=c1108058,value=ffdfffff
set output en 0xc1108054[21]=0
set output val 0xc1108058[21]=0
clear pinmux reg1[24]=0
clear pinmux reg1[1]=0
out reg=c1108058,value=ffffffff
set output en 0xc1108054[21]=0
set output val 0xc1108058[21]=0
clear pinmux reg1[24]=0
clear pinmux reg1[1]=0
out reg=c1108058,value=ffdfffff
set output en 0xc1108054[21]=0
set output val 0xc1108058[21]=0
clear pinmux reg1[24]=0
clear pinmux reg1[1]=0
out reg=c1108058,value=ffffffff
set output en 0xc1108054[21]=0
set output val 0xc1108058[21]=0
clear pinmux reg1[24]=0
clear pinmux reg1[1]=0
out reg=c1108058,value=ffdfffff
set output en 0xc1108054[21]=0
set output val 0xc1108058[21]=0
clear pinmux reg1[24]=0
clear pinmux reg1[1]=0
out reg=c1108058,value=ffffffff
set output en 0xc1108054[21]=0
set output val 0xc1108058[21]=0
clear pinmux reg1[24]=0
clear pinmux reg1[1]=0
out reg=c1108058,value=ffdfffff
set output en 0xc1108054[21]=0
set output val 0xc1108058[21]=0
clear pinmux reg1[25]=0
clear pinmux reg8[12]=0
clear pinmux reg1[3]=0
clear pinmux reg1[2]=0
out reg=c1108058,value=ffcfffff
set output en 0xc1108054[20]=0
set output val 0xc1108058[20]=0
clear pinmux reg1[24]=0
clear pinmux reg1[1]=0
out reg=c1108058,value=ffefffff
set output en 0xc1108054[21]=0
set output val 0xc1108058[21]=0
clear pinmux reg1[25]=0
clear pinmux reg8[12]=0
clear pinmux reg1[3]=0
clear pinmux reg1[2]=0
set output en 0xc1108054[20]=1
clear pinmux reg1[25]=0
clear pinmux reg8[12]=0
clear pinmux reg1[3]=0
clear pinmux reg1[2]=0
set output en 0xc1108054[20]=1
clear pinmux reg1[25]=0
clear pinmux reg8[12]=0
clear pinmux reg1[3]=0
clear pinmux reg1[2]=0
set output en 0xc1108054[20]=1
ready
DRAM: 1 GiB
relocation Offset is: 2ff18000
MMC: SDCARD: 0, eMMC: 1
IR init is done!
*** Warning - bad CRC, using default environment
mmc save env ok
vpu clk_level = 3
set vpu clk: 182150000Hz, readback: 182150000Hz(0x701)
mode = 6 vic = 4
set HDMI vic: 4
mode is: 6
viu chan = 1
config HPLL
config HPLL done
reconfig packet setting done
MMC read: dev # 0, block # 33984, count 12288 .
12288 blocks read: OK ============================================================ Vendor: Man 035054 Snr da23a8bd Rev: 3.0 Prod: SL16G Type: Removable Hard Disk Capacity: 14804.0 MB = 14.4 GB (30318592 x 512) ------------------------------------------------------------ Partition Start Sector Num Sectors Type 1 16065 1007936 2 ============================================================ MMC read: dev # 0, block # 17600, count 16384 .
16384 blocks read: OK ## ANDROID Format IMAGE ## Booting kernel from Legacy Image at 12000000 .
Image Name: Linux-3.10.33 Image Type: ARM Linux Kernel Image (lzo compressed) Data Size: 5012513 Bytes = 4.8 MiB Load Address: 00208000 Entry Point: 00208000 Verifying Checksum .
OK Ramdisk start addr = 0x124c8800, len = 0x14b29a Flat device tree start addr = 0x12614000, len = 0x45e1 magic=0xedfe0dd0 Uncompressing Kernel Image .
OK uboot time: 56206396 us. Using machid 0xf81 from environment From device tree /memory/ node aml_reserved_end property, for relocate ramdisk and fdt, relocate_addr: 0x5154001 Loading Ramdisk to 05008000, end 0515329a .
OK Loading Device Tree to 05000000, end 050075e0 .
OK Starting kernel .
[ 0.000000@0] Booting Linux on physical CPU 0x200 [ 0.000000@0] Linux version 3.10.33-00262-g02f0572 (jenkins@build) (gcc version 4.9.2 20140904 (prerelease) (crosstool-NG linaro-1.13.1-4.9-2014.09 - Linaro GCC 4.9-2014.09) ) #1 SMP PREEMPT Mon Feb 22 12:44:47 KST 2016 [ 0.000000@0] CPU: ARMv7 Processor [410fc051] revision 1 (ARMv7), cr=10c5387d [ 0.000000@0] CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache [ 0.000000@0] Machine: ODROIDC, model: AMLOGIC [ 0.000000@0] physical memory start address is 0x200000 [ 0.000000@0] reserved_end is e3fffff [ 0.000000@0] [ 0.000000@0] Total memory is 1022 MiB [ 0.000000@0] Reserved low memory from 0x06000000 to 0x0e3fffff, size: 132 MiB [ 0.000000@0] mesonfb0(low) : 0x06100000 - 0x07900000 ( 24 MiB) [ 0.000000@0] mesonfb1(low) : 0x07900000 - 0x07a00000 ( 1 MiB) [ 0.000000@0] deinterlace0(high) : 0x3df00000 - 0x40000000 ( 33 MiB) [ 0.000000@0] mesonstream0(low) : 0x07a00000 - 0x09a00000 ( 32 MiB) [ 0.000000@0] vdec0(low) : 0x09a00000 - 0x0da00000 ( 64 MiB) [ 0.000000@0] ppmgr0(high) : 0x3bf00000 - 0x3df00000 ( 32 MiB) [ 0.000000@0] amvideocap0(low) : 0x0da00000 - 0x0e400000 ( 10 MiB) [ 0.000000@0] cma: CMA: reserved 8 MiB at 2f000000 [ 0.000000@0] cma: Found region@0, memory base 0, size 42 MiB [ 0.000000@0] cma: CMA: reserved 44 MiB at 2c400000 [ 0.000000@0] Memory policy: ECC disabled, Data cache writealloc [ 0.000000@0] Meson chip version = RevA (1B:A - 0:B72) [ 0.000000@0] PERCPU: Embedded 8 pages/cpu @c1318000 s8832 r8192 d15744 u32768 [ 0.000000@0] Built 1 zonelists in Zone order, mobility grouping on. Total pages: 206096 [ 0.000000@0] Kernel command line: root=/dev/mmcblk0p2 rw console=ttyS0,115200n8 no_console_suspend [ 0.000000@0] PID hash table entries: 4096 (order: 2, 16384 bytes) [ 0.000000@0] Dentry cache hash table entries: 131072 (order: 7, 524288 bytes) [ 0.000000@0] Inode-cache hash table entries: 65536 (order: 6, 262144 bytes) [ 0.000000@0] Memory: 64MB 16MB 731MB = 811MB total [ 0.000000@0] Memory: 755256k/755256k available, 75208k reserved, 201728K highmem [ 0.000000@0] Virtual kernel memory layout: [ 0.000000@0] vector : 0xffff0000 - 0xffff1000 ( 4 kB) [ 0.000000@0] fixmap : 0xfff00000 - 0xfffe0000 ( 896 kB) [ 0.000000@0] vmalloc : 0xf0000000 - 0xff000000 ( 240 MB) [ 0.000000@0] lowmem : 0xc0000000 - 0xef800000 ( 760 MB) [ 0.000000@0] pkmap : 0xbfe00000 - 0xc0000000 ( 2 MB) [ 0.000000@0] modules : 0xbf000000 - 0xbfe00000 ( 14 MB) [ 0.000000@0] .
text : 0xc0008000 - 0xc0864328 (8561 kB) [ 0.000000@0] .
init : 0xc0865000 - 0xc089b280 ( 217 kB) [ 0.000000@0] .
data : 0xc089c000 - 0xc08fba60 ( 383 kB) [ 0.000000@0] .
bss : 0xc08fba60 - 0xc0b8b0c4 (2622 kB)
[ 0.000000@0] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=4, Nodes=1
[ 0.000000@0] Preemptible hierarchical RCU implementation.
Я почти уверен, что эта ошибка ПЗУ будет наблюдаться во всей серии S805-B, а может и в последующих версиях.
Для желающих поэкспериментировать вот оригинальный дамп с сайта эммк .
Теги: #Процессоры #обратное проектирование #Ассемблер #comigo quattro #s805-b
-
Рутрекер Внесен В Реестр Роскомнадзора
19 Oct, 24 -
Pppos Реализация Stm32F4-Discovery
19 Oct, 24 -
Интересные Международные События В Апреле
19 Oct, 24 -
Способы Работы С Закладками В Компиляторах
19 Oct, 24