This repository has been archived by the owner on Oct 1, 2019. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
7 changed files
with
640 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
/* Cafe OS Substrate Installer | ||
mem_functions.h - Exposes memory functions from dynamic_libs. | ||
No parter file. | ||
https://github.com/QuarkTheAwesome/COSSubstrate | ||
Copyright (c) 2016 Ash (QuarkTheAwesome) | ||
Permission is hereby granted, free of charge, to any person obtaining a copy | ||
of this software and associated documentation files (the "Software"), to | ||
deal in the Software without restriction, including without limitation the | ||
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or | ||
sell copies of the Software, and to permit persons to whom the Software is | ||
furnished to do so, subject to the following conditions: | ||
The above copyright notice and this permission notice shall be included in | ||
all copies or substantial portions of the Software. | ||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||
THE SOFTWARE. | ||
*/ | ||
|
||
|
||
extern void *(* MEMAllocFromExpHeapEx)(int heap, unsigned int size, int align); | ||
extern int (* MEMCreateExpHeapEx)(void* address, unsigned int size, unsigned short flags); | ||
extern void *(* MEMDestroyExpHeap)(int heap); | ||
extern void (* MEMFreeToExpHeap)(int heap, void* ptr); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,165 @@ | ||
/**************************************************************************** | ||
* Copyright (C) 2015 | ||
* by Dimok | ||
* | ||
* This software is provided 'as-is', without any express or implied | ||
* warranty. In no event will the authors be held liable for any | ||
* damages arising from the use of this software. | ||
* | ||
* Permission is granted to anyone to use this software for any | ||
* purpose, including commercial applications, and to alter it and | ||
* redistribute it freely, subject to the following restrictions: | ||
* | ||
* 1. The origin of this software must not be misrepresented; you | ||
* must not claim that you wrote the original software. If you use | ||
* this software in a product, an acknowledgment in the product | ||
* documentation would be appreciated but is not required. | ||
* | ||
* 2. Altered source versions must be plainly marked as such, and | ||
* must not be misrepresented as being the original software. | ||
* | ||
* 3. This notice may not be removed or altered from any source | ||
* distribution. | ||
***************************************************************************/ | ||
#include "os_functions.h" | ||
#include <substrate/substrate.h> | ||
|
||
unsigned int coreinit_handle = 0; | ||
|
||
//!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ||
//! Lib handle functions | ||
//!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ||
EXPORT_DECL(int, OSDynLoad_Acquire, const char* rpl, u32 *handle); | ||
EXPORT_DECL(int, OSDynLoad_FindExport, u32 handle, int isdata, const char *symbol, void *address); | ||
|
||
//!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ||
//! Thread functions | ||
//!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ||
EXPORT_DECL(int, OSCreateThread, void *thread, s32 (*callback)(s32, void*), s32 argc, void *args, u32 stack, u32 stack_size, s32 priority, u32 attr); | ||
EXPORT_DECL(int, OSResumeThread, void *thread); | ||
EXPORT_DECL(int, OSSuspendThread, void *thread); | ||
EXPORT_DECL(int, OSIsThreadTerminated, void *thread); | ||
EXPORT_DECL(int, OSIsThreadSuspended, void *thread); | ||
EXPORT_DECL(int, OSSetThreadPriority, void * thread, int priority); | ||
EXPORT_DECL(int, OSJoinThread, void * thread, int * ret_val); | ||
EXPORT_DECL(void, OSDetachThread, void * thread); | ||
EXPORT_DECL(void, OSSleepTicks, u64 ticks); | ||
EXPORT_DECL(u64, OSGetTick, void); | ||
|
||
//!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ||
//! Mutex functions | ||
//!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ||
EXPORT_DECL(void, OSInitMutex, void* mutex); | ||
EXPORT_DECL(void, OSLockMutex, void* mutex); | ||
EXPORT_DECL(void, OSUnlockMutex, void* mutex); | ||
EXPORT_DECL(int, OSTryLockMutex, void* mutex); | ||
|
||
//!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ||
//! System functions | ||
//!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ||
EXPORT_DECL(u64, OSGetTitleID, void); | ||
EXPORT_DECL(void, __Exit, void); | ||
EXPORT_DECL(void, OSFatal, const char* msg); | ||
EXPORT_DECL(void, OSSetExceptionCallback, u8 exceptionType, exception_callback newCallback); | ||
EXPORT_DECL(void, DCFlushRange, const void *addr, u32 length); | ||
EXPORT_DECL(void, ICInvalidateRange, const void *addr, u32 length); | ||
EXPORT_DECL(void*, OSEffectiveToPhysical, const void*); | ||
EXPORT_DECL(int, __os_snprintf, char* s, int n, const char * format, ...); | ||
|
||
EXPORT_DECL(void, OSScreenInit, void); | ||
EXPORT_DECL(unsigned int, OSScreenGetBufferSizeEx, unsigned int bufferNum); | ||
EXPORT_DECL(int, OSScreenSetBufferEx, unsigned int bufferNum, void * addr); | ||
EXPORT_DECL(int, OSScreenClearBufferEx, unsigned int bufferNum, unsigned int temp); | ||
EXPORT_DECL(int, OSScreenFlipBuffersEx, unsigned int bufferNum); | ||
EXPORT_DECL(int, OSScreenPutFontEx, unsigned int bufferNum, unsigned int posX, unsigned int posY, const char * buffer); | ||
EXPORT_DECL(int, OSScreenEnableEx, unsigned int bufferNum, int enable); | ||
|
||
//!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ||
//! Memory functions | ||
//!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ||
EXPORT_VAR(unsigned int *, pMEMAllocFromDefaultHeapEx); | ||
EXPORT_VAR(unsigned int *, pMEMAllocFromDefaultHeap); | ||
EXPORT_VAR(unsigned int *, pMEMFreeToDefaultHeap); | ||
|
||
EXPORT_DECL(int, MEMGetBaseHeapHandle, int mem_arena); | ||
EXPORT_DECL(unsigned int, MEMGetAllocatableSizeForFrmHeapEx, int heap, int align); | ||
EXPORT_DECL(void *, MEMAllocFromFrmHeapEx, int heap, unsigned int size, int align); | ||
EXPORT_DECL(void, MEMFreeToFrmHeap, int heap, int mode); | ||
EXPORT_DECL(void *, MEMAllocFromExpHeapEx, int heap, unsigned int size, int align); | ||
EXPORT_DECL(int , MEMCreateExpHeapEx, void* address, unsigned int size, unsigned short flags); | ||
EXPORT_DECL(void *, MEMDestroyExpHeap, int heap); | ||
EXPORT_DECL(void, MEMFreeToExpHeap, int heap, void* ptr); | ||
|
||
//!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ||
//! Loader functions (not real rpl) | ||
//!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ||
EXPORT_DECL(int, LiWaitIopComplete, int unknown_syscall_arg_r3, int * remaining_bytes); | ||
EXPORT_DECL(int, LiWaitIopCompleteWithInterrupts, int unknown_syscall_arg_r3, int * remaining_bytes); | ||
|
||
void InitOSFunctionPointers(void) | ||
{ | ||
unsigned int *funcPointer = 0; | ||
//!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ||
//! Lib handle functions | ||
//!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ||
EXPORT_FUNC_WRITE(OSDynLoad_Acquire, (int (*)(const char*, unsigned *))COSS_SPECIFICS->OSDynLoad_Acquire); | ||
EXPORT_FUNC_WRITE(OSDynLoad_FindExport, (int (*)(u32, int, const char *, void *))COSS_SPECIFICS->OSDynLoad_FindExport); | ||
|
||
OSDynLoad_Acquire("coreinit.rpl", &coreinit_handle); | ||
|
||
//!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ||
//! System functions | ||
//!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ||
OS_FIND_EXPORT(coreinit_handle, OSFatal); | ||
OS_FIND_EXPORT(coreinit_handle, OSGetTitleID); | ||
OS_FIND_EXPORT(coreinit_handle, OSSetExceptionCallback); | ||
OS_FIND_EXPORT(coreinit_handle, DCFlushRange); | ||
OS_FIND_EXPORT(coreinit_handle, ICInvalidateRange); | ||
OS_FIND_EXPORT(coreinit_handle, OSEffectiveToPhysical); | ||
OS_FIND_EXPORT(coreinit_handle, __os_snprintf); | ||
OSDynLoad_FindExport(coreinit_handle, 0, "_Exit", &__Exit); | ||
|
||
OS_FIND_EXPORT(coreinit_handle, OSScreenInit); | ||
OS_FIND_EXPORT(coreinit_handle, OSScreenGetBufferSizeEx); | ||
OS_FIND_EXPORT(coreinit_handle, OSScreenSetBufferEx); | ||
OS_FIND_EXPORT(coreinit_handle, OSScreenClearBufferEx); | ||
OS_FIND_EXPORT(coreinit_handle, OSScreenFlipBuffersEx); | ||
OS_FIND_EXPORT(coreinit_handle, OSScreenPutFontEx); | ||
OS_FIND_EXPORT(coreinit_handle, OSScreenEnableEx); | ||
//!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ||
//! Thread functions | ||
//!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ||
OS_FIND_EXPORT(coreinit_handle, OSCreateThread); | ||
OS_FIND_EXPORT(coreinit_handle, OSResumeThread); | ||
OS_FIND_EXPORT(coreinit_handle, OSSuspendThread); | ||
OS_FIND_EXPORT(coreinit_handle, OSIsThreadTerminated); | ||
OS_FIND_EXPORT(coreinit_handle, OSIsThreadSuspended); | ||
OS_FIND_EXPORT(coreinit_handle, OSJoinThread); | ||
OS_FIND_EXPORT(coreinit_handle, OSSetThreadPriority); | ||
OS_FIND_EXPORT(coreinit_handle, OSDetachThread); | ||
OS_FIND_EXPORT(coreinit_handle, OSSleepTicks); | ||
OS_FIND_EXPORT(coreinit_handle, OSGetTick); | ||
//!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ||
//! Mutex functions | ||
//!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ||
OS_FIND_EXPORT(coreinit_handle, OSInitMutex); | ||
OS_FIND_EXPORT(coreinit_handle, OSLockMutex); | ||
OS_FIND_EXPORT(coreinit_handle, OSUnlockMutex); | ||
OS_FIND_EXPORT(coreinit_handle, OSTryLockMutex); | ||
|
||
//!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ||
//! Memory functions | ||
//!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ||
OSDynLoad_FindExport(coreinit_handle, 1, "MEMAllocFromDefaultHeapEx", &pMEMAllocFromDefaultHeapEx); | ||
OSDynLoad_FindExport(coreinit_handle, 1, "MEMAllocFromDefaultHeap", &pMEMAllocFromDefaultHeap); | ||
OSDynLoad_FindExport(coreinit_handle, 1, "MEMFreeToDefaultHeap", &pMEMFreeToDefaultHeap); | ||
|
||
OS_FIND_EXPORT(coreinit_handle, MEMGetBaseHeapHandle); | ||
OS_FIND_EXPORT(coreinit_handle, MEMGetAllocatableSizeForFrmHeapEx); | ||
OS_FIND_EXPORT(coreinit_handle, MEMAllocFromFrmHeapEx); | ||
OS_FIND_EXPORT(coreinit_handle, MEMFreeToFrmHeap); | ||
OS_FIND_EXPORT(coreinit_handle, MEMAllocFromExpHeapEx); | ||
OS_FIND_EXPORT(coreinit_handle, MEMCreateExpHeapEx); | ||
OS_FIND_EXPORT(coreinit_handle, MEMDestroyExpHeap); | ||
OS_FIND_EXPORT(coreinit_handle, MEMFreeToExpHeap); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,127 @@ | ||
/**************************************************************************** | ||
* Copyright (C) 2015 | ||
* by Dimok | ||
* | ||
* This software is provided 'as-is', without any express or implied | ||
* warranty. In no event will the authors be held liable for any | ||
* damages arising from the use of this software. | ||
* | ||
* Permission is granted to anyone to use this software for any | ||
* purpose, including commercial applications, and to alter it and | ||
* redistribute it freely, subject to the following restrictions: | ||
* | ||
* 1. The origin of this software must not be misrepresented; you | ||
* must not claim that you wrote the original software. If you use | ||
* this software in a product, an acknowledgment in the product | ||
* documentation would be appreciated but is not required. | ||
* | ||
* 2. Altered source versions must be plainly marked as such, and | ||
* must not be misrepresented as being the original software. | ||
* | ||
* 3. This notice may not be removed or altered from any source | ||
* distribution. | ||
***************************************************************************/ | ||
#ifndef __OS_FUNCTIONS_H_ | ||
#define __OS_FUNCTIONS_H_ | ||
|
||
#include <gctypes.h> | ||
|
||
#ifdef __cplusplus | ||
extern "C" { | ||
#endif | ||
|
||
#define BUS_SPEED 248625000 | ||
#define SECS_TO_TICKS(sec) (((unsigned long long)(sec)) * (BUS_SPEED/4)) | ||
#define MILLISECS_TO_TICKS(msec) (SECS_TO_TICKS(msec) / 1000) | ||
#define MICROSECS_TO_TICKS(usec) (SECS_TO_TICKS(usec) / 1000000) | ||
|
||
#define usleep(usecs) OSSleepTicks(MICROSECS_TO_TICKS(usecs)) | ||
#define sleep(secs) OSSleepTicks(SECS_TO_TICKS(secs)) | ||
|
||
#define FLUSH_DATA_BLOCK(addr) asm volatile("dcbf 0, %0; sync" : : "r"(((addr) & ~31))) | ||
#define INVAL_DATA_BLOCK(addr) asm volatile("dcbi 0, %0; sync" : : "r"(((addr) & ~31))) | ||
|
||
#define EXPORT_DECL(res, func, ...) res (* func)(__VA_ARGS__) __attribute__((section(".data"))) = 0; | ||
#define EXPORT_VAR(type, var) type var __attribute__((section(".data"))); | ||
|
||
|
||
#define EXPORT_FUNC_WRITE(func, val) *(u32*)(((u32)&func) + 0) = (u32)val | ||
|
||
#define OS_FIND_EXPORT(handle, func) funcPointer = 0; \ | ||
OSDynLoad_FindExport(handle, 0, # func, &funcPointer); \ | ||
if(!funcPointer) \ | ||
OSFatal("Function " # func " is NULL"); \ | ||
EXPORT_FUNC_WRITE(func, funcPointer); | ||
|
||
#define OS_FIND_EXPORT_EX(handle, func, func_p) \ | ||
funcPointer = 0; \ | ||
OSDynLoad_FindExport(handle, 0, # func, &funcPointer); \ | ||
if(!funcPointer) \ | ||
OSFatal("Function " # func " is NULL"); \ | ||
EXPORT_FUNC_WRITE(func_p, funcPointer); | ||
|
||
#define OS_MUTEX_SIZE 44 | ||
|
||
/* Handle for coreinit */ | ||
extern unsigned int coreinit_handle; | ||
void InitOSFunctionPointers(void); | ||
|
||
//!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ||
//! Lib handle functions | ||
//!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ||
extern int (* OSDynLoad_Acquire)(const char* rpl, u32 *handle); | ||
extern int (* OSDynLoad_FindExport)(u32 handle, int isdata, const char *symbol, void *address); | ||
|
||
//!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ||
//! Thread functions | ||
//!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ||
extern int (* OSCreateThread)(void *thread, s32 (*callback)(s32, void*), s32 argc, void *args, u32 stack, u32 stack_size, s32 priority, u32 attr); | ||
extern int (* OSResumeThread)(void *thread); | ||
extern int (* OSSuspendThread)(void *thread); | ||
extern int (* OSIsThreadTerminated)(void *thread); | ||
extern int (* OSIsThreadSuspended)(void *thread); | ||
extern int (* OSJoinThread)(void * thread, int * ret_val); | ||
extern int (* OSSetThreadPriority)(void * thread, int priority); | ||
extern void (* OSDetachThread)(void * thread); | ||
extern void (* OSSleepTicks)(u64 ticks); | ||
extern u64 (* OSGetTick)(void); | ||
|
||
//!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ||
//! Mutex functions | ||
//!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ||
extern void (* OSInitMutex)(void* mutex); | ||
extern void (* OSLockMutex)(void* mutex); | ||
extern void (* OSUnlockMutex)(void* mutex); | ||
extern int (* OSTryLockMutex)(void* mutex); | ||
|
||
//!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ||
//! System functions | ||
//!---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ||
extern u64 (* OSGetTitleID)(void); | ||
extern void (* __Exit)(void); | ||
extern void (* OSFatal)(const char* msg); | ||
extern void (* DCFlushRange)(const void *addr, u32 length); | ||
extern void (* ICInvalidateRange)(const void *addr, u32 length); | ||
extern void* (* OSEffectiveToPhysical)(const void*); | ||
extern int (* __os_snprintf)(char* s, int n, const char * format, ...); | ||
|
||
extern void (*OSScreenInit)(void); | ||
extern unsigned int (*OSScreenGetBufferSizeEx)(unsigned int bufferNum); | ||
extern int (*OSScreenSetBufferEx)(unsigned int bufferNum, void * addr); | ||
extern int (*OSScreenClearBufferEx)(unsigned int bufferNum, unsigned int temp); | ||
extern int (*OSScreenFlipBuffersEx)(unsigned int bufferNum); | ||
extern int (*OSScreenPutFontEx)(unsigned int bufferNum, unsigned int posX, unsigned int posY, const char * buffer); | ||
extern int (*OSScreenEnableEx)(unsigned int bufferNum, int enable); | ||
|
||
typedef unsigned char (*exception_callback)(void * interruptedContext); | ||
extern void (* OSSetExceptionCallback)(u8 exceptionType, exception_callback newCallback); | ||
|
||
extern int (* LiWaitIopComplete)(int unknown_syscall_arg_r3, int * remaining_bytes); | ||
extern int (* LiWaitIopCompleteWithInterrupts)(int unknown_syscall_arg_r3, int * remaining_bytes); | ||
|
||
|
||
#ifdef __cplusplus | ||
} | ||
#endif | ||
|
||
#endif // __OS_FUNCTIONS_H_ |
Oops, something went wrong.