sdk-core
v2026.11.05
PS2 SDK - core tier (build-critical EE/IOP modules)
Toggle main menu visibility
Loading...
Searching...
No Matches
ramdisk_bd.c
1
#include "irx_imports.h"
2
#include "image.h"
3
4
IRX_ID(
"ramdisk_bd"
, 1, 0);
5
6
static
u8 *disk;
7
static
int
lock = -1;
8
static
struct
block_device
bd;
9
10
static
int
in_range(
struct
block_device
*b, u64 sector, u16
count
)
11
{
12
return
sector < b->sectorCount &&
count
<= b->sectorCount - sector;
13
}
14
15
static
int
ramdisk_read(
struct
block_device
*b, u64 sector,
void
*buffer, u16
count
)
16
{
17
if
(!in_range(b, sector,
count
))
18
return
-
EIO
;
19
20
WaitSema(lock);
21
memcpy(buffer, disk + (u32)sector * RAMDISK_SECTOR_SIZE,
count
* RAMDISK_SECTOR_SIZE);
22
SignalSema(lock);
23
return
count
;
24
}
25
26
static
int
ramdisk_write(
struct
block_device
*b, u64 sector,
const
void
*buffer, u16
count
)
27
{
28
if
(!in_range(b, sector,
count
))
29
return
-
EIO
;
30
31
WaitSema(lock);
32
memcpy(disk + (u32)sector * RAMDISK_SECTOR_SIZE, buffer,
count
* RAMDISK_SECTOR_SIZE);
33
SignalSema(lock);
34
return
count
;
35
}
36
37
static
void
ramdisk_flush(
struct
block_device
*b)
38
{
39
(void)b;
40
}
41
42
static
int
ramdisk_stop(
struct
block_device
*b)
43
{
44
(void)b;
45
return
0;
46
}
47
48
int
_start(
int
argc,
char
*argv[])
49
{
50
iop_sema_t
sema;
51
u32 size = ramdisk_sector_count * RAMDISK_SECTOR_SIZE;
52
53
(void)argc;
54
(void)argv;
55
56
disk = AllocSysMemory(ALLOC_FIRST, size, NULL);
57
if
(disk == NULL) {
58
printf(
"ramdisk_bd: cannot allocate %u bytes\n"
, (
unsigned
int
)size);
59
return
MODULE_NO_RESIDENT_END;
60
}
61
memset(disk, 0, size);
62
for
(u32 i = 0; i < ramdisk_seed_count; i++)
63
memcpy(disk +
ramdisk_seed
[i].lba * RAMDISK_SECTOR_SIZE,
ramdisk_seed
[i].data, RAMDISK_SECTOR_SIZE);
64
65
sema.attr = 0;
66
sema.option = 0;
67
sema.initial = 1;
68
sema.max = 1;
69
lock = CreateSema(&sema);
70
if
(lock < 0) {
71
FreeSysMemory(disk);
72
return
MODULE_NO_RESIDENT_END;
73
}
74
75
bd.priv = NULL;
76
bd.name =
"ram"
;
77
bd.path =
"ram"
;
78
bd.devNr = 0;
79
bd.parNr = 0;
80
bd.parId = 0;
81
bd.sectorSize = RAMDISK_SECTOR_SIZE;
82
bd.sectorOffset = 0;
83
bd.sectorCount = ramdisk_sector_count;
84
bd.read = ramdisk_read;
85
bd.write = ramdisk_write;
86
bd.flush = ramdisk_flush;
87
bd.stop = ramdisk_stop;
88
bdm_connect_bd(&bd);
89
90
printf(
"ramdisk_bd: %u sectors registered\n"
, ramdisk_sector_count);
91
return
MODULE_RESIDENT_END;
92
}
EIO
#define EIO
Definition
errno.h:38
block_device
Definition
bdm.h:23
iop_sema_t
Definition
thsemap.h:40
ramdisk_seed
Definition
image.h:7
count
u32 count
start sector of fragmented bd/file
Definition
usbhdfsd-common.h:1
tests
driver-blockdev
src
iop
ramdisk_bd.c
Generated by
1.18.0