ZX-Uno: Camino hacia la versión 3 (definitiva)

Sinclair QL, ZX81, +2, +3, 128K ...
Avatar de Usuario
Quest
Atari 1040 STf
Atari 1040 STf
Mensajes: 900
Registrado: 18 Jul 2013, 22:20
Sistema Favorito: Commodore Amiga
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Nintendo SNES
Primera consola: Nintendo NES/Clónica
Gracias dadas: 9 veces
Gracias recibidas: 16 veces

Re: ZX-Uno: Camino hacia la versión 3 (definitiva)

Mensajepor Quest » 15 Sep 2015, 00:23

mcleod_ideafix escribió: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.


Es que me referia exactamente a eso, como ya he aclarado en los 2 posts de respuesta que he dado a yombo y jordi_ab. Me refería a esa secuencia mágica. De hecho ya he editado el psot quitando la parte en la que me expliqué mal)

Con respecto a lo del usuario malintencionado (que también he comentado en el post de respuesta a los mencionados usuarios), añado a esas respuestas:

mcleod_ideafix escribió:- Desbloquear el acceso a la SPI Flash con una secuencia mágica, key, o como quieras llamarlo, confiando en que no habrá usuarios perversos. [...]
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?


Bueno he dicho añado, pero en realidad sería repito, lo último, pero matizado (antes del EDITO) que he comentado en el post justo encima del tuyo (en respuesta a jordi_ab):

Si un usuario malintencionado quiere, como todo es abierto, tal como está ahora mismo la escritura sólo posible en BIOS, puede igualmente coger el script genrom y generar un TAP completamente válido de Machine partiendo de un archivo de 336kb lleno de ceros. Eso brickea el ZX-UNO exactamente igual que un .TAP malicioso con la "key" correcta. Así que no veo en la práctica mucha más ventaja al sistema actual en el aspecto de seguridad.

¿La solución "definitiva"? Advertir que SOLAMENTE se descarguen los upgrades y los cores desde el site OFICIAL, y así siempre van a estar seguros de que su ZX-UNO no se va a brickear.

Aun así, te doy la razón en que si dejamos escribir en modo usuario, un usuario muy muy retorcido podría intentar "colar" un TAP de un "juego muy chulo" y que fuera un "bricker" en la realidad.

mcleod_ideafix escribió:- 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.


Esta es sin duda la mejor opción, como ya he comentado. También es más compleja de hacer, pero es la mejor.

A esto añado, que en vez de un comando exdos para lanzar cores veo mucho más facil tanto de ejecutar como de implementar, usar una combinación de teclas para lanzar cada core. Por ejemplo:

Ctrl+F1 = lanza core 1
Ctrl+F2 = lanza core 2
.... etc

En base a un mapa de X roms fijo en la flash (8 cores = 8 combinaciones de teclas), y según el tamaño que vayamos a usar (probablemente 32 MBits), no harán falta más (8 o 9 a lo sumo)

Es inmediato, rápido, no requiere teclear nada ni si quiera requiere tener el spectrum arrancado con una rom ni divMMC activado, y es muy fácil de implementar. Ahora mismo hago el cambio de core con un pulsador en el puerto de expansión, pero hacer que se mande un "1" al REBOOT no tendrá dificultad para añadirse al parser de teclado... :D (bueno, para tí seguramente si será sencillo, claro, yo ahora mismo no se hacerlo... si no, lo habría hecho en vez de con un pulsador :mrgreen: )

La tercera opción me parece la menos conveniente y más complicada (y lenta). Yo apuesto por una flash bien grande donde los cores que quieres los grabas una sola vez (bueno, o alguna más si se van actualizando las funcionalidades de los cores, pero serían mínimas), evitando tener que escribir cada vez en la flash, lo que acortaría su vida. Además no requeriría programar nada extra (bueno si, la opcion 2, la de grabarlos desde SD).

mcleod_ideafix escribió:- ¿Alguna idea más? Aunque implique picar mucho más código, me parece más "elegante" la segunda opción.


Las que has puesto son las más lógicas.

De hecho, para la 2ª opción, hay ya bastante código ya hecho que sólo habría que adaptar un poco para nuestra BIOS (que comente Antonio cómo lo ve), que está en los archivos fuente que acompañan al core de SMS, donde ya se implementa para Z80 (en ensamblador la mayoría y algo en C), el protocolo de lectura SD y el driver FAT. De hecho se compila con z88dk (así lo compilé yo cuando hice el port). Si sólo es adaptarlo un poco, es bastante posible que el esfuerzo se reduzca bastante.

