projects
/
pintos-anon
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Also clean bochsout.txt, bochsrc.txt.
[pintos-anon]
/
src
/
devices
/
disk.c
diff --git
a/src/devices/disk.c
b/src/devices/disk.c
index 0a131740b00711bc94af611330518d9e919b18f5..14fc63158be840c550d7eb7a9d42d6ecb23b0c77 100644
(file)
--- a/
src/devices/disk.c
+++ b/
src/devices/disk.c
@@
-30,6
+30,7
@@
/* Alternate Status Register bits. */
#define STA_BSY 0x80 /* Busy. */
/* Alternate Status Register bits. */
#define STA_BSY 0x80 /* Busy. */
+#define STA_DRDY 0x40 /* Device Ready. */
#define STA_DRQ 0x08 /* Data Request. */
/* Control Register bits. */
#define STA_DRQ 0x08 /* Data Request. */
/* Control Register bits. */
@@
-182,7
+183,7
@@
disk_print_stats (void)
slave, respectively--within the channel numbered CHAN_NO.
Pintos uses disks this way:
slave, respectively--within the channel numbered CHAN_NO.
Pintos uses disks this way:
- 0:0 - operating system kernel
+ 0:0 -
boot loader, command line args, and
operating system kernel
0:1 - file system
1:0 - scratch
1:1 - swap
0:1 - file system
1:0 - scratch
1:1 - swap
@@
-212,7
+213,9
@@
disk_size (struct disk *d)
}
/* Reads sector SEC_NO from disk D into BUFFER, which must have
}
/* Reads sector SEC_NO from disk D into BUFFER, which must have
- room for DISK_SECTOR_SIZE bytes. */
+ room for DISK_SECTOR_SIZE bytes.
+ Internally synchronizes accesses to disks, so external
+ per-disk locking is unneeded. */
void
disk_read (struct disk *d, disk_sector_t sec_no, void *buffer)
{
void
disk_read (struct disk *d, disk_sector_t sec_no, void *buffer)
{
@@
-235,7
+238,9
@@
disk_read (struct disk *d, disk_sector_t sec_no, void *buffer)
/* Write sector SEC_NO to disk D from BUFFER, which must contain
DISK_SECTOR_SIZE bytes. Returns after the disk has
/* Write sector SEC_NO to disk D from BUFFER, which must contain
DISK_SECTOR_SIZE bytes. Returns after the disk has
- acknowledged receiving the data. */
+ acknowledged receiving the data.
+ Internally synchronizes accesses to disks, so external
+ per-disk locking is unneeded. */
void
disk_write (struct disk *d, disk_sector_t sec_no, const void *buffer)
{
void
disk_write (struct disk *d, disk_sector_t sec_no, const void *buffer)
{
@@
-331,15
+336,18
@@
static bool
check_device_type (struct disk *d)
{
struct channel *c = d->channel;
check_device_type (struct disk *d)
{
struct channel *c = d->channel;
- uint8_t error, lbam, lbah;
+ uint8_t error, lbam, lbah
, status
;
select_device (d);
error = inb (reg_error (c));
lbam = inb (reg_lbam (c));
lbah = inb (reg_lbah (c));
select_device (d);
error = inb (reg_error (c));
lbam = inb (reg_lbam (c));
lbah = inb (reg_lbah (c));
+ status = inb (reg_status (c));
- if (error != 1 && (error != 0x81 || d->dev_no == 1))
+ if ((error != 1 && (error != 0x81 || d->dev_no == 1))
+ || (status & STA_DRDY) == 0
+ || (status & STA_BSY) != 0)
{
d->is_ata = false;
return error != 0x81;
{
d->is_ata = false;
return error != 0x81;