Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
64 changes: 42 additions & 22 deletions iop/sio/mx4sio_bd/src/ioplib.c
Original file line number Diff line number Diff line change
@@ -1,11 +1,26 @@
/*
# _____ ___ ____ ___ ____
# ____| | ____| | | |____|
# | ___| |____ ___| ____| | \ PS2DEV Open Source Project.
#-----------------------------------------------------------------------
# Copyright ps2dev - http://www.ps2dev.org
# Licenced under Academic Free License version 2.0
# Review ps2sdk README & LICENSE files for further details.
#
# taken from MX4SIO driver for simplicity.
# all credits go to maximus32
*/

#include "ioplib.h"
#include <intrman.h>

iop_library_t *ioplib_getByName(const char *name)
int ioplib_iterateByName(const char *name, ioplib_libiterate_cb_t cb, void *userdata)
{
iop_library_t *libptr;
int i;
int count;

count = 0;
// Get first loaded library
libptr = GetLoadcoreInternalData()->let_next;
// Loop through all loaded libraries
Expand All @@ -16,15 +31,19 @@ iop_library_t *ioplib_getByName(const char *name)
break;
}

// Return if match
if (i == 8)
return libptr;
// Call callback if match
if (i == 8) {
count += 1;
// Return early if requested
if (cb(libptr, userdata))
break;
}

// Next library
libptr = libptr->prev;
}

return NULL;
return count;
}

unsigned int ioplib_getTableSize(iop_library_t *lib)
Expand All @@ -45,24 +64,25 @@ unsigned int ioplib_getTableSize(iop_library_t *lib)
return size;
}

void *ioplib_hookExportEntry(iop_library_t *lib, unsigned int entry, void *func)
void *ioplib_hookSameExportEntries(iop_library_t *lib, unsigned int entry, void *func)
{
if (entry < ioplib_getTableSize(lib)) {
int oldstate;
void **exp, *temp;

exp = &lib->exports[entry];

CpuSuspendIntr(&oldstate);
temp = *exp;
*exp = func;
func = temp;
CpuResumeIntr(oldstate);

return func;
}

return NULL;
int table_size;
int oldstate;
void *oldfunc;
unsigned int i;

table_size = ioplib_getTableSize(lib);
if (entry >= table_size)
return NULL;

CpuSuspendIntr(&oldstate);
oldfunc = lib->exports[entry];
for (i = 0; i < table_size; i += 1)
if (lib->exports[i] == oldfunc)
lib->exports[i] = func;
CpuResumeIntr(oldstate);

return oldfunc;
}

void ioplib_relinkExports(iop_library_t *lib)
Expand Down
30 changes: 28 additions & 2 deletions iop/sio/mx4sio_bd/src/ioplib.h
Original file line number Diff line number Diff line change
@@ -1,13 +1,39 @@
/*
# _____ ___ ____ ___ ____
# ____| | ____| | | |____|
# | ___| |____ ___| ____| | \ PS2DEV Open Source Project.
#-----------------------------------------------------------------------
# Copyright ps2dev - http://www.ps2dev.org
# Licenced under Academic Free License version 2.0
# Review ps2sdk README & LICENSE files for further details.
#
# taken from MX4SIO driver for simplicity.
# all credits go to maximus32
*/

#ifndef IOPLIB_H
#define IOPLIB_H


#include <loadcore.h>

typedef int (*ioplib_libiterate_cb_t)(iop_library_t *lib, void *userdata);

extern iop_library_t *ioplib_getByName(const char *name);
/** @brief Iterate for each library found by name
* @param name Name of the module to search for
* @param callback Callback called when the library name matches
* @param userdata User data to pass to the callback
* @return count of items found
*/
extern int ioplib_iterateByName(const char *name, ioplib_libiterate_cb_t cb, void *userdata);
extern unsigned int ioplib_getTableSize(iop_library_t *lib);
extern void *ioplib_hookExportEntry(iop_library_t *lib, unsigned int entry, void *func);
/** @brief Hook all IRX module exported functions that matches the specified entry.
* @param lib Library object of the module to hook
* @param entry Export number to be hooked
* @param func Hook function
* @return on error: NULL | on success: original function pointer
*/
extern void *ioplib_hookSameExportEntries(iop_library_t *lib, unsigned int entry, void *func);
extern void ioplib_relinkExports(iop_library_t *lib);


Expand Down
30 changes: 12 additions & 18 deletions iop/sio/mx4sio_bd/src/mx4sio.c
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@

#include "mx4sio.h"
#include "crc16.h"
#include "ioplib.h"
#include "sio2man_hook.h"
#include "sio2regs.h"
#include "spi_sdcard_driver.h"
Expand Down Expand Up @@ -723,9 +722,8 @@ const uint8_t reverse_byte_LUT8[256] = {
0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff};

/* module */
int module_start(int argc, char *argv[])
static int module_start(int argc, char *argv[], void *startaddr, ModuleInfo_t *mi)
{
iop_library_t *lib_modload;
iop_event_t event;
iop_thread_t thread;
int rv;
Expand All @@ -740,6 +738,7 @@ int module_start(int argc, char *argv[])
(void)argc;
(void)argv;
#endif
(void)startaddr;

/* create default transfer descriptor */
mx_sio2_init_td(&global_td);
Expand Down Expand Up @@ -793,17 +792,10 @@ int module_start(int argc, char *argv[])
goto error4;
}

lib_modload = ioplib_getByName("modload");
if (lib_modload != NULL) {
M_DEBUG("modload 0x%x detected\n", lib_modload->version);
// Newer modload versions allow modules to be unloaded
// Let modload know we support unloading
if (lib_modload->version > 0x102)
return MODULE_REMOVABLE_END;
} else {
M_DEBUG("modload not detected!\n");
}

// If modload has certain flags set indicating new version,
// set the unloadable flag
if (mi && ((mi->newflags & 2) != 0))
mi->newflags |= 0x10;
return MODULE_RESIDENT_END;

error4:
Expand All @@ -816,7 +808,7 @@ int module_start(int argc, char *argv[])
return MODULE_NO_RESIDENT_END;
}

int module_stop(int argc, char *argv[])
static int module_stop(int argc, char *argv[], void *startaddr, ModuleInfo_t *mi)
{
#ifndef MINI_DRIVER
int i;
Expand All @@ -828,6 +820,8 @@ int module_stop(int argc, char *argv[])
(void)argc;
(void)argv;
#endif
(void)startaddr;
(void)mi;

DeleteThread(sd_detect_thread_id);
sio2man_hook_deinit();
Expand All @@ -836,12 +830,12 @@ int module_stop(int argc, char *argv[])
return MODULE_NO_RESIDENT_END;
}

int _start(int argc, char *argv[])
int _start(int argc, char *argv[], void *startaddr, ModuleInfo_t *mi)
{
M_PRINTF("MX4SIO v1.2\n");

if (argc >= 0)
return module_start(argc, argv);
return module_start(argc, argv, startaddr, mi);
else
return module_stop(-argc, argv);
return module_stop(-argc, argv, startaddr, mi);
}
Loading
Loading