--

EDITO: acabo de ver tu actualización:

-- Actualizado 14 Sep 2015, 23:22 --

mcleod_ideafix escribió: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.


Me parece una muy buena idea, en el caso de que al final no se hiciese la opcion 2 (la de actualizar por SD desde BIOS)

jordi_ab
ZX Spectrum 16
ZX Spectrum 16
Mensajes: 11
Registrado: 27 Ago 2015, 05:08
Sistema Favorito: Commodore Amiga
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Atari 2600
Primera consola: Atari 2600
Gracias dadas: 1 vez
Gracias recibidas: 1 vez

Re: ZX-Uno: Camino hacia la versión 3 (definitiva)

Mensajepor jordi_ab » 15 Sep 2015, 01:18

Quest escribió:
Para lo primero que comentas, lee mi respuesta a yombo justo en el post anterior. No se trata de que haya una key oculta, solo de evitar brickeos por error


Siento haber preguntado por algo que ya estaba respondido, pero lo he visto justo tras publicar el mensaje.

Estoy de acuerdo con mcleod_ideafix, creo que una opción en la BIOS activa hasta el siguiente reinicio seria mucho mejor.

Avatar de Usuario
antoniovillena
Amiga 1200
Amiga 1200
Mensajes: 2013
Registrado: 16 Abr 2012, 21:22
Gracias recibidas: 8 veces

Re: ZX-Uno: Camino hacia la versión 3 (definitiva)

Mensajepor antoniovillena » 15 Sep 2015, 10:40

Mi intención inicial (y sigo pensando lo mismo) fue hacerlo todo desde la BIOS. Un ZX-Uno estándar de fábrica bloquea el acceso a SPI al salir de la BIOS (cuando cargas una máquina). De esta forma te aseguras que nunca se va a brickear el ZX-Uno a no ser que cargues algo erróneo desde la BIOS, me refiero a un archivo corrupto, no a un error de carga.

Ahora bien, los que tengan el cable USB a mano para desbrickear pueden rootear la BIOS. Sería la misma BIOS sólo que no bloquea el acceso a SPI y también puede ser oficial, sólo que con una advertencia a la hora de descargar. Esta BIOS rooteada facilita mucho las cosas, ya que con un simple TAP cargado desde ESX-DOS se puede escribir en cualquier parte de la SPI flash.

Pero para los que no tengan cable (que son la mayoría) de momento sólo funciona la carga por EAR. Hasta que no se implemente FAT16/32 en la BIOS no se podrá actualizar por SD, al menos de forma segura.

Avatar de Usuario
Uto
MSX Turbo R
MSX Turbo R
Mensajes: 445
Registrado: 28 Abr 2014, 15:50
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Nintendo SNES
Primera consola: TV Games/Pong Clone
Gracias dadas: 5 veces
Gracias recibidas: 29 veces

Re: ZX-Uno: Camino hacia la versión 3 (definitiva)

Mensajepor Uto » 15 Sep 2015, 10:43

Se me ocurre una idea que no se si es posible, pero os la cuento:

La idea sería que solo parte de la flash fuera flasheable por software, y dejar una zona que contenga un firmware "desbrickeador" y una copia de los slots necesarios para arrancar.

