From 778d095071963814fc1876b4620c71398a007d8a Mon Sep 17 00:00:00 2001 From: sys64738 Date: Sat, 29 Jan 2022 21:25:33 +0100 Subject: [PATCH] slight cleanup & README update --- README.md | 83 +++++++++++++++++++++++++++++++++++++++--------- linux/.gitignore | 1 + linux/Makefile | 17 ++++++++++ linux/linux.c | 18 +++++++++++ rpi/.gitignore | 2 +- rpi/Makefile | 8 +---- rpi/linux.c | 8 ----- 7 files changed, 106 insertions(+), 31 deletions(-) create mode 100644 linux/.gitignore create mode 100644 linux/Makefile create mode 100644 linux/linux.c delete mode 100644 rpi/linux.c diff --git a/README.md b/README.md index 370ac49..4b54668 100644 --- a/README.md +++ b/README.md @@ -6,35 +6,77 @@ not the first one, but hopefully one that properly documents some stuff ## Workflow -Currently targetting the Cypress FX3. - -### Compiling +### Cypress FX3 ``` +$ # compile: $ make +$ # launch OpenOCD background process (needs to be done once): +$ make openocd-launch +$ # run & debug code +$ make openocd-load && make gdb ``` -Needs an `arm-none-eabi` toolchain. +Needs an `arm-none-eabi` toolchain, and OpenOCD. -### Running/debugging - -#### Setup +### Raspberry Pi v1.x bare-metal ``` -$ openocd -f ./arm926ejs_fx3.cfg -c "transport select jtag" -c "adapter speed 1000" -c "init" +$ # compile: +$ make -C rpi/ +$ # now copy rpi/rpi.img to your microSD card and name it "kernel.img". +$ # alternatively, use OpenOCD again: +$ make launch-openocd +$ make openocd-load && make gdb ``` -#### Running code +Needs an `arm-none-eabi` toolchain, and optionally OpenOCD. Output is written +to the UART on pin 8 (TX). + +Most likely won't work on a v2 or higher. + +### Linux userspace + +Currently only tested on a Raspberry Pi v1.2 B+. May also work on Linux running +on a Zynq. ``` -$ printf 'reset halt\nload_image jazelle.elf\nexit\n' | nc localhost 4444 -$ arm-none-eabi-gdb -ex 'target extended-remote localhost:3333' -ex 'set $pc=_start' -ex 'b jazelle_exec' -ex c jazelle.elf +$ # native compilation: +CFLAGS=-mtune=native make -C linux +$ # cross-compilation: (change the -march depending on your target) +CC=arm-linux-gnueabihf-gcc CFLAGS=-march=arm1176jzf-s make -C linux +$ # run it +$ linux/jazelle ``` +Requires an `arm-linux-gnueabihf` toolchain. + +### Xilinx Zynq bare-metal + +***NOTE: HIGHLY EXPERIMENTAL!*** + +``` +$ make -C zynq jazelle.o +``` + +Then link `zynq/jazelle.o` into an XSDK/Vitis project. If things break, the +first thing you should try is replacing the cache routines with the ones from +the Xilinx libraries. + +Requires an `arm-none-eabi` toolchain. + +### Other ports + +There are still several platforms out there which (most likely) can also run +Jazelle, but that don't have a port yet. See the [TODO](#TODO) header. + ## Credits FX3 base code: gratuitously stolen from https://github.com/zeldin/fx3lafw/ +Cache manipulation code was inspired by code from libnds (ARM9), libn3ds +(ARM11), and Xilinx' embeddedsw (Cortex-A9). + Jazelle info this project is based on: * https://hackspire.org/index.php/Jazelle * https://github.com/SonoSooS/libjz @@ -48,11 +90,22 @@ Jazelle info this project is based on: * [ ] What control registers are there that influence the execution? * [ ] Is it possible to force execute a certain instruction using the handler instead of the default in-hardware execution? + * Apparently not? * [ ] ... - * [ ] How does one call regular ARM/Thumb code from inside Jazelle? + * [x] How does one call regular ARM/Thumb code from inside Jazelle? + * invokeXYZ instruction implementation: check method reference string, do + things based on that * [ ] ... * [ ] Verify what Hackspire and libjz have, to check if it is correct * [ ] Look at what Hackspire and libjz don't have and try to complete it -* [ ] Port this code to the ARM11 using either Raspberry Pi v1 baremetal, or - 3DS homebrew with kernel privileges (and do tests on these to check for - different Jazelle versions) +* Ports: + * [ ] TI Nspire + * [x] Cypress FX3 + * [x] Raspberry Pi v1 baremetal + * [x] Linux userspace + * [ ] Linux kernel module + * [ ] 3DS homebrew + * [ ] Xilinx Zynq + * [ ] BeagleBoard/BeagleBone/PocketBeagle? (any OMAP or TI Sitara AM335x, + most likely not the AM572x-based ones, and definitely not the BeagleV) + * ... diff --git a/linux/.gitignore b/linux/.gitignore new file mode 100644 index 0000000..7d170ad --- /dev/null +++ b/linux/.gitignore @@ -0,0 +1 @@ +jazelle diff --git a/linux/Makefile b/linux/Makefile new file mode 100644 index 0000000..4de3730 --- /dev/null +++ b/linux/Makefile @@ -0,0 +1,17 @@ + +default: all + +# NOTE: please explicitly pass an -mcpu flag specific to the target you're +# using. -mtune=native MIGHT work but it's not guaranteed! +CFLAGS += -Wall -Og -g #-mcpu=arm1176jzf-s + +all: jazelle + +jazelle: linux.c ../jazelle.c + $(CC) $(CFLAGS) -o "$@" $^ + +clean: + $(RM) -v jazelle + +.PHONY: default all clean + diff --git a/linux/linux.c b/linux/linux.c new file mode 100644 index 0000000..92a59b3 --- /dev/null +++ b/linux/linux.c @@ -0,0 +1,18 @@ + +#include + +#ifndef __linux__ +#error "This code should be compiled for Linux." +#endif + +void jazelle_main(void); + +int main() { + const char* names[] = { NULL, "???", "???", "???", "ARM7", "ARM9", "ARM11", + "Cortex-Ax", "Cortex-Axx (AArch64)", "Cortex-X", "???", "???", "???" }; + + printf("Compiled for ARM v%d aka %s\n", __ARM_ARCH, names[__ARM_ARCH]); + jazelle_main(); + return 0; +} + diff --git a/rpi/.gitignore b/rpi/.gitignore index 02138fb..53f2de7 100644 --- a/rpi/.gitignore +++ b/rpi/.gitignore @@ -1,3 +1,3 @@ *.o *.elf -jazlinux +*.map diff --git a/rpi/Makefile b/rpi/Makefile index a740ba0..168035d 100644 --- a/rpi/Makefile +++ b/rpi/Makefile @@ -11,9 +11,6 @@ GDB ?= $(PREFIX)gdb PYTHON3 ?= python3 NC ?= nc -LNXPREFIX ?= arm-linux-gnueabihf- -LNXCC = $(LNXPREFIX)gcc - default: all all: rpi.elf rpi.img @@ -39,9 +36,6 @@ rpi.elf: rpi.o vectors.o nl-glue.o jazelle.o rpi.img: rpi.elf $(PREFIX)objcopy -O binary "$<" "$@" -jazlinux: linux.c ../jazelle.c - $(LNXCC) $(CLFAGS) -o "$@" $^ - openocd-launch: openocd -f interface/cmsis-dap.cfg -c "transport select jtag" \ -c "adapter speed 50" -f target/bcm2835.cfg \ @@ -58,6 +52,6 @@ gdb: rpi.elf clean: - @$(RM) -v rpi.o rpi.elf + @$(RM) -v rpi.o rpi.elf vectors.o jazelle.o nl-glue.o rpi.img .PHONY: all clean openocd-launch openocd-load gdb diff --git a/rpi/linux.c b/rpi/linux.c deleted file mode 100644 index 05a1264..0000000 --- a/rpi/linux.c +++ /dev/null @@ -1,8 +0,0 @@ - -void jazelle_main(void); - -int main() { - jazelle_main(); - return 0; -} -