Autor Tópico: Firmware do LG DV397H  (Lida 300624 vezes)

0 Membros e 3 Visitantes estão vendo este tópico.

Offline zeurt

  • Seeder
  • Colaboradores
  • Papagaio
  • *
  • Mensagens: 333
  • Aprovação: +47/-0
    • Ver Perfil
Re: Firmware do LG DV397H
« Responder #370 Online: Setembro 15, 2009, 02:49:37 am »
A segunda documentação eu já conhecia. Ela também explica as instruções, mas não trás os opcodes diretamente. É o caso que eu falei antes: há uma tabela de bits para que decifremos os opcodes. E nessa página, temos a tabela para instruções de 32 bits. Mas os nossos firmwares possum instruções no modo Thumb de 16 bits que, na verdade, não passa de um subconjunto do outro. Então, usar tabelas de instruções de 16 bits fica mais fácil. Tem algumas documentações com o chamado Thumb Instruction Set.
Eu ainda não tinha percebido que os nossos firmwares usam instruções de 16 bits (modo Thumb) e não de 32 bits (modo ARM).  :dashhead1:
Acho que é porque até agora mexi muito pouco no ARM, e apenas para modificações mais simples, sendo que dava mais atenção às instruções do que à codificação das mesmas.

Com 16 bits podemos ter até 65536 variações de instruções (provavelmente alguns desses 65536 opcodes são ignorados pelo processador). Acho que talvez seja melhor criarmos um arquivo binário com instruções de 00 00 a FF FF e abrirmos no IDA. Aí teremos todos os opcodes e todas as intruções reconhecidas pelo IDA no modo Thumb.
Legal essa idéia! Se não der pra usar o Assembler, vai facilitar bastante.

Depois vou dar uma olhada no Assembler que você achou. Isso facilitaria as coisas. E como tem o fonte, ajuda na portabilidade.
Pelo manual, esse Assembler tem a opção de 16 bits (modo Thumb).

Offline rictad

  • Hacker Honorário
  • Colaboradores
  • Papagaio
  • *
  • Mensagens: 285
  • Aprovação: +59/-0
    • Ver Perfil
Re: Firmware do LG DV397H
« Responder #371 Online: Setembro 15, 2009, 04:47:05 am »
Com 16 bits podemos ter até 65536 variações de instruções (provavelmente alguns desses 65536 opcodes são ignorados pelo processador). Acho que talvez seja melhor criarmos um arquivo binário com instruções de 00 00 a FF FF e abrirmos no IDA. Aí teremos todos os opcodes e todas as intruções reconhecidas pelo IDA no modo Thumb.


Sinto que é uma pergunta besta, mas aí vai:

Nenhuma instrução espera parâmetros? Com o instruction set do 8051 eu sei que não dá para fazer isso.


Pelo que entendi do ARM Assembly, os parâmetros ficam embutidos nas instruções. Naquela primeira referência que enviei, isso é explicado de maneira bem didática.

Isso! Então os parâmetros existem, mas eles não têm bytes dedicados, como nas máquinas CISC.

Por exemplo, na instrução 8052 mov A, #0xB0 nós temos um byte que identifica a instrução (#74) e outro exclusivo para o operando (#B0). Isso é a causa de um dos dois problemas da arquitetura CISC. Apesar de ter a seu favor uma grande quantidade de tipos de instruções mais complexas disponível ao programador, as intruções podem variar bastante na quantidade de bytes e no tempo de execução. Assim, só em olhar o assembly de duas rotinas diferentes que realizam a mesma função, um programador não pode dizer de imediato qual a que vai ocupar menos espaço e qual vai ser executada mais rapidamente. Existem instruções mais complexas que ocupam menos espaço que instruções mais complexas. Instruções menores podem gastar mais ciclos do processador do que instruções maiores. E os dois fatores importantes para o desempenho são o espaço e o tempo.

A arquitetura RISC, então, têm como objetivo instruções que ocupam sempre o mesmo espaço e gastam sempre o mesmo número de ciclos do processador. Na verdade, apenas 1 ciclo. O preço é que temos um conjunto de instruções mais simples, que podem exigir mais do programador. Isso é tudo na teoria, porém, na prática, os resultados são bem próximos dos ideais. O ARM, no modo Thumb, possui sempre instruções de 2 bytes e a maioria das instruções gasta apenas 1 ciclo por execução.