Además, sería necesario que si al arrancar se da cierta condición en lugar de cargar la zona de la flash por defecto cargue la de recuperación (que se limitaría a preguntar si estamos seguros y después "restaurar los slots necesarios para desbrickear", que si no me equivoco es la BIOS y punto, porque el resto se pueden recuperar desde la BIOS.

Esa condición de arranque puede ser ya lo que sea más fácil, que no tengo ni idea: una pulsación concreta en el teclado, un jumper, incluso alguna señal del bus de expansión puesta a un valor concreto (como en teoría es algo que no va a pasar a menudo, podría bastar con que el afectado hiciera un puente entre dos pines y ahorrarnos el jumper)

Lo que no tengo claro es si es fácil hacer que haya una "zona protegida" por hardware (porque si es por firmware un programa malicioso sería lo primero que machacaria para poder escribir ahí también), y tampoco tengo claro si es posible arrancar la BIOS de recuperación. Ya me diréis los expertos, y si no puede ser, al menos he disfrutado un buen rato pensandolo jajaja.

Entiendo que esta solución obliga a ocupar una parte de la flash en la recuperación, pero creo que ese espacio "perdido" se compensa con el hecho de poder cambiar todos los otros slots por software, para que cada uno se ponga lo que quiera.
http://www.ngpaws.com
Twitter: @uto_dev

Avatar de Usuario
Quest
Atari 1040 STf
Atari 1040 STf
Mensajes: 900
Registrado: 18 Jul 2013, 22:20
Sistema Favorito: Commodore Amiga
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Nintendo SNES
Primera consola: Nintendo NES/Clónica
Gracias dadas: 9 veces
Gracias recibidas: 16 veces

Re: ZX-Uno: Camino hacia la versión 3 (definitiva)

Mensajepor Quest » 15 Sep 2015, 10:51

Lo que comenta Uto es factible (de hecho ya lo he probado y funciona), un header con un código watchdog que si en un timeout no arranca el bitstream principal, cargaría uno de seguridad (Que jamás sería sobreescrito con ningún upgrade), pero para los casos actuales de la flash W25Q80 no sería práctico perder el único slot para un core secundario por tener ese bitstream de "backup".

Se estudiará para una SPI más grande, pero yo creo que no sería necesario si se implementa todo como dice Antonio, todo desde BIOS y capado el resto, y que sólo se descargen upgrades del site oficial.

Avatar de Usuario
Uto
MSX Turbo R
MSX Turbo R
Mensajes: 445
Registrado: 28 Abr 2014, 15:50
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Nintendo SNES
Primera consola: TV Games/Pong Clone
Gracias dadas: 5 veces
Gracias recibidas: 29 veces

Re: ZX-Uno: Camino hacia la versión 3 (definitiva)

Mensajepor Uto » 15 Sep 2015, 11:18

Quest escribió:Lo que comenta Uto es factible (de hecho ya lo he probado y funciona), un header con un código watchdog que si en un timeout no arranca el bitstream principal, cargaría uno de seguridad (Que jamás sería sobreescrito con ningún upgrade), pero para los casos actuales de la flash W25Q80 no sería práctico perder el único slot para un core secundario por tener ese bitstream de "backup".

Se estudiará para una SPI más grande, pero yo creo que no sería necesario si se implementa todo como dice Antonio, todo desde BIOS y capado el resto, y que sólo se descargen upgrades del site oficial.


La verdad es que no creo que nunca entienda lo de los cores y bitstreams, pero me suena que lo que digo puede ser más sencillo que eso: ¿Y si se coloca la "BIOS de backup" en un sitio tal en la flash que cambiando un jumper, pase a estar en la zona que está la BIOS normal?.

Supongo que a la flash se accede por algún tipo de "bus de direcciones" y que por tanto en algún sitio el sistema de arranque inicial (¿el header?) dice que se cargue lo que está en tal dirección (pongamos que es la C000, que me suena haberlo visto por ahí, pero si no es esa, la que sea). Pongamos que ponemos un jumper que haga dos cosas:

1) Trampear ese bus de direcciones para que cuando alguien pida lo de C000 en realidad le devuelva lo de F000 (poniendo algun bit a 1 fijo, cruzando dos patillas o lo que sea)
2) Que se pueda escribir en la zona de flash no escribible

De ese modo a voluntad del usuario pondríamos el jumper y arrancaría la BIOS B, que restauraría la BIOS A.

Como es algo que solo se haría en caso de brickeo, no corre el peligro que se comentaba antes de que todo el mundo al final acabara con el jumper puesto a todas horas, siempre que la zona no escribible se reduzca al mínimo posible para alojar el "desbricker"
http://www.ngpaws.com
Twitter: @uto_dev

Avatar de Usuario
Quest
Atari 1040 STf
Atari 1040 STf
Mensajes: 900
Registrado: 18 Jul 2013, 22:20
Sistema Favorito: Commodore Amiga
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Nintendo SNES
Primera consola: Nintendo NES/Clónica
Gracias dadas: 9 veces
Gracias recibidas: 16 veces

Re: ZX-Uno: Camino hacia la versión 3 (definitiva)

Mensajepor Quest » 15 Sep 2015, 11:27

Uto escribió:La verdad es que no creo que nunca entienda lo de los cores y bitstreams, pero me suena que lo que digo puede ser más sencillo que eso: ¿Y si se coloca la "BIOS de backup" en un sitio tal en la flash que cambiando un jumper, pase a estar en la zona que está la BIOS normal?.

