linux stuff

This commit is contained in:
Triss 2022-01-29 03:24:18 +01:00
parent 6742aa38e3
commit 0a7914e3f7
4 changed files with 49 additions and 4 deletions

View File

@ -13,9 +13,11 @@
#if defined(__linux__) && !defined(__KERNEL__) #if defined(__linux__) && !defined(__KERNEL__)
// FIXME: (on musl) seems to crash upon entry before reaching main()
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <sys/mman.h>
#define iprintf(fmt, ...) printf((fmt), ##__VA_ARGS__) #define iprintf(fmt, ...) printf((fmt), ##__VA_ARGS__)
#elif defined(__KERNEL__) #elif defined(__KERNEL__)
@ -174,7 +176,7 @@ static void DC_InvalidateAll(void) {
DC_FlushAll(); DC_FlushAll();
} }
__attribute__((__naked__, __no_inline__)) __attribute__((__naked__, __no_inline__))
static void IC_InvalidateAll(void) { void IC_InvalidateAll(void) {
asm volatile( asm volatile(
".fill 65536, 4, 0\n" // 64k nop instructions because eh ".fill 65536, 4, 0\n" // 64k nop instructions because eh
"bx lr\n" "bx lr\n"
@ -329,6 +331,7 @@ static void handler_0xfe(void) {
"bxj r12\n" // FIXME: r12 can be modified by jazelle so it should be restored to something "bxj r12\n" // FIXME: r12 can be modified by jazelle so it should be restored to something
//: //:
//:[br5]"m"(backup_r5) //:[br5]"m"(backup_r5)
".pool\n"
); );
} }
@ -426,7 +429,7 @@ static void handler_noexec() {
); );
} }
static uint8_t bytecode_testh[] = { static uint8_t bytecode_testh_base[] = {
0x06, 0x06, 0x06, 0x06,
0x07, 0x07, 0x07, 0x07,
0x05, 0x05, 0x05, 0x05,
@ -439,6 +442,22 @@ static uint8_t bytecode_testh[] = {
}; };
static void jazelle_test_handlers(uint8_t hflags[256/8]) { static void jazelle_test_handlers(uint8_t hflags[256/8]) {
#ifdef __linux__
#ifdef __KERNEL__
#error "TODO: kernel: alloc rwx page"
#else
uint8_t* bytecode_testh = mmap(NULL, 4096, PROT_READ|PROT_WRITE|PROT_EXEC,
MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
if (!bytecode_testh || !~(uint32_t)bytecode_testh) {
printf("Can't map a page RWX, need it for instruction enumeration.\n");
return;
}
memcpy(bytecode_testh, bytecode_testh_base, sizeof bytecode_testh_base);
#endif
#else
#define bytecode_testh bytecode_testh_base
#endif
memset(hflags, 0, 256/8); memset(hflags, 0, 256/8);
for (int i = 0x00; i < 0xff /* bytecode 0xff is hardwired to bkpt #0 */; ++i) { for (int i = 0x00; i < 0xff /* bytecode 0xff is hardwired to bkpt #0 */; ++i) {
if (i == 0xba) { if (i == 0xba) {
@ -490,9 +509,19 @@ static void jazelle_test_handlers(uint8_t hflags[256/8]) {
jazelle_block.handlers[i] = NULL; jazelle_block.handlers[i] = NULL;
} }
#ifdef __linux__
#ifdef __KERNEL__
#error "TODO: kernel: alloc rwx page"
#else
munmap(bytecode_testh, 4096);
#endif
#else
#undef bytecode_testh
#endif
} }
// https://github.com/SonoSooS/libjz/wiki/Java-instruction-set // https://github.com/SonoSooS/libjz/wiki/Java-instruction-set
__attribute__((__section__(".text"), __align__(4)))
static uint8_t bytecode_test1[] = { static uint8_t bytecode_test1[] = {
0x06, // iconst_3 0x06, // iconst_3
0x07, // iconst_4 0x07, // iconst_4
@ -503,6 +532,7 @@ static uint8_t bytecode_test1[] = {
0x60, // iadd 0x60, // iadd
0x60, // iadd 0x60, // iadd
0xAC, // ireturn 0xAC, // ireturn
0x00, 0x00, 0x00 // alignment to keep gcc happy
}; };
// returns 6 if idiv implemented natively, else 10 // returns 6 if idiv implemented natively, else 10
@ -551,7 +581,5 @@ void jazelle_main(void) {
} }
printf("\r\n"); printf("\r\n");
} }
while (true) ;
} }

3
rpi/.gitignore vendored Normal file
View File

@ -0,0 +1,3 @@
*.o
*.elf
jazlinux

View File

@ -11,6 +11,9 @@ GDB ?= $(PREFIX)gdb
PYTHON3 ?= python3 PYTHON3 ?= python3
NC ?= nc NC ?= nc
LNXPREFIX ?= arm-linux-gnueabihf-
LNXCC = $(LNXPREFIX)gcc
default: all default: all
all: rpi.elf all: rpi.elf
@ -27,6 +30,9 @@ rpi.elf: rpi.o
jazelle.o: ../jazelle.c jazelle.o: ../jazelle.c
$(CC) $(CFLAGS) -c -o "$@" "$<" $(CC) $(CFLAGS) -c -o "$@" "$<"
jazlinux: linux.c ../jazelle.c
$(LNXCC) $(CLFAGS) -o "$@" $^
openocd-launch: openocd-launch:
openocd -f interface/cmsis-dap.cfg -c "transport select jtag" \ openocd -f interface/cmsis-dap.cfg -c "transport select jtag" \
-c "adapter speed 50" -f target/bcm2835.cfg \ -c "adapter speed 50" -f target/bcm2835.cfg \

8
rpi/linux.c Normal file
View File

@ -0,0 +1,8 @@
void jazelle_main(void);
int main() {
jazelle_main();
return 0;
}