Skip to content

Commit ec9382c

Browse files
committed
Changes to mx4sio for ps2sdk sio2man updates
Make hook simpler due to sio2man using a single semaphore Unhook intrman and loadcore when hooks no longer needed Add API for interrupt handler For loadcore and intrman hooks, only proceed when inner function succeeds
1 parent ff7c5f9 commit ec9382c

5 files changed

Lines changed: 330 additions & 206 deletions

File tree

iop/sio/mx4sio_bd/src/ioplib.c

Lines changed: 42 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,26 @@
1+
/*
2+
# _____ ___ ____ ___ ____
3+
# ____| | ____| | | |____|
4+
# | ___| |____ ___| ____| | \ PS2DEV Open Source Project.
5+
#-----------------------------------------------------------------------
6+
# Copyright ps2dev - http://www.ps2dev.org
7+
# Licenced under Academic Free License version 2.0
8+
# Review ps2sdk README & LICENSE files for further details.
9+
#
10+
# taken from MX4SIO driver for simplicity.
11+
# all credits go to maximus32
12+
*/
13+
114
#include "ioplib.h"
215
#include <intrman.h>
316

4-
iop_library_t *ioplib_getByName(const char *name)
17+
int ioplib_iterateByName(const char *name, ioplib_libiterate_cb_t cb, void *userdata)
518
{
619
iop_library_t *libptr;
720
int i;
21+
int count;
822

23+
count = 0;
924
// Get first loaded library
1025
libptr = GetLoadcoreInternalData()->let_next;
1126
// Loop through all loaded libraries
@@ -16,15 +31,19 @@ iop_library_t *ioplib_getByName(const char *name)
1631
break;
1732
}
1833

19-
// Return if match
20-
if (i == 8)
21-
return libptr;
34+
// Call callback if match
35+
if (i == 8) {
36+
count += 1;
37+
// Return early if requested
38+
if (cb(libptr, userdata))
39+
break;
40+
}
2241

2342
// Next library
2443
libptr = libptr->prev;
2544
}
2645

27-
return NULL;
46+
return count;
2847
}
2948

3049
unsigned int ioplib_getTableSize(iop_library_t *lib)
@@ -45,24 +64,25 @@ unsigned int ioplib_getTableSize(iop_library_t *lib)
4564
return size;
4665
}
4766

48-
void *ioplib_hookExportEntry(iop_library_t *lib, unsigned int entry, void *func)
67+
void *ioplib_hookSameExportEntries(iop_library_t *lib, unsigned int entry, void *func)
4968
{
50-
if (entry < ioplib_getTableSize(lib)) {
51-
int oldstate;
52-
void **exp, *temp;
53-
54-
exp = &lib->exports[entry];
55-
56-
CpuSuspendIntr(&oldstate);
57-
temp = *exp;
58-
*exp = func;
59-
func = temp;
60-
CpuResumeIntr(oldstate);
61-
62-
return func;
63-
}
64-
65-
return NULL;
69+
int table_size;
70+
int oldstate;
71+
void *oldfunc;
72+
unsigned int i;
73+
74+
table_size = ioplib_getTableSize(lib);
75+
if (entry >= table_size)
76+
return NULL;
77+
78+
CpuSuspendIntr(&oldstate);
79+
oldfunc = lib->exports[entry];
80+
for (i = 0; i < table_size; i += 1)
81+
if (lib->exports[i] == oldfunc)
82+
lib->exports[i] = func;
83+
CpuResumeIntr(oldstate);
84+
85+
return oldfunc;
6686
}
6787

6888
void ioplib_relinkExports(iop_library_t *lib)

iop/sio/mx4sio_bd/src/ioplib.h

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,39 @@
1+
/*
2+
# _____ ___ ____ ___ ____
3+
# ____| | ____| | | |____|
4+
# | ___| |____ ___| ____| | \ PS2DEV Open Source Project.
5+
#-----------------------------------------------------------------------
6+
# Copyright ps2dev - http://www.ps2dev.org
7+
# Licenced under Academic Free License version 2.0
8+
# Review ps2sdk README & LICENSE files for further details.
9+
#
10+
# taken from MX4SIO driver for simplicity.
11+
# all credits go to maximus32
12+
*/
13+
114
#ifndef IOPLIB_H
215
#define IOPLIB_H
316

417

