sdk-core v2026.11.05
PS2 SDK - core tier (build-critical EE/IOP modules)
Loading...
Searching...
No Matches
ioprpgen.c
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
11#include <ioprpgen.h>
12#include <string.h>
13
14static int ioprpgen_dummy_writecb(void *userdata, const struct ioprpgen_ctx *ctx, const void *buf, u32 size)
15{
16 (void)userdata;
17 (void)ctx;
18 (void)buf;
19
20 return size;
21}
22
23static int ioprpgen_membuf_writecb(void *userdata, const struct ioprpgen_ctx *ctx, const void *buf, u32 size)
24{
25 struct ioprpgen_memwrite_ctx *memwrite_ctx;
26
27 (void)ctx;
28 memwrite_ctx = (struct ioprpgen_memwrite_ctx *)userdata;
29 if ( (memwrite_ctx->m_write_ptr_curpos + size) > memwrite_ctx->m_write_ptr_size )
30 return 0;
31 if ( buf )
32 memcpy(&((u8 *)(memwrite_ctx->m_write_ptr))[memwrite_ctx->m_write_ptr_curpos], buf, size);
33 else
34 memset(&((u8 *)(memwrite_ctx->m_write_ptr))[memwrite_ctx->m_write_ptr_curpos], 0, size);
35 memwrite_ctx->m_write_ptr_curpos += size;
36
37 return size;
38}
39
40void ioprpgen_setup_membuf(struct ioprpgen_ctx *ctx, struct ioprpgen_memwrite_ctx *memwrite_ctx, void *buf, u32 size)
41{
42 memset(ctx, 0, sizeof(*ctx));
43 if ( !buf || !size )
44 {
45 ctx->m_write_cb = ioprpgen_dummy_writecb;
46 ctx->m_write_cb_userdata = NULL;
47 return;
48 }
49 memwrite_ctx->m_write_ptr = buf;
50 memwrite_ctx->m_write_ptr_size = size;
51 memwrite_ctx->m_write_ptr_curpos = 0;
52 ctx->m_write_cb = ioprpgen_membuf_writecb;
53 ctx->m_write_cb_userdata = (void *)memwrite_ctx;
54}
55
57{
58 char m_name[10];
59 u16 m_extinfo_size;
60 u32 m_data_size;
61};
62
64{
65 u16 m_value;
66 u8 m_extlen;
67 u8 m_type;
68};
69
70static int
71ioprpgen_write_romdir_entry(const struct ioprpgen_ctx *ctx, const char *name, u32 extinfo_size, u32 data_size)
72{
73 struct ioprp_romdir_entry ent;
74 memset(&ent, 0, sizeof(ent));
75 strlcpy(ent.m_name, name ? name : "", sizeof(ent.m_name));
76 ent.m_extinfo_size = extinfo_size;
77 ent.m_data_size = data_size;
78 return ctx->m_write_cb(ctx->m_write_cb_userdata, ctx, &ent, sizeof(ent)) == sizeof(ent);
79}
80
81u32 ioprpgen_write_ioprp(const struct ioprpgen_ctx *ctx, const struct ioprpgen_entry *entries)
82{
83 int entry_count;
84 int i;
85 u32 romdir_size;
86 u32 extinfo_size;
87 u32 total_size;
88
89 entry_count = 0;
90 for ( i = 0; !!entries[i].m_name; i += 1 )
91 {
92 if (
93 !strcmp(entries[i].m_name, "RESET") || !strcmp(entries[i].m_name, "ROMDIR")
94 || !strcmp(entries[i].m_name, "EXTINFO") )
95 return 0;
96 entry_count += 1;
97 }
98 if ( !ioprpgen_write_romdir_entry(ctx, "RESET", 0, 0) )
99 return 0;
100 romdir_size = 16 * (entry_count + 4);
101 if ( !ioprpgen_write_romdir_entry(ctx, "ROMDIR", 0, romdir_size) )
102 return 0;
103 total_size = romdir_size;
104 extinfo_size = 4 * entry_count;
105 if ( !ioprpgen_write_romdir_entry(ctx, "EXTINFO", 0, extinfo_size) )
106 return 0;
107 for ( i = 0; i < entry_count; i += 1 )
108 if ( !ioprpgen_write_romdir_entry(ctx, entries[i].m_name, 4, entries[i].m_data_size) )
109 return 0;
110 if ( !ioprpgen_write_romdir_entry(ctx, NULL, 0, 0) )
111 return 0;
112 {
113 u32 cur_entry_size;
114 u32 padding_size;
115 u32 cur_padding_size;
116 struct ioprp_extinfo_entry extinfo_entry;
117
118 // These values are needed in order for UDNL to select the module
119 extinfo_entry.m_value = 0xFFFF;
120 extinfo_entry.m_extlen = 0;
121 extinfo_entry.m_type = 2;
122 cur_entry_size = 0;
123 for ( i = 0; i < entry_count; i += 1 )
124 {
125 u32 cur_value_size;
126
127 cur_value_size = ctx->m_write_cb(ctx->m_write_cb_userdata, ctx, &extinfo_entry, sizeof(extinfo_entry));
128 if ( cur_value_size != sizeof(extinfo_entry) )
129 return 0;
130 cur_entry_size += cur_value_size;
131 }
132 if ( cur_entry_size != extinfo_size )
133 return 0;
134 total_size += cur_entry_size;
135 padding_size = ((((cur_entry_size - 1) >> 4) + 1) << 4) - cur_entry_size;
136 cur_padding_size = ctx->m_write_cb(ctx->m_write_cb_userdata, ctx, NULL, padding_size);
137 if ( cur_padding_size != padding_size )
138 return 0;
139 total_size += cur_padding_size;
140 }
141 for ( i = 0; i < entry_count; i += 1 )
142 {
143 u32 cur_entry_size;
144 u32 padding_size;
145 u32 cur_padding_size;
146
147 cur_entry_size = ctx->m_write_cb(ctx->m_write_cb_userdata, ctx, entries[i].m_data, entries[i].m_data_size);
148 if ( cur_entry_size != entries[i].m_data_size )
149 return 0;
150 total_size += cur_entry_size;
151 padding_size = ((((cur_entry_size - 1) >> 4) + 1) << 4) - cur_entry_size;
152 cur_padding_size = ctx->m_write_cb(ctx->m_write_cb_userdata, ctx, NULL, padding_size);
153 if ( cur_padding_size != padding_size )
154 return 0;
155 total_size += cur_padding_size;
156 }
157 return total_size;
158}
u32 ioprpgen_write_ioprp(const struct ioprpgen_ctx *ctx, const struct ioprpgen_entry *entries)
Definition ioprpgen.c:81
void ioprpgen_setup_membuf(struct ioprpgen_ctx *ctx, struct ioprpgen_memwrite_ctx *memwrite_ctx, void *buf, u32 size)
Definition ioprpgen.c:40
Definition ioprpgen.c:64
Definition ioprpgen.c:57
Definition ioprpgen.h:44