CS350 COS
COS
Loading...
Searching...
No Matches
disk.c
Go to the documentation of this file.
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
16LIST_HEAD(DiskList, Disk) diskList = LIST_HEAD_INITIALIZER(diskList);
17
18void
19Disk_AddDisk(Disk *disk)
20{
21 LIST_INSERT_HEAD(&diskList, disk, entries);
22}
23
24void
26{
27 LIST_REMOVE(disk, entries);
28}
29
30Disk *
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
43int
44Disk_Read(Disk *disk, void *buf, SGArray *sga, DiskCB cb, void *arg)
45{
46 return disk->read(disk, buf, sga, cb, arg);
47}
48
49int
50Disk_Write(Disk *disk, void *buf, SGArray *sga, DiskCB cb, void *arg)
51{
52 return disk->write(disk, buf, sga, cb, arg);
53}
54
55int
56Disk_Flush(Disk *disk, void *buf, SGArray *sga, DiskCB cb, void *arg)
57{
58 return disk->flush(disk, buf, sga, cb, arg);
59}
60
61static void
62Debug_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
72REGISTER_DBGCMD(disks, "List disks", Debug_Disks);
73
74static void
75Debug_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
103REGISTER_DBGCMD(dumpdisk, "Dump disk sector", Debug_DumpDisk);
104
void Disk_RemoveDisk(Disk *disk)
Definition: disk.c:25
int Disk_Flush(Disk *disk, void *buf, SGArray *sga, DiskCB cb, void *arg)
Definition: disk.c:56
int Disk_Write(Disk *disk, void *buf, SGArray *sga, DiskCB cb, void *arg)
Definition: disk.c:50
int Disk_Read(Disk *disk, void *buf, SGArray *sga, DiskCB cb, void *arg)
Definition: disk.c:44
static void Debug_DumpDisk(int argc, const char *argv[])
Definition: disk.c:75
Disk * Disk_GetByID(uint64_t ctrlNo, uint64_t diskNo)
Definition: disk.c:31
static void Debug_Disks(int argc, const char *argv[])
Definition: disk.c:62
void Disk_AddDisk(Disk *disk)
void(* DiskCB)(int, void *)
Definition: disk.h:8
static char buf[4096]
Definition: ethdump.c:10
int kprintf(const char *fmt,...)
Definition: printf.c:210
uint64_t Debug_StrToInt(const char *s)
Definition: debug.c:124
#define REGISTER_DBGCMD(_NAME, _DESC, _FUNC)
Definition: kdebug.h:11
void Debug_PrintHex(const char *data, size_t length, off_t off, size_t limit)
Definition: debug.c:30
#define LIST_REMOVE(elm, field)
Definition: queue.h:465
#define LIST_HEAD_INITIALIZER(head)
Definition: queue.h:368
#define LIST_FOREACH(var, head, field)
Definition: queue.h:410
#define LIST_INSERT_HEAD(head, elm, field)
Definition: queue.h:451
#define LIST_HEAD(name, type)
Definition: queue.h:363
uint64_t length
Definition: sga.h:10
SGEntry entries[SGARRAY_MAX_ENTRIES]
Definition: sga.h:16
uint32_t len
Definition: sga.h:15
uint64_t offset
Definition: sga.h:9
Definition: sga.h:14
#define NULL
Definition: stddef.h:6
Definition: disk.h:11
uint64_t ctrlNo
Definition: disk.h:13
uint64_t sectorCount
Definition: disk.h:16
uint64_t diskNo
Definition: disk.h:14
int(* write)(Disk *, void *, SGArray *, DiskCB, void *)
Definition: disk.h:19
int(* flush)(Disk *, void *, SGArray *, DiskCB, void *)
Definition: disk.h:20
int(* read)(Disk *, void *, SGArray *, DiskCB, void *)
Definition: disk.h:18
unsigned long uint64_t
Definition: types.h:13