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