Add fast bitset, inode search to EXT2
diff --git a/src/kernel/dri/ata_pio/ata_pio.c b/src/kernel/dri/ata_pio/ata_pio.c
index 1554702..ab6981e 100644
--- a/src/kernel/dri/ata_pio/ata_pio.c
+++ b/src/kernel/dri/ata_pio/ata_pio.c
@@ -3,12 +3,15 @@
#include <io.h>
#include <log.h>
#include <pic.h>
+#include <sync.h>
/* TODO: Rewrite all of this to work with dri_ide in the case of multiple
* devices */
static ushort test_buffer[256];
+static semaphore_t lock;
+
void ata_pio_wait_bsy()
{
while (inb(ATA_PORT_CMD) & ATA_BSY)
@@ -40,6 +43,8 @@
void ata_pio_read_sectors(void *buffer, uint lba, uchar num_sectors)
{
+ sm_wait(lock);
+
ushort *word_buffer = buffer;
for (int sector = 0; sector < num_sectors; sector++)
@@ -64,10 +69,14 @@
ata_pio_wait_bsy();
outw(ATA_PORT_CMD, ATA_CMD_FLUSH_CACHE);
}
+
+ sm_signal(lock);
}
void ata_pio_write_sectors(uint lba, uchar num_sectors, ushort *buffer)
{
+ sm_wait(lock);
+
for (int sector = 0; sector < num_sectors; sector++)
{
ata_pio_wait_bsy();
@@ -90,6 +99,8 @@
ata_pio_wait_bsy();
outw(ATA_PORT_CMD, ATA_CMD_FLUSH_CACHE);
}
+
+ sm_signal(lock);
}
static void print_buffer()
@@ -104,33 +115,9 @@
void test_ata_pio()
{
-// for (int i = 0; i < 2; i++)
- {
- kprintf(DEBUG "Writing 0s and reading back\n");
-
- // for (int i = 0; i < 256; i++)
- // test_buffer[i] = 0;
- // ata_pio_write_sectors(0, 1, test_buffer);
-
- ata_pio_read_sectors(test_buffer, 2, 1);
- print_buffer();
- kprintf(DEBUG "again...\n");
- ata_pio_read_sectors(test_buffer, 2, 1);
- print_buffer();
-
- for (int i = 0; i < 256; i++)
- test_buffer[i] = i;
-
- kprintf(DEBUG "Writing 0..256 and reading back\n");
-
- ata_pio_write_sectors(0, 1, test_buffer);
-
- ata_pio_read_sectors(test_buffer, 2, 1);
- print_buffer();
- kprintf(DEBUG "again...\n");
- ata_pio_read_sectors(test_buffer, 2, 1);
- print_buffer();
- }
+ kprintf(DEBUG "Testing ATA PIO\n");
+ ata_pio_read_sectors(test_buffer, 2, 1);
+ print_buffer();
}
void ata_pio_handle_irq(struct registers *regs)
@@ -149,4 +136,5 @@
void init_ata_pio()
{
add_interrupt_handler(46, ata_pio_handle_irq);
+ lock = sm_new();
}