1 /*
2 * Copyright (c) 2013-2023 Ali Mashtizadeh
3 * All rights reserved.
4 */
5
6 #include <stdbool.h>
7 #include <stdint.h>
8
9 #include <sys/kassert.h>
10 #include <sys/kdebug.h>
11 #include <sys/queue.h>
12 #include <sys/sga.h>
13 #include <sys/disk.h>
14 #include <sys/spinlock.h>
15
16 LIST_HEAD(DiskList, Disk) diskList = LIST_HEAD_INITIALIZER(diskList);
17
18 void
Disk_AddDisk(Disk * disk)19 Disk_AddDisk(Disk *disk)
20 {
21 LIST_INSERT_HEAD(&diskList, disk, entries);
22 }
23
24 void
Disk_RemoveDisk(Disk * disk)25 Disk_RemoveDisk(Disk *disk)
26 {
27 LIST_REMOVE(disk, entries);
28 }
29
30 Disk *
Disk_GetByID(uint64_t ctrlNo,uint64_t diskNo)31 Disk_GetByID(uint64_t ctrlNo, uint64_t diskNo)
32 {
33 Disk *d;
34
35 LIST_FOREACH(d, &diskList, entries) {
36 if (d->ctrlNo == ctrlNo && d->diskNo == diskNo)
37 return d;
38 }
39
40 return NULL;
41 }
42
43 int
Disk_Read(Disk * disk,void * buf,SGArray * sga,DiskCB cb,void * arg)44 Disk_Read(Disk *disk, void *buf, SGArray *sga, DiskCB cb, void *arg)
45 {
46 return disk->read(disk, buf, sga, cb, arg);
47 }
48
49 int
Disk_Write(Disk * disk,void * buf,SGArray * sga,DiskCB cb,void * arg)50 Disk_Write(Disk *disk, void *buf, SGArray *sga, DiskCB cb, void *arg)
51 {
52 return disk->write(disk, buf, sga, cb, arg);
53 }
54
55 int
Disk_Flush(Disk * disk,void * buf,SGArray * sga,DiskCB cb,void * arg)56 Disk_Flush(Disk *disk, void *buf, SGArray *sga, DiskCB cb, void *arg)
57 {
58 return disk->flush(disk, buf, sga, cb, arg);
59 }
60
61 static void
Debug_Disks(int argc,const char * argv[])62 Debug_Disks(int argc, const char *argv[])
63 {
64 Disk *d;
65
66 LIST_FOREACH(d, &diskList, entries) {
67 kprintf("disk%lld.%lld: %lld Sectors\n",
68 d->ctrlNo, d->diskNo, d->sectorCount);
69 }
70 }
71
72 REGISTER_DBGCMD(disks, "List disks", Debug_Disks);
73
74 static void
Debug_DumpDisk(int argc,const char * argv[])75 Debug_DumpDisk(int argc, const char *argv[])
76 {
77 uint64_t ctrlNo, diskNo;
78 uint64_t sector;
79 char buf[512];
80 SGArray sga;
81
82 if (argc != 4) {
83 kprintf("dumpdisk requires 4 arguments!\n");
84 return;
85 }
86
87 ctrlNo = Debug_StrToInt(argv[1]);
88 diskNo = Debug_StrToInt(argv[2]);
89 sector = Debug_StrToInt(argv[3]);
90
91 Disk *d = Disk_GetByID(ctrlNo, diskNo);
92
93 sga.len = 1;
94 sga.entries[0].offset = sector;
95 sga.entries[0].length = 512;
96
97 kprintf("Reading Sector %lld from disk%lld.%lld\n", sector, ctrlNo, diskNo);
98
99 Disk_Read(d, &buf, &sga, NULL, NULL);
100 Debug_PrintHex((const char *)&buf, 512, 0, 512);
101 }
102
103 REGISTER_DBGCMD(dumpdisk, "Dump disk sector", Debug_DumpDisk);
104
105