O seguinte documento do ARM10 (pela documentação, o ARM10 é compatível com o ARM7, mas não sei até que ponto) mostra o mapa de opcodes do modo Thumb: http://infocenter.arm.com/help/topic/com.arm.doc.dvi0014a/DVI0014A_ARM10T_PO.pdf. Ele não possui, porém, os valores dos opcodes dos bits exclusivos para a identificação das instruções, mas acredito que sejam os mesmos da documentação indicada pelo zeurt.

Na página 14 temos o mapa. A primeira instrução é o "deslocamento por valor imediato", que é nada mais que deslocar os bits de um valor para a esquerda (multiplicar por 2) ou para a direita (dividir por 2). Essa instrução possui 3 operandos: o valor constante que indica o número de deslocamentos (o número de bits deslocados), um registrador de origem e um registrador de destino. A instrução começa sempre com 000 e depois temos 2 bits para o opcode. Isso nos dá 4 variações na instrução (00, 01, 10 e 11), que eu acredito que deva ser deslocar à esquerda, deslocar à direita, rodar à esquerda e rodar à direita. Em seguida, temos 5 bits para identificar o operando constante e, por último, os bits que identificam o registrador de origem (leitura do valor que será deslocado) e os bits que identificam o registrador que irá guardar o resultado. Nenhum desses parâmetros possui um byte exclusivo. A instrução LSLS    R0, R0, #0x4, que significa pegar o valor em R0, deslocar 4 bits à esquerda (equivale a multiplicar o valor por 24) e guardar o resultado no próprio registrador R0, terá a seguinte codificação:

000 00 00100 000 000

Lembrando que #B00100=4. Agora, separando os bytes:

00000001 | 00000000 = #01 | #00

Como o código é formado começando pelo byte menos significativo, o opcode final será #00 #01.

Aqui cabe ressaltar a pseudo-instrução NOP. Esta instrução tem código 00 00 no modo Thumb. Assim, ela é, na verdade, um LSLS    R0, R0, #0, que significa pegar o valor de R0, deslocar 0 bits e guardar novamente em R0. Apesar de parecer complexa, esta instrução gasta somente 1 ciclo do processador, como um NOP.

Vamos analisar uma instrução de um único parâmetro: a instrução de salto relativo incondicional, o BRANCH. Olhando no mapa, a quarta instrução de baixo para cima, vemos que ela começa sempre com 11100. Ela possui mais 11 bits para o offset do salto relativo. Isso pode fazer parecer com que exista um byte de parâmetro. Por exemplo, o código 02 E0 signfica um salto de 2*16 bits (4 endereços) para frente. Já o código 04 E0 significa saltar para 8 endereços à frente. Assim, podemos pensar que XX E0 é o código do BRANCH, sendo que XX é o offset. Porém, é só uma coincidência. Se o offset for maior que 255, o outro valor não será mais E0. ;)

Acho que a única instrução que podemos considerar com parâmetro é o MOV (quarta instrução de cima para baixo). Isso porque, no modo Thumb, o valor do offset dessa instrução tem examente 8 bits. Mas isso é uma "coincidência" (cuidadosamente planejada pelos engenheiros) do modo Thumb. :) No modo 32 bits, o offset é maior.

Eu ainda não tinha percebido que os nossos firmwares usam instruções de 16 bits (modo Thumb) e não de 32 bits (modo ARM).  :dashhead1:
Acho que é porque até agora mexi muito pouco no ARM, e apenas para modificações mais simples, sendo que dava mais atenção às instruções do que à codificação das mesmas.
Aparentemente é o chamado Thumb-2 que, segundo a documentação do ARM, permite usar o modo Thumb juntamente com algumas instruções de 32 bits. É o caso dos BL (Branch with Link). Veja que os BLs têm 4 bytes. EDIT: Parece que o modo Thumb normal é o mais usado nesses firmwares, mas há algumas poucas rotinas em modo ARM também. Já o BL do modo Thumb tem prefixo de 16 bits e sufixo de 16 bits, sendo uma das poucas instruções daquele modo que possuem 4 bytes. Mais informações, neste tópico.
« Última modificação: Outubro 02, 2009, 05:49:55 am por rictad »

