diff --git a/source/gupje_device/.gitignore b/source/gupje_device/.gitignore new file mode 100644 index 0000000..e69de29 diff --git a/source/gupje_device/Makefile b/source/gupje_device/Makefile new file mode 100644 index 0000000..c31431e --- /dev/null +++ b/source/gupje_device/Makefile @@ -0,0 +1,17 @@ +ifeq ($(ANDROID_NDK_ROOT),) +$(error Error : Set the env variable 'ANDROID_NDK_ROOT' with the path of the Android NDK (version 20)) +endif + +CC := $(ANDROID_NDK_ROOT)/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android27-clang +AR := $(ANDROID_NDK_ROOT)/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android-ar +OBJCOPY := $(ANDROID_NDK_ROOT)/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android-objcopy +LD := $(ANDROID_NDK_ROOT)/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android-ld.bfd + +#==================Target Samsung S7 (8890)================== +CFLAGS_SAMSUNGS7 = -Os -Idevices/samsung_s7/ +samsung_s7: + [ -d bin/samsung_s7 ] || mkdir -p bin/samsung_s7/ + $(CC) arm64_stub.S -c -o bin/samsung_s7/entry.o $(CFLAGS_SAMSUNGS7) + $(CC) debugger.c -c -o bin/samsung_s7/debugger.o $(CFLAGS_SAMSUNGS7) + $(LD) -T devices/samsung_s7/linkscript.ld bin/samsung_s7/entry.o bin/samsung_s7/debugger.o -o bin/samsung_s7/debugger.elf --just-symbols=devices/samsung_s7/symbols.txt + $(OBJCOPY) -O binary bin/samsung_s7/debugger.elf bin/samsung_s7/debugger.bin \ No newline at end of file diff --git a/source/gupje_device/Readme.md b/source/gupje_device/Readme.md new file mode 100644 index 0000000..71be59b --- /dev/null +++ b/source/gupje_device/Readme.md @@ -0,0 +1,7 @@ +# Gupje +Current memory map: + +![memory map](memory_map.drawio.svg) + +## Usage: +Copy this folder to /devices/samsung_s7 and run ``make`` \ No newline at end of file diff --git a/source/gupje_device/device.h b/source/gupje_device/device.h new file mode 100644 index 0000000..31506f8 --- /dev/null +++ b/source/gupje_device/device.h @@ -0,0 +1,86 @@ +#include +#include + +// Create external function at 0x00006f88 +extern void maybe_usb_setup_read(char endpoint,void *fun,uint32_t target_buffer); +extern void dwc3_ep0_start_trans(char endpoint,uint32_t target_buf, uint32_t len); +extern int usb_event_handler(void); +extern uint32_t get_endpoint_recv_buffer(char endpoint); +extern void exynos_sleep(int endpoint,uint32_t timeout); +extern void usb_send(uint32_t address,uint32_t size); + +int mystrlen(char *data) { + int i=0; + while(1) { + if(data[i++] == '\0'){ + break; + } + } + return i-1; +} + + +#define recv_buffer 0x206fe00 //0x02021800 + 0x3000 +#define data_received 0x206fd00 + +void recv_data_cb(uint32_t endpoint, uint32_t len){ + char *dest_buf = (char *)recv_buffer; + volatile void *dref = (void *)data_received; + + void *rbuf = get_endpoint_recv_buffer(endpoint); + for(int i= 0; i < len; i++){ + dest_buf[i] = *(char *)(void *)((int)rbuf + i); + } + *(uint8_t *)dref = 1; // Mark as ready +} + +void recv_data(void *address, uint32_t size){ + // + volatile void *dref = (void *)data_received; + *(uint8_t *)dref = 0; + + maybe_usb_setup_read(2, recv_data_cb, size); + uint32_t rbuf = get_endpoint_recv_buffer(2); + dwc3_ep0_start_trans(2, rbuf, size); + while(1){ + usb_event_handler(); + if(*(uint8_t *)dref == 1){ + break; + } + // exynos_sleep(2, 1000); + } + // Copy to destination location + char *dest_buf = (uint64_t)address; + for(int i= 0; i < size; i++){ + dest_buf[i] = *(char *)(void *)((int)recv_buffer + i); + } +} + +void send_data_cb(uint32_t endpoint, uint32_t len){ + // Tell event handler that the data was received + volatile void *dref = (void *)data_received; + *(uint8_t *)dref = 1; // Mark as ready +} + +void send(void *address, uint32_t size, uint32_t *error){ + volatile void *dref = (void *)data_received; + *(uint8_t *)dref = 0; + maybe_usb_setup_read(0x1, send_data_cb, size); + // uint32_t rbuf = get_endpoint_recv_buffer(1); + dwc3_ep0_start_trans(1, (uint64_t)address, size); + while(1){ + usb_event_handler(); + if(*(uint8_t *)dref == 1){ + break; + } + // exynos_sleep(1, 1000); + } +} + +void usb_log(char * msg, uint32_t * error){ + send(msg, mystrlen(msg), error); +} + +void concrete_main(uint64_t debugger){ + +} \ No newline at end of file diff --git a/source/gupje_device/linkscript.ld b/source/gupje_device/linkscript.ld new file mode 100644 index 0000000..4390407 --- /dev/null +++ b/source/gupje_device/linkscript.ld @@ -0,0 +1,14 @@ +MEMORY { + ROM (rwx): ORIGIN = 0x2069000, LENGTH = 0x1000 +} + +SECTIONS +{ + . = 0x2069000; + .text . : { + *(.text*) + *(.data*) + *(.rodata*) + } >ROM + +} \ No newline at end of file diff --git a/source/gupje_device/memory_map.drawio.svg b/source/gupje_device/memory_map.drawio.svg new file mode 100644 index 0000000..d2bcab0 --- /dev/null +++ b/source/gupje_device/memory_map.drawio.svg @@ -0,0 +1 @@ +
USB Download buffer
0x02021800
0x02070000
stage1 (502 bytes)
0x2021a00
0x206fe00
usb_recv buffer (512 bytes)
0x2069000
Gupje (0x6000 bytes reserved)
Unknown IMEM?
0x2????????
BootROM
0x0
\ No newline at end of file diff --git a/source/gupje_device/symbols.txt b/source/gupje_device/symbols.txt new file mode 100644 index 0000000..cc34e41 --- /dev/null +++ b/source/gupje_device/symbols.txt @@ -0,0 +1,9 @@ +debugger_storage = 0x206d000; +debugger_stack = 0x206b000; +debugger_entry = 0x2069000; + +maybe_usb_setup_read = 0x00006f88; +dwc3_ep0_start_trans = 0x0000791c; +usb_event_handler = 0x00007bac; +get_endpoint_recv_buffer = 0x00007a7c; +exynos_sleep = 0x000027c8; \ No newline at end of file