sdk-core v2026.11.05
PS2 SDK - core tier (build-critical EE/IOP modules)
Loading...
Searching...
No Matches
ramdisk_bd.c
1#include "irx_imports.h"
2#include "image.h"
3
4IRX_ID("ramdisk_bd", 1, 0);
5
6static u8 *disk;
7static int lock = -1;
8static struct block_device bd;
9
10static int in_range(struct block_device *b, u64 sector, u16 count)
11{
12 return sector < b->sectorCount && count <= b->sectorCount - sector;
13}
14
15static 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
26static 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
37static void ramdisk_flush(struct block_device *b)
38{
39 (void)b;
40}
41
42static int ramdisk_stop(struct block_device *b)
43{
44 (void)b;
45 return 0;
46}
47
48int _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}
#define EIO
Definition errno.h:38
u32 count
start sector of fragmented bd/file