FORUM.RYAN.COM.BR

Re: Firmware do LG DV397H
« Responder #371 Online: Setembro 15, 2009, 04:47:05 am »

Offline Jefferson

  • Zelador
  • Hero Member
  • *****
  • Mensagens: 1854
  • Aprovação: +0/-0
    • Ver Perfil
    • http://ryan.com.br
Re: Firmware do LG DV397H
« Responder #372 Online: Setembro 23, 2009, 04:24:26 am »
Bom, como disse na PARTE 1, o primeiro passo foi adicionar um offset aos valores lidos desse buffer para ver se uma fonte com mais de 256 caracteres podia ser usada para colocar os caracteres itálicos. Essa foi uma das opções sugeridas no fórum do jmaraujo e também pelo zeurt. Como funcionou, passou a ser a idéia central do itálico.

Isso também foi discutido aqui:
http://ryan.com.br/smf/index.php?topic=170.msg9174127#msg9174127
http://jefferson-ryan.blogspot.com
http://ryan.com.br

Se o que você escreve não merece sua atenção, vai merecer a atenção de quem?!

Offline rictad

  • Hacker Honorário
  • Colaboradores
  • Papagaio
  • *
  • Mensagens: 285
  • Aprovação: +59/-0
    • Ver Perfil
Re: Firmware do LG DV397H
« Responder #373 Online: Setembro 23, 2009, 06:05:10 am »
Bom, como disse na PARTE 1, o primeiro passo foi adicionar um offset aos valores lidos desse buffer para ver se uma fonte com mais de 256 caracteres podia ser usada para colocar os caracteres itálicos. Essa foi uma das opções sugeridas no fórum do jmaraujo e também pelo zeurt. Como funcionou, passou a ser a idéia central do itálico.

Isso também foi discutido aqui:
http://ryan.com.br/smf/index.php?topic=170.msg9174127#msg9174127
Eu ainda não tinha visto aquele tópico, mas ficou exatamente como a idéia que você deixou lá.  8)

Offline rictad

  • Hacker Honorário
  • Colaboradores
  • Papagaio
  • *
  • Mensagens: 285
  • Aprovação: +59/-0
    • Ver Perfil
Re: Firmware do LG DV397H
« Responder #374 Online: Setembro 25, 2009, 05:16:49 am »
Firmware Rictad Versão 2.5 alfa 1 para DV397H com chip MT1389M

ATENÇÃO:
  • Esta é uma versão alfa ainda não testada!
  • Usuários do modelo DV397H com chip MT1389S não devem atualizar com esta versão!

* Tentativa de incluir as opções tempo restante, tempo total, tempo do capítulo, tempo restante do capítulo e tempo total do capítulo para DVD e para VCD/SVCD.


Nota 1: Para alterar a opção de tempo, o usuário deve apertar a tecla display, ir até a posição que mostra o tempo, do mesmo modo que faria para entrar na função GO TO, e usar as setas esquerda e direita para navegar pelas opções de tempo.
Nota 2: As opções de tempo para arquivos DivX continuam sendo apenas 3.


Teste das opções de tempo para DVD e VCD/SVCD:

Por favor, verifiquem se:
  • além dos traços do tempo a digitar (função GO TO), também aparecem os símbolos < e >;
  • as 6 opções estão disponíveis para ambos formatos, com o nome da opção sendo mostrado em tempo real na parte inferior do menu de reprodução, tanto em língua inglesa como em língua portuguesa;
  • a opção escolhida permanece gravada na memória e se é independente da opção escolhida para DivX;
  • ao sair do menu de reprodução (apertar a tecla display) quando a função GO TO estiver selecionada, caso o menu seja chamado novamente, a mesma função GO TO estará selecionada e mostrando apenas os símbolos < --:-- >;
  • ao sair do menu de reprodução (apertar a tecla display) quando outra função estiver selecionada, caso o menu seja chamado novamente, a mesma função estará selecionada;
  • nos DVDs com títulos extras que não permitem utilizar a função GO TO, passa a ser permitido, ao menos, alterar as opções de tempo quando os extras estiverem sendo reproduzidos (são poucos os casos, mas se não me falhe a memória, acho que este teste pode ser tentado também nos curtos momentos dos logos iniciais do filme, quando também não é possível acessar a função GO TO).
« Última modificação: Setembro 25, 2009, 05:23:43 am por rictad »

Offline zeurt

  • Seeder
  • Colaboradores
  • Papagaio
  • *
  • Mensagens: 333
  • Aprovação: +47/-0
    • Ver Perfil
Re: Firmware do LG DV397H
« Responder #375 Online: Setembro 28, 2009, 07:56:09 pm »
Implementação do Itálico

PARTE 1:


(...)

Fontes:

Sobre as fontes, elas não são mais de 512 caracteres. Mas de 479. Como há 6 fontes para legendas no firmware, para cada uma que eu adicionasse o itálico teria que "apagar" outra, para garantir que coubessem no mesmo espaço (caso contrário, dá erros na impressão da legenda, aparecem artefatos na tela, travadas etc). Assim, seriam no máximo 3 fontes. Mas eu retirei os 33 primeiros caracteres da parte itálica de cada fonte, pois são os caracteres de controle e o espaço (que, obviamente, não mudam quando vão para itálico). Então ficaram 256 normais + 223 itálicos. Isso economizou um pouco de espaço e permitiu adicionar 4 fontes com itálico, ainda que tenha "empurrado" a fonte 14 para o lugar da 15 como efeito colateral.

O MTKRemaker não apaga as fontes corretamente nesse firmware. Ele só apaga a 4, trazendo a 5 para seu lugar, a 6 para 5 e assim por diante. Então, criei um preset de 1 caracter, o 0, para criar uma fonte mínima e colocá-la no lugar das que eu iria apagar. Assim, as fontes itálicas ficaram na posição 8, 9, 10 e 11 e a miníma ficou nas posições 12 e 13.

Será que podemos considerar essa necessidade de redução aproximadamente pela metade do número de fontes como uma regra geral quando se usa as fontes em itálico de 479 caracteres? Por exemplo, o LG DV256k tem 9 fontes para legendas (sendo que eu eliminei a fonte 9). Portanto, eu estarei seguro se reduzir de 9 fontes normais para 4 fontes de 479 caracteres (deixando as outras como mínimas - com 1 caractere), não é? Por curiosidade, isso tudo depende do número de caracteres, ou do espaço ocupado na memória?

Offline rictad

  • Hacker Honorário
  • Colaboradores
  • Papagaio
  • *
  • Mensagens: 285
  • Aprovação: +59/-0
    • Ver Perfil
Re: Firmware do LG DV397H
« Responder #376 Online: Setembro 29, 2009, 01:12:51 am »
Será que podemos considerar essa necessidade de redução aproximadamente pela metade do número de fontes como uma regra geral quando se usa as fontes em itálico de 479 caracteres? Por exemplo, o LG DV256k tem 9 fontes para legendas (sendo que eu eliminei a fonte 9). Portanto, eu estarei seguro se reduzir de 9 fontes normais para 4 fontes de 479 caracteres (deixando as outras como mínimas - com 1 caractere), não é? Por curiosidade, isso tudo depende do número de caracteres, ou do espaço ocupado na memória?

Acho que sim, a regra é essa. Eu acho que isso depende do espaço de memória ocupado, pois parece haver um tamanho máximo para todas as fontes. Mas pode ser que no DV256k seja diferente. Tenta colocar novamente a fonte 9 (mais a itálica) para ver se todas as fontes ainda são exibidas. Antes de atualizar, veja no MTKRemaker se as posições dos códigos 8032 e ARM não foram afetadas.

Offline zeurt

  • Seeder
  • Colaboradores
  • Papagaio
  • *
  • Mensagens: 333
  • Aprovação: +47/-0
    • Ver Perfil
Re: Firmware do LG DV397H
« Responder #377 Online: Setembro 29, 2009, 11:33:15 pm »
Implementação do Itálico

PARTE 2


(...)

O maior problema era que o modelo de chip S desse player originalmente não exibe as tags srt na legenda, e o buffer #A4E70 (por enquanto vou chamá-lo assim) já é preenchido sem as tags. Como eu disse antes, teria que haver alguma parte no ARM que carregasse o buffer eliminando as tags. Procurei várias vezes no código por rotinas que fizessem uso do endereço #A4E70 e que tivessem operações de comparação (CMP, SUB etc) com os bytes #3C ("<") e #3E (">"). Mas não conseguia achar. Porém, mexendo mais no IDA, descobri que havia certas regiões que os scripts do mt13x9 group não consideravam como que fossem código, mas que são código. Isso tem a ver com os ARM codes, dos quais vou falar um pouco mais a frente. Então, selecionei algumas partes e forcei o IDA a considerar como código. E pronto, lá estava a rotina que inibe as tags! Começa em #8CD44. Ela lê um outro buffer, que tem base em #9A610 (o qual vou chamar de buffer primário), e preenche o buffer #A4E70 (o qual passo a chamar de buffer secundário), com tudo que não estiver entre "<" e ">".

(...)

Rictad, será que você poderia enviar esse trecho de modo que o IDA reconheça corretamente? Não estou conseguindo, e portanto não tenho como entender os detalhes do que você fez nesse trecho. Obrigado!

Offline rictad

  • Hacker Honorário
  • Colaboradores
  • Papagaio
  • *
  • Mensagens: 285
  • Aprovação: +59/-0
    • Ver Perfil
Re: Firmware do LG DV397H
« Responder #378 Online: Setembro 30, 2009, 01:10:46 am »
Implementação do Itálico

PARTE 2


(...)

O maior problema era que o modelo de chip S desse player originalmente não exibe as tags srt na legenda, e o buffer #A4E70 (por enquanto vou chamá-lo assim) já é preenchido sem as tags. Como eu disse antes, teria que haver alguma parte no ARM que carregasse o buffer eliminando as tags. Procurei várias vezes no código por rotinas que fizessem uso do endereço #A4E70 e que tivessem operações de comparação (CMP, SUB etc) com os bytes #3C ("<") e #3E (">"). Mas não conseguia achar. Porém, mexendo mais no IDA, descobri que havia certas regiões que os scripts do mt13x9 group não consideravam como que fossem código, mas que são código. Isso tem a ver com os ARM codes, dos quais vou falar um pouco mais a frente. Então, selecionei algumas partes e forcei o IDA a considerar como código. E pronto, lá estava a rotina que inibe as tags! Começa em #8CD44. Ela lê um outro buffer, que tem base em #9A610 (o qual vou chamar de buffer primário), e preenche o buffer #A4E70 (o qual passo a chamar de buffer secundário), com tudo que não estiver entre "<" e ">".

(...)

Rictad, será que você poderia enviar esse trecho de modo que o IDA reconheça corretamente? Não estou conseguindo, e portanto não tenho como entender os detalhes do que você fez nesse trecho. Obrigado!

Certo zeurt, estou enviando os idbs do IDA em anexo. O primeiro é do ARM sem modificações (ou quase) mas com as rotinas identificadas. Já o teste 8 é com as últimas modificações (mas as rotinas não estão identificadas com comentários, mas estão todas lá).

Offline jmaraujo

  • Seeder
  • Colaboradores
  • Papagaio
  • *
  • Mensagens: 409
  • Aprovação: +41/-0
  • Saudações desde Rivera, Uruguay!!! ;)
    • Ver Perfil
    • Fórum DVP5100K
Re: Firmware do LG DV397H
« Responder #379 Online: Setembro 30, 2009, 02:47:51 am »
Desculpem, sem querer me intrometer mas já me intrometendo (somente estou querendo ajudar... ;) )

Um outro método para compartir os análises (no lugar de upar os arquivos .IDB) é zipar o arquivo .BIN analizado junto com um arquivo .IDC exportado (File -> Produce file -> Dump database to IDC file...) com todas as rotinas identificadas. Fica um arquivo .zip bem mais pequeno... Sem contar que pode ser aberto com quase qualquer IDA (v4.7, v5.1, etc.)

FORUM.RYAN.COM.BR

Re: Firmware do LG DV397H
« Responder #379 Online: Setembro 30, 2009, 02:47:51 am »