Supongo que a la flash se accede por algún tipo de "bus de direcciones" y que por tanto en algún sitio el sistema de arranque inicial (¿el header?) dice que se cargue lo que está en tal dirección (pongamos que es la C000, que me suena haberlo visto por ahí, pero si no es esa, la que sea). Pongamos que ponemos un jumper que haga dos cosas:

1) Trampear ese bus de direcciones para que cuando alguien pida lo de C000 en realidad le devuelva lo de F000 (poniendo algun bit a 1 fijo, cruzando dos patillas o lo que sea)
2) Que se pueda escribir en la zona de flash no escribible

De ese modo a voluntad del usuario pondríamos el jumper y arrancaría la BIOS B, que restauraría la BIOS A.

Como es algo que solo se haría en caso de brickeo, no corre el peligro que se comentaba antes de que todo el mundo al final acabara con el jumper puesto a todas horas. Sobre todo si reducimos la zona no escribible al mínimo posible para alojar el "desbricker"


Te respondo como antes, pero de otro modo (perdón por los palabros de antes, pero este es un hilo técnico :mrgreen: )

1- Lo que tu dices sigue requiriendo de un espacio extra en la flash, de hecho más de 1 tercio de la misma (en el caso de la que usamos hasta ahora, W25Q80).
2- Lo que propones parece sencillo (que internamente no lo es), pero es que lo que yo decía aún lo es más. Ni jumpers ni nada, si se detecta que el core (llámalo como quieras, máquina, firmware principal, lo que quieras) principal está corrupto, él solito saltaría al de backup, donde podrías entrar a la BIOS para poder volver a grabar el principal.
3- Sigo diciendo que con lo que decía Antonio (hacer todo siempre desde BIOS protegiendo la escritura el resto y bajando los upgrades del site del zxuno) es más que suficiente y ahorramos el espacio precioso en la flash para tener otro(s) core(s) (o máquinas o como lo quieras llamar).

EDITO para añadir, que por lo que leo de tu post, crees que con una BIOS de backup (que ocupa poco) sería suficiente, pero no lo es, porque la BIOS tiene que correr sobre una máquina. Esa BIOS está hecha para correr en el hardware de un spectrum (con su Z80) un poco vitaminado. Esa máquina es el core principal, y es lo que ocupa tanto, y es lo que se puede brickerar. No se si ahora queda más claro. La BIOS suelta, sin core, no sirve de nada, no funciona.

Avatar de Usuario
antoniovillena
Amiga 1200
Amiga 1200
Mensajes: 2013
Registrado: 16 Abr 2012, 21:22
Gracias recibidas: 8 veces

Re: ZX-Uno: Camino hacia la versión 3 (definitiva)

Mensajepor antoniovillena » 15 Sep 2015, 11:34

No hay que complicarse tanto. Un jumper no es necesario, se puede hacer que una secuencia de teclas fuerce el lanzamiento del bitstream principal (llamémosle bitstream 1). Tendremos 8 bitstreams, de los cuales podemos sobreescribir los otros 7 sin problemas y meter otras 7 máquinas. Si una de estas máquinas se queda colgada no hay problema, porque siempre se intentará cargar el bitstream 1 (spectrum) antes y si se detecta la secuencia de teclas mencionada se quedará ahí (en spectrum) y no lanzará la máquina que corresponda. Desde este bitstream nos metemos en la BIOS y flasheamos el bitstream de la máquina que se queda colgada.

La protección consiste en no dejar grabar en el bitstream 1 nada que no sea el core de spectrum y para eso con unos flags es suficiente.

-- Actualizado 15 Sep 2015, 10:40 --

Quest escribió:Ni jumpers ni nada, si se detecta que el core (llámalo como quieras, máquina, firmware principal, lo que quieras) principal está corrupto, él solito saltaría al de backup, donde podrías entrar a la BIOS para poder volver a grabar el principal.


El core puede no estar corrupto y quedarse colgado. Ponte en el caso de un usuario que quiera aprender VHDL/Verilog y esté haciendo pruebas. Con lo que yo digo siempre cargas el bitstream del spectrum (luego te quedas ahí o cargas otro). Esto hace que sea muy lento cargar otra máquina ya que requiere cargar 2 bitstreams desde SPI Flash. Pero así nos aseguramos de que no vamos a brickear el ZX-Uno con los otros 7 bitstreams. Sólo se brickea en el caso de que el bitstream 1 esté corrupto o no corresponda al spectrum (no tendría BIOS para reflashear).

