Quest escribió:yombo escribió:Eso de "una secuencia o KEY determinada (larga,
sólo conocida por los desarrolladores)"...

Leyendolo asi, queda feo, si
La decisión de no permitir el acceso a la SPI flash desde, vamos a llamarlo, el "modo usuario" fue precisamente para evitar brickeos del aparato, intencionados o no, que obligarían al usuario a disponer de un programador universal o un cable JTAG. usar una key "secreta" para evitar el brickeo es inútil, dado el carácter abierto del proyecto. Usar una "secuencia mágica" para desbloquear el acceso a la SPI flash tiene más sentido (el tipo de cosas que hizo Amstrad para desbloquear las características avanzadas del ASIC del CPCplus) pero no evitas que un usuario malintencionado te cuele un TAP con un programa que ejecute esa secuencia, borre un cacho de flash y te brickee el ZX-Uno.
Así las cosas, podemos tirar por varios caminos:
- Desbloquear el acceso a la SPI Flash con una secuencia mágica, key, o como quieras llamarlo, confiando en que no habrá usuarios perversos. De esta forma podemos usar un comando de ESXDOS para todo el proceso: leer el core desde la SD, comprpobar si no es el mismo que hay en flash, para evitar una escritura innecesaria, grabarlo si es preciso, y lanzar la secuencia de REBOOT a la FPGA.
Lo malo es que el sólo hecho de mencionar "usuario perverso que puede brickearte tu ZX-Uno con un TAP" ya puede poner en alerta a un usuario suspicaz. Cuando alguien usa un Spectrum, jamás de los jamases ha tenido que preocuparse por el software que carga en su ordenador, y no querría que esto cambiase. ¿Soy demasiado paranoico?
- Bloquear el acceso a la SPI flash para que sólo pueda tenerlo la BIOS como estamos haciendo por ahora, lo que significa que perdemos la posibilidad de lanzar cores desde un comando ESXDOS con toda la facilidad que eso implica, e implementar el código necesario para leer los cores desde la SD en la BIOS, sin soporte de ESXDOS. Tened en cuenta que el acceso de SD desde la BIOS es de todas formas muy conveniente, para poder actualizar ROMs, core principal, y el propio firmware desde la tarjeta SD en lugar/además de por EAR.
- Tercera opción: "Ni pa tí ni pa mi". Me explico: usar la SRAM del ZX-Uno como almacenamiento intermedio del core entre la SD y la flash. La idea es:
* Desde ESXDOS se lee el core y se guarda en la SRAM. Con 128K no es suficiente, así que hay que modificar el core para permitir el acceso a toda la memoria, cosa que de todas formas tengo que hacer para implementar el manejador de memoria horizontal del Timex, para la especificación Chloe 280SE. Probablemente el core no pueda caber "todo seguido" y haya que saltarse bloques para no cargarse la ROM de ESXDOS o las páginas de RAM que se usen durante la carga de la SD (probablemente los primeros 32KB de DivMMC). Una vez terminada la carga, se fuerza por software un master reset dejando en el registro SCRATCH un código que indica a la BIOS que en la SRAM hay un core que pretendemos cargar en la flash
* La BIOS lee nada más comenzar ese registro y detecta que hay que proceder a copiar el contenido de la SRAM a la parte de flash que contiene el core de usuario. Lo hace y acto seguido lanza una secuencia de REBOOT como la que ha explicado Quest, lanzando el core.
* El comando de ESXDOS que lance toda esta secuencia puede tener un argumento: el fichero del core que queremos lanzar, o no tener argumentos, para indicar que queremos lanzar el core secundario que ya existe en la flash. Así evitamos escrituras innecesarias, que ya sabemos que son limitadas en una flash.
- ¿Alguna idea más? Aunque implique picar mucho más código, me parece más "elegante" la segunda opción.
-- Actualizado 14 Sep 2015, 23:11 --
jordi_ab escribió:¿No se podría hacer algo a nivel hardware? del estilo de un jumper o interruptor que con una puerta lógica o similar en el core de la FPGA le impida escribir en la flash, al estilo de una protección contra escritura, que deba habilitar el usuario bajo su responsabilidad.
La cosa es que escribir en la flash no es una operación anecdótica, como podría ser hacerlo en un DivIDE o DivMMC. Operaciones tales como elegir la ROM por defecto con la que quieres arrancar, o cambiar los settings de teclado, NMI, DivMMC, timings de ULA, etc, escriben a la flash. Al final el usuario tendría todo el rato puesto el jumper que permite la escritura a flash por no tener que quitarlo y ponerlo cada vez que lo necesite.
La otra cosa es que el pin de protección de escritura, /WP, nos imposibilitaría usar el modo quad SPI, que permite cargar los cores cuatro veces más rápido que con SPI estándar. En modo quad, el pin WP es un pin de datos más, desapareciendo por tanto el soporte hardware de protección contra escritura.
-- Actualizado 14 Sep 2015, 23:22 --
Otra opción, del estilo de lo que plantea jordi_ab: tener una opción en la BIOS para permitir el uso de la flash desde el modo usuario. Esa opción tendría que activarse por el usuario, y sólo duraría hasta el siguiente reset o máster reset. La idea es que el usuario resetearía, pondría esa opción (puede ser pulsando alguna tecla concreta mientras la máquina arranca) y entonces sí puede usar ESXDOS para actualizar cores, o lo que sea, en la flash. En el siguiente reset, reboot, máster reset o lo que sea, el acceso a la flash vuelve a estar denegado. Esto bloquearía la gran mayoría de intentos de brickeo intencionados.