From c8d1342ddfae7d6316533933969f39a3c6e9948e Mon Sep 17 00:00:00 2001 From: Michael Scire Date: Tue, 17 Apr 2018 17:41:57 -0600 Subject: [PATCH] Stratosphere: Add Launch Queue to Loader Modified from RE done by @ogniK5377 --- .../loader/source/ldr_launch_queue.cpp | 46 +++++++++++++++++++ .../loader/source/ldr_launch_queue.hpp | 19 ++++++++ 2 files changed, 65 insertions(+) create mode 100644 stratosphere/loader/source/ldr_launch_queue.cpp create mode 100644 stratosphere/loader/source/ldr_launch_queue.hpp diff --git a/stratosphere/loader/source/ldr_launch_queue.cpp b/stratosphere/loader/source/ldr_launch_queue.cpp new file mode 100644 index 000000000..698e496e4 --- /dev/null +++ b/stratosphere/loader/source/ldr_launch_queue.cpp @@ -0,0 +1,46 @@ +#include "ldr_launch_queue.hpp" + +#include + +static launch_item_t g_launch_queue[LAUNCH_QUEUE_SIZE]; + +int launch_queue_get_index(u64 TID) { + for(unsigned int i = 0; i < LAUNCH_QUEUE_SIZE; i++) { + if(g_launch_queue[i].tid == TID) { + return i; + } + } + return LAUNCH_QUEUE_FULL; +} + +int launch_queue_get_free_index(u64 TID) { + for(unsigned int i = 0; i < LAUNCH_QUEUE_SIZE; i++) { + if(g_launch_queue[i].tid == TID || g_launch_queue[i].tid == 0x0) { + return i; + } + } + return LAUNCH_QUEUE_FULL; +} + +Result launch_queue_add(launch_item_t *item) { + if(item->arg_size > LAUNCH_QUEUE_ARG_SIZE_MAX) { + return 0x209; + } + + int idx = launch_queue_get_free_index(item->tid); + if(idx == LAUNCH_QUEUE_FULL) + return 0x409; + + g_launch_queue[idx] = *item; + return 0x0; +} + +bool launch_queue_contains(uint64_t TID) { + return launch_queue_get_index(TID) != LAUNCH_QUEUE_FULL; +} + +void launch_queue_clear() { + for (unsigned int i = 0; i < LAUNCH_QUEUE_SIZE; i++) { + g_launch_queue[i].tid = 0; + } +} \ No newline at end of file diff --git a/stratosphere/loader/source/ldr_launch_queue.hpp b/stratosphere/loader/source/ldr_launch_queue.hpp new file mode 100644 index 000000000..b0be76915 --- /dev/null +++ b/stratosphere/loader/source/ldr_launch_queue.hpp @@ -0,0 +1,19 @@ +#pragma once +#include + +#define LAUNCH_QUEUE_SIZE (10) +#define LAUNCH_QUEUE_FULL (-1) + +#define LAUNCH_QUEUE_ARG_SIZE_MAX (0x8000) + +typedef struct launch_item_t { + u64 tid; + u64 arg_size; + char args[LAUNCH_QUEUE_ARG_SIZE_MAX]; +} launch_item_t; + +Result launch_queue_add(launch_item_t item); +int launch_queue_get_index(u64 TID); +int launch_queue_get_free_index(u64 TID = 0); +bool launch_queue_contains(u64 TID); +void launch_queue_clear(); \ No newline at end of file