Avatar de Usuario
Quest
Atari 1040 STf
Atari 1040 STf
Mensajes: 900
Registrado: 18 Jul 2013, 22:20
Sistema Favorito: Commodore Amiga
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Nintendo SNES
Primera consola: Nintendo NES/Clónica
Gracias dadas: 9 veces
Gracias recibidas: 16 veces

Re: ZX-Uno: Camino hacia la versión 3 (definitiva)

Mensajepor Quest » 15 Sep 2015, 11:57

antoniovillena escribió:No hay que complicarse tanto. Un jumper no es necesario, se puede hacer que una secuencia de teclas fuerce el lanzamiento del bitstream principal (llamémosle bitstream 1). Tendremos 8 bitstreams, de los cuales podemos sobreescribir los otros 7 sin problemas y meter otras 7 máquinas. Si una de estas máquinas se queda colgada no hay problema, porque siempre se intentará cargar el bitstream 1 (spectrum) antes y si se detecta la secuencia de teclas mencionada se quedará ahí (en spectrum) y no lanzará la máquina que corresponda. Desde este bitstream nos metemos en la BIOS y flasheamos el bitstream de la máquina que se queda colgada.

La protección consiste en no dejar grabar en el bitstream 1 nada que no sea el core de spectrum y para eso con unos flags es suficiente.

-- Actualizado 15 Sep 2015, 10:40 --

Quest escribió:Ni jumpers ni nada, si se detecta que el core (llámalo como quieras, máquina, firmware principal, lo que quieras) principal está corrupto, él solito saltaría al de backup, donde podrías entrar a la BIOS para poder volver a grabar el principal.


El core puede no estar corrupto y quedarse colgado. Ponte en el caso de un usuario que quiera aprender VHDL/Verilog y esté haciendo pruebas. Con lo que yo digo siempre cargas el bitstream del spectrum (luego te quedas ahí o cargas otro). Esto hace que sea muy lento cargar otra máquina ya que requiere cargar 2 bitstreams desde SPI Flash. Pero así nos aseguramos de que no vamos a brickear el ZX-Uno con los otros 7 bitstreams. Sólo se brickea en el caso de que el bitstream 1 esté corrupto o no corresponda al spectrum (no tendría BIOS para reflashear).


Creo que no nos hemos entendido :)

Es que Uto estaba hablando yo creo, todo el tiempo del core principal (no del de otros cores). De hecho estoy totalmente de acuerdo con lo que dices, es lo mismo que yo defiendo, el caso que nosotros estabamos debatiendo era exclusivamente sobre el core principal. El caso de brickeo del core principal, el de spectrum, no del resto. Pero insisto, que estoy contigo.

Sólo decía que en hipotético caso de que decidéramos poner un sistema de recovery con un backup del core principal (que no creo que lo hagamos, porque restaría espacio ya que requeriría tener 2 cores de spectrum, el de arranque y el de backup), su funcionamiento sería como he descrito, ya que la spartan permite tener un header ANTES de cargar calquier bitstream, que tenga un pequeñísimo código de watchdog, donde intenta cargar el bitstream principal (el de specturm) y en caso de no conseguirlo (porque esté corrupto) en el lapso de X segundos y X intentos, entonces cargaría el bitstream de backup, situado en otra dirección. Pero como digo, yo no lo haría, y apuesto por lo que tu dices. Core principal sólo actualizable desde BIOS y bloqueada la escritura en el resto. Y que solo se bajen los cores de specturm de la página del zxuno.

Avatar de Usuario
antoniovillena
Amiga 1200
Amiga 1200
Mensajes: 2013
Registrado: 16 Abr 2012, 21:22
Gracias recibidas: 8 veces

Re: ZX-Uno: Camino hacia la versión 3 (definitiva)

Mensajepor antoniovillena » 15 Sep 2015, 12:19

Sí, lo entiendo. Pero es muy costoso y en caso de la Q80 no te permite cargar nada que no sea un spectrum. Aparte de que cada actualización la tienes que hacer por duplicado, una en el principal y otra en el backup.


Volver a “Sinclair/Spectrum”

¿Quién está conectado?

Usuarios navegando por este Foro: Google [Bot] y 13 invitados