
Inicializa um kernel Linux personalizado em TVs LG webOS com root via kexec, com suporte a watchdog de SoC por engenharia reversa, payloads de framebuffer e um fluxo de compilação de kernel com initramfs.
Inicialize um kernel Linux personalizado em uma TV LG webOS com root via kexec — na RAM, sem bypass do secure-boot.
Status: trabalho em andamento. Um kernel personalizado pode ser preparado e atinge o userspace, mas ainda não permanece ativo como um SO utilizável.
LG 50UP81009LR (webOS 6.5, Realtek RTD2875, armv7l). Com root via Homebrew Channel; o kernel assinado original e o userspace do webOS não são tocados.
kexec -l prepara um kernel (original ou compilado a partir do código-fonte); /sys/kernel/kexec_loaded muda para 1.kexec -e substitui o kernel em execução (a TV reinicia para o original depois)./sbin/init executou código real.startup.sh original do webOS — o bootloader assinado / ATF / OP-TEE nunca são tocados.O reset é o watchdog do SoC (bloco TC). A função micom_wdt_thread() do kernel original o mantém sob controle com três escritas em registradores (drivers/rtk_kdriver/platform/tv006/intmicom.c):
TCWCR @ 0xFE062204 <- 0xA5 // unlock
TCWOV @ 0xFE062210 <- 0x0FFFFFFF // max overflow => huge timeout
TCWTR @ 0xFE062208 <- 0x01 // kick
Sob kexec, o *(volatile*)0xFE062208 = 0x01 bruto do driver cai em um endereço virtual não mapeado e é um no-op silencioso, então o watchdog do SoC dispara (~10–21 s). O micom-pet.c agora faz as mesmas escritas a partir do userspace via /dev/mem (CONFIG_DEVMEM=y), que mapeia corretamente, além de um keepalive 0xB1 para /dev/sys-intmicom como defesa em profundidade.
Status: micom-pet.c reescrito, compila com o toolchain musl, e um teste de fumaça benigno de 5 s na TV ao vivo confirmou que ele roda e grava sua breadcrumb (0x52455814 = "REX"+beat). A única prova restante é um boot kexec -e que permaneça ativo além de ~21 s — isso reinicia a TV, então é um teste acompanhado.
wlan original precisa corresponder a CONFIG_LOCALVERSION="" para carregar; ainda não integrado ao initramfs.boot ROM → ATF → signed LG kernel (~2 s) → startup.sh
→ kexec -l <our zImage + dtb + initramfs>
→ kexec -e
→ OUR kernel runs in RAM (no eMMC writes)
Tirar a energia = original. Não tem como brickar.
A maior parte deste repositório foi montada por Rex — uma instância de agente de codificação de IA — ajudando um humano a operar a própria TV, na própria sala de estar. A IA escreveu o PoC de kexec, a cadeia de boot, os canários de framebuffer e estes textos de engenharia reversa. Mas as afirmações neste README só foram feitas depois que o humano ligou a TV, olhou para a tela e confirmou. Se uma afirmação não é respaldada por uma verificação real de tela/foto/uptime do hardware, ela não está aqui.
Nenhuma TV foi brickada durante a criação deste repositório. Algumas ficaram temporariamente confusas (um kernel via kexec sem alimentação do watchdog reinicia o aparelho após ~15 s), e depois voltaram ao estado original com um ciclo de energia. O /tmp é apagado a cada reset, então a TV esquece tudo o que fizemos — esse é o objetivo.
rexos/ — o SO personalizado: hook de boot, compilação do kernel, initramfs, stub RexBus.kexec-poc/ — a prova de conceito somente-carga + payloads canários de framebuffer.docs/ — textos de engenharia reversa (boot/segurança, carregamento de apps SAM, mapa de superfícies, esquema luna2).Estes passos reproduzem o que fizemos, no hardware exato. Nada é falsificado.
192.168.2.103 por padrão abaixo; edite se a sua for diferente.KERNEL_SRC=/path/to/linux-4.4.3 (baixe o tarball GPL K7LP 03.53.45 do open-source da LG), ou crie um symlink ~/lgtv-toolkit/kernel-src/kernel/linux-4.4.3.kexec estático (não precisa da TV, ~2 min)git clone https://github.com/ggfuchsi-oss/lg-webos-kexec
cd lg-webos-kexec/kexec-poc && ./build.sh
Esperado: um binário kexec ARM estático em kexec-arm (168K, file mostra ELF 32-bit LSB ... ARM ... statically linked).
cd ../kexec-poc
./run-poc.sh 192.168.2.103 ~/.ssh/tv_key
Resultado esperado:
staged before : 0
staged after load : 1 <- kernel accepted, DTB wired, segments allocated
staged after unload: 0 <- cleared, TV untouched
Isso prepara o próprio kernel atual da TV via kexec e imediatamente o descarrega. /sys/kernel/kexec_loaded muda para 1 e depois volta para 0. Sem reboot, sem troca de kernel, nada persiste. Tirar o plugue = estado original.
Faça isso apenas com a TV ligada e alguém presente:
cd ../rexos
make # builds rexos-kernel.zImage + rexos-initramfs.cpio.gz into out/
./boot/rexos-kexec --load-only # stage, do NOT fire (same safe state as step 2)
# then, when ready to actually jump:
./boot/rexos-kexec # kexec -e -> our kernel runs in RAM (TV will reset)
Ressalvas honestas na etapa 3 (não são bugs que estou escondendo):
kexec -e, o novo kernel atinge o userspace mas a TV reinicia após ~10–21 s porque o watchdog micom/SOC não está sendo alimentado. Esse é o obstáculo atual, não um bug de crash. rexos/initramfs/micom-pet.c é o daemon que deve corrigir isso (ainda estou integrando).kexec-poc/canary/). Gráficos reais precisam do caminho VCPU RPC (não feito).Este repositório contém código-fonte + docs + os insumos de build capturados da TV (.config do kernel, módulo wifi + firmware, libs do rootfs), mas não contém a árvore de fontes do kernel LG K7LP GPL de ~390 MB em si — essa é da LG para distribuir, não nossa para re-hospedar.
O make falhará com um claro KERNEL_SRC missing se a árvore do kernel não estiver presente — não há meia-compilação silenciosa.
Até onde sabemos, este é o primeiro boot público de kernel personalizado baseado em kexec para uma TV LG webOS. As primitivas (kexec, webOS com root, RTD2875) são todas conhecidas individualmente; a aplicação a esta TV de consumo bloqueada parece ser nova. Não estamos reivindicando um bypass do secure-boot — nós o contornamos.
GPL-2.0 (trabalho do kernel; o código-fonte GPL do kernel da LG é GPL). Nossos scripts são compatíveis com GPL. Veja CREDITS para atribuição upstream.
| dependência | como obter |
|---|
LG K7LP GPL linux-4.4.3 (RTD2875) | site open-source da LG → 03.53.45 tarball GPL K7LP → kernel |
| toolchain cruzado musl armv7 (~98 MB) | baixado automaticamente por kexec-poc/build.sh (autocontido) |
| Uma TV com root (50UP81009LR) | necessária na primeira vez, apenas para capturar o .config — mas esse config agora está commitado em rexos/kernel/rexos-tv.config, então um clone compila offline |