diff --git a/c8_remote/lib/CMakeLists.txt b/c8_remote/lib/CMakeLists.txt index 13c07c1..f1f5847 100644 --- a/c8_remote/lib/CMakeLists.txt +++ b/c8_remote/lib/CMakeLists.txt @@ -1,18 +1,23 @@ set(PL_NAMES - aes_busy - aes_sw_bern - aes_sw_corr - cachelib - exit_usb_task - floppysleep - sync + crypto:aes_busy + crypto:aes_sw_bern + crypto:aes_sw_corr + + system:cachelib + system:exit_usb_task + system:init_sys + system:sync + + power:floppysleep ) foreach(NAME ${PL_NAMES}) - list(APPEND PL_TARGETS "payload_${NAME}") - list(APPEND PL_SRC_BIN "${CMAKE_CURRENT_LIST_DIR}/payload/src/${NAME}.c") + string(REGEX REPLACE "^[^:]*\\:(.*)$" "\\1" NAME_ONLY ${NAME}) + list(APPEND PL_TARGETS "payload_${NAME_ONLY}") endforeach(NAME) +message("${PL_TARGETS}") + foreach(TARGET ${PL_TARGETS}) list(APPEND PL_SRC_LIB "${CMAKE_CURRENT_BINARY_DIR}/lib_cfiles/${TARGET}.c") list(APPEND PL_BIN "${CMAKE_CURRENT_BINARY_DIR}/payload/bin/${TARGET}.bin") @@ -39,7 +44,7 @@ add_custom_command(TARGET payload POST_BUILD ${CMAKE_CURRENT_BINARY_DIR}/lib_cfiles ${CMAKE_SOURCE_DIR}/c8_remote/include/tool) -add_library(experiments experiments/aes_sw.c +add_library(experiments experiments/crypto.c experiments/system.c experiments/power.c) add_library(host_crypto crypto/aes_sw_impl.c crypto/aes_sw_host.c) \ No newline at end of file diff --git a/c8_remote/lib/experiments/aes_sw.c b/c8_remote/lib/experiments/crypto.c similarity index 100% rename from c8_remote/lib/experiments/aes_sw.c rename to c8_remote/lib/experiments/crypto.c diff --git a/c8_remote/lib/experiments/system.c b/c8_remote/lib/experiments/system.c index 0855cc6..d91de60 100644 --- a/c8_remote/lib/experiments/system.c +++ b/c8_remote/lib/experiments/system.c @@ -2,6 +2,7 @@ #include #include "tool/command.h" +#include "dev/addr.h" void usb_task_exit(struct pwned_device *dev) { @@ -38,8 +39,7 @@ void usb_task_exit(struct pwned_device *dev) return; } - resp = execute_payload(dev, PAYLOAD_EXIT_USB_TASK, 0, - 1, get_payload_address(dev, PAYLOAD_EXIT_USB_TASK)); + resp = execute_payload(dev, PAYLOAD_EXIT_USB_TASK, 0, 0); if(IS_CHECKM8_FAIL(resp->ret)) { printf("failed to exit usb task\n"); diff --git a/c8_remote/lib/payload/CMakeLists.txt b/c8_remote/lib/payload/CMakeLists.txt index 88e25f9..58d3488 100644 --- a/c8_remote/lib/payload/CMakeLists.txt +++ b/c8_remote/lib/payload/CMakeLists.txt @@ -19,23 +19,24 @@ set(CMAKE_C_FLAGS "-nostdlib -O") file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/bin) foreach(NAME ${PL_NAMES}) - if(EXISTS ${CMAKE_CURRENT_LIST_DIR}/src/${NAME}.S) - add_executable(payload_${NAME} ${CMAKE_CURRENT_LIST_DIR}/payload_entry.S - ${CMAKE_CURRENT_LIST_DIR}/payload_entry.c - ${CMAKE_CURRENT_LIST_DIR}/src/${NAME}.c - ${CMAKE_CURRENT_LIST_DIR}/src/${NAME}.S) - else() - add_executable(payload_${NAME} ${CMAKE_CURRENT_LIST_DIR}/payload_entry.S - ${CMAKE_CURRENT_LIST_DIR}/payload_entry.c - ${CMAKE_CURRENT_LIST_DIR}/src/${NAME}.c) + string(REPLACE ":" "/" SRC_PATH ${NAME}) + string(REGEX REPLACE "^[^:]*\\:(.*)$" "\\1" NAME_ONLY ${NAME}) + + set(SRC_NAME ${NAME}_SRCS) + set(${SRC_NAME} src/payload_entry.S src/payload_entry.c src/${SRC_PATH}.c) + + if(EXISTS ${CMAKE_CURRENT_LIST_DIR}/src/${SRC_PATH}.S) + list(APPEND ${SRC_NAME} src/${SRC_PATH}.S) endif() - add_custom_command(TARGET payload_${NAME} POST_BUILD - BYPRODUCTS ${CMAKE_CURRENT_BINARY_DIR}/bin/payload_${NAME}.bin + add_executable(payload_${NAME_ONLY} ${${SRC_NAME}}) + message(adding payload_${NAME_ONLY}) + add_custom_command(TARGET payload_${NAME_ONLY} POST_BUILD + BYPRODUCTS ${CMAKE_CURRENT_BINARY_DIR}/bin/payload_${NAME_ONLY}.bin COMMAND ${CMAKE_OBJCOPY} - ARGS -O binary -j .text -j .payload_text - ${CMAKE_CURRENT_BINARY_DIR}/payload_${NAME} - ${CMAKE_CURRENT_BINARY_DIR}/bin/payload_${NAME}.bin) + ARGS -O binary -j .text -j .payload_text -j .payload_data + ${CMAKE_CURRENT_BINARY_DIR}/payload_${NAME_ONLY} + ${CMAKE_CURRENT_BINARY_DIR}/bin/payload_${NAME_ONLY}.bin) endforeach(NAME) add_library(dev_crypto ../crypto/aes_sw_impl.c) diff --git a/c8_remote/lib/payload/include/dev_util.h b/c8_remote/lib/payload/include/dev_util.h index e830797..d8d143f 100644 --- a/c8_remote/lib/payload/include/dev_util.h +++ b/c8_remote/lib/payload/include/dev_util.h @@ -17,6 +17,6 @@ typedef unsigned int uint32_t; typedef unsigned long long uint64_t; #define PAYLOAD_SECTION __attribute__ ((section (".payload_text"))) -#define TEXT_SECTION __attribute__ ((section (".text"))) +#define PAYLOAD_DATA __attribute__ ((section (".payload_data"))) #endif //CHECKM8_TOOL_DEV_UTIL_H diff --git a/c8_remote/lib/payload/src/aes_busy.c b/c8_remote/lib/payload/src/crypto/aes_busy.c similarity index 100% rename from c8_remote/lib/payload/src/aes_busy.c rename to c8_remote/lib/payload/src/crypto/aes_busy.c diff --git a/c8_remote/lib/payload/src/aes_sw_bern.c b/c8_remote/lib/payload/src/crypto/aes_sw_bern.c similarity index 100% rename from c8_remote/lib/payload/src/aes_sw_bern.c rename to c8_remote/lib/payload/src/crypto/aes_sw_bern.c diff --git a/c8_remote/lib/payload/src/aes_sw_corr.c b/c8_remote/lib/payload/src/crypto/aes_sw_corr.c similarity index 100% rename from c8_remote/lib/payload/src/aes_sw_corr.c rename to c8_remote/lib/payload/src/crypto/aes_sw_corr.c diff --git a/c8_remote/lib/payload/src/exit_usb_task.c b/c8_remote/lib/payload/src/exit_usb_task.c deleted file mode 100644 index 66e8d91..0000000 --- a/c8_remote/lib/payload/src/exit_usb_task.c +++ /dev/null @@ -1,53 +0,0 @@ -#include "dev/addr.h" -#include "bootrom_func.h" - -PAYLOAD_SECTION -void fix_heap() -{ - *((unsigned long long *) 0x1801b91a0) = 0x80 / 0x40; - *((unsigned long long *) 0x1801b91a8) = ((0x840u / 0x40) << 2u); - *((unsigned long long *) 0x1801b91b0) = 0x80; - *((unsigned long long *) 0x1801b91b8) = 0; - - *((unsigned long long *) 0x1801b9220) = 0x80 / 0x40; - *((unsigned long long *) 0x1801b9228) = ((0x80u / 0x40) << 2u); - *((unsigned long long *) 0x1801b9230) = 0x80; - *((unsigned long long *) 0x1801b9238) = 0; - - *((unsigned long long *) 0x1801b92a0) = 0x80 / 0x40; - *((unsigned long long *) 0x1801b92a8) = ((0x80u / 0x40) << 2u); - *((unsigned long long *) 0x1801b92b0) = 0x80; - *((unsigned long long *) 0x1801b92b8) = 0; - - __asm__ volatile ("dmb sy"); - calc_chksum((unsigned long long *) 0x1801b9180, - (unsigned long long *) 0x1801b91a0, - 32, - (unsigned long long *) 0x180080640); - - calc_chksum((unsigned long long *) 0x1801b9200, - (unsigned long long *) 0x1801b9220, - 32, - (unsigned long long *) 0x180080640); - - calc_chksum((unsigned long long *) 0x1801b9280, - (unsigned long long *) 0x1801b92a0, - 32, - (unsigned long long *) 0x180080640); - - __asm__ volatile ("dmb sy"); - check_all_chksums(); -} - -void entry_sync(unsigned long long *self) -{ - fix_heap(); - - *(ADDR_DFU_RETVAL) = -1; - *(ADDR_DFU_STATUS) = 1; - - event_notify((struct event *) ADDR_DFU_EVENT); - dev_free(self); -} - -void entry_async(uint64_t *base){} \ No newline at end of file diff --git a/c8_remote/lib/payload/payload_entry.S b/c8_remote/lib/payload/src/payload_entry.S similarity index 100% rename from c8_remote/lib/payload/payload_entry.S rename to c8_remote/lib/payload/src/payload_entry.S diff --git a/c8_remote/lib/payload/payload_entry.c b/c8_remote/lib/payload/src/payload_entry.c similarity index 100% rename from c8_remote/lib/payload/payload_entry.c rename to c8_remote/lib/payload/src/payload_entry.c diff --git a/c8_remote/lib/payload/src/floppysleep.S b/c8_remote/lib/payload/src/power/floppysleep.S similarity index 100% rename from c8_remote/lib/payload/src/floppysleep.S rename to c8_remote/lib/payload/src/power/floppysleep.S diff --git a/c8_remote/lib/payload/src/floppysleep.c b/c8_remote/lib/payload/src/power/floppysleep.c similarity index 100% rename from c8_remote/lib/payload/src/floppysleep.c rename to c8_remote/lib/payload/src/power/floppysleep.c diff --git a/c8_remote/lib/payload/src/cachelib.c b/c8_remote/lib/payload/src/system/cachelib.c similarity index 100% rename from c8_remote/lib/payload/src/cachelib.c rename to c8_remote/lib/payload/src/system/cachelib.c diff --git a/c8_remote/lib/payload/src/system/exit_usb_task.c b/c8_remote/lib/payload/src/system/exit_usb_task.c new file mode 100644 index 0000000..9149358 --- /dev/null +++ b/c8_remote/lib/payload/src/system/exit_usb_task.c @@ -0,0 +1,28 @@ +#include "dev/addr.h" +#include "bootrom_func.h" + +PAYLOAD_SECTION +void entry_sync(uint64_t addr_hook) +{ + uint64_t *bs_task_sp = ((uint64_t *) ADDR_BOOTSTRAP_TASK + (0x128 / 8)); + uint64_t *bs_task_stack = (uint64_t *) *bs_task_sp; + + while(1) + { + if(*bs_task_stack == ADDR_GETDFU_EXIT) + { + *bs_task_stack = addr_hook; + break; + } + + bs_task_stack++; + } + + *(ADDR_DFU_RETVAL) = -1; + *(ADDR_DFU_STATUS) = 1; + + event_notify((struct event *) ADDR_DFU_EVENT); +} + +PAYLOAD_SECTION +void entry_async(){} \ No newline at end of file diff --git a/c8_remote/lib/payload/src/system/init_sys.c b/c8_remote/lib/payload/src/system/init_sys.c new file mode 100644 index 0000000..f6c2505 --- /dev/null +++ b/c8_remote/lib/payload/src/system/init_sys.c @@ -0,0 +1,11 @@ + + +void entry_sync() +{ + +} + +void entry_async() +{ + +} \ No newline at end of file diff --git a/c8_remote/lib/payload/src/sync.c b/c8_remote/lib/payload/src/system/sync.c similarity index 100% rename from c8_remote/lib/payload/src/sync.c rename to c8_remote/lib/payload/src/system/sync.c