518
#include <loadcore.h>
619

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

8-
extern iop_library_t *ioplib_getByName(const char *name);
22+
/** @brief Iterate for each library found by name
23+
* @param name Name of the module to search for
24+
* @param callback Callback called when the library name matches
25+
* @param userdata User data to pass to the callback
26+
* @return count of items found
27+
*/
28+
extern int ioplib_iterateByName(const char *name, ioplib_libiterate_cb_t cb, void *userdata);
929
extern unsigned int ioplib_getTableSize(iop_library_t *lib);
10-
extern void *ioplib_hookExportEntry(iop_library_t *lib, unsigned int entry, void *func);
30+
/** @brief Hook all IRX module exported functions that matches the specified entry.
31+
* @param lib Library object of the module to hook
32+
* @param entry Export number to be hooked
33+
* @param func Hook function
34+
* @return on error: NULL | on success: original function pointer
35+
*/
36+
extern void *ioplib_hookSameExportEntries(iop_library_t *lib, unsigned int entry, void *func);
1137
extern void ioplib_relinkExports(iop_library_t *lib);
1238

1339

iop/sio/mx4sio_bd/src/mx4sio.c

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99

1010
#include "mx4sio.h"
1111
#include "crc16.h"
12-
#include "ioplib.h"
1312
#include "sio2man_hook.h"
1413
#include "sio2regs.h"
1514
#include "spi_sdcard_driver.h"
@@ -723,9 +722,8 @@ const uint8_t reverse_byte_LUT8[256] = {
723722
0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff};
724723

725724
/* module */
726-
int module_start(int argc, char *argv[])
725+
static int module_start(int argc, char *argv[], void *startaddr, ModuleInfo_t *mi)
727726
{
728-
iop_library_t *lib_modload;
729727
iop_event_t event;
730728
iop_thread_t thread;
731729
int rv;
@@ -740,6 +738,7 @@ int module_start(int argc, char *argv[])
740738
(void)argc;
741739
(void)argv;
742740
#endif
741+
(void)startaddr;
743742

744743
/* create default transfer descriptor */
745744
mx_sio2_init_td(&global_td);
@@ -793,17 +792,10 @@ int module_start(int argc, char *argv[])
793792
goto error4;
794793
}
795794

796-
lib_modload = ioplib_getByName("modload");
797-
if (lib_modload != NULL) {
798-
M_DEBUG("modload 0x%x detected\n", lib_modload->version);
799-
// Newer modload versions allow modules to be unloaded
800-
// Let modload know we support unloading
801-
if (lib_modload->version > 0x102)
802-
return MODULE_REMOVABLE_END;
803-
} else {
804-
M_DEBUG("modload not detected!\n");
805-
}
806-
795+
// If modload has certain flags set indicating new version,
796+
// set the unloadable flag
797+
if (mi && ((mi->newflags & 2) != 0))
798+
mi->newflags |= 0x10;
807799
return MODULE_RESIDENT_END;
808800

809801
error4:
@@ -816,7 +808,7 @@ int module_start(int argc, char *argv[])
816808
return MODULE_NO_RESIDENT_END;
817809
}
818810

819-
int module_stop(int argc, char *argv[])
811+
static int module_stop(int argc, char *argv[], void *startaddr, ModuleInfo_t *mi)
820812
{
821813
#ifndef MINI_DRIVER
822814
int i;
@@ -828,6 +820,8 @@ int module_stop(int argc, char *argv[])
828820
(void)argc;
829821
(void)argv;
830822
#endif
823+
(void)startaddr;
824+
(void)mi;
831825

832826
DeleteThread(sd_detect_thread_id);
833827
sio2man_hook_deinit();
@@ -836,12 +830,12 @@ int module_stop(int argc, char *argv[])
836830
return MODULE_NO_RESIDENT_END;
837831
}
838832

839-
int _start(int argc, char *argv[])
833+
int _start(int argc, char *argv[], void *startaddr, ModuleInfo_t *mi)
840834
{
841835
M_PRINTF("MX4SIO v1.2\n");
842836

843837
if (argc >= 0)
844-
return module_start(argc, argv);
838+
return module_start(argc, argv, startaddr, mi);
845839
else
846-
return module_stop(-argc, argv);
840+
return module_stop(-argc, argv, startaddr, mi);
847841
}

0 commit comments

Comments
 (0)