mirror of
https://github.com/wichtounet/thor-os.git
synced 2025-09-13 06:29:47 -04:00
Safer ATA driver
This commit is contained in:
parent
ea4fbf9a92
commit
e2a7f90342
@ -5,6 +5,8 @@
|
||||
// http://www.boost.org/LICENSE_1_0.txt)
|
||||
//=======================================================================
|
||||
|
||||
#include <lock_guard.hpp>
|
||||
|
||||
#include "ata.hpp"
|
||||
#include "kernel_utils.hpp"
|
||||
#include "timer.hpp"
|
||||
@ -14,6 +16,7 @@
|
||||
#include "console.hpp"
|
||||
#include "errors.hpp"
|
||||
#include "disks.hpp"
|
||||
#include "mutex.hpp"
|
||||
|
||||
namespace {
|
||||
|
||||
@ -56,6 +59,11 @@ static constexpr const size_t BLOCK_SIZE = 512;
|
||||
|
||||
ata::drive_descriptor* drives;
|
||||
|
||||
mutex<> ata_lock;
|
||||
|
||||
mutex<> primary_lock;
|
||||
mutex<> secondary_lock;
|
||||
|
||||
volatile bool primary_invoked = false;
|
||||
volatile bool secondary_invoked = false;
|
||||
|
||||
@ -63,14 +71,25 @@ volatile bool secondary_invoked = false;
|
||||
//be done with a semaphore
|
||||
|
||||
void primary_controller_handler(interrupt::syscall_regs*){
|
||||
if(scheduler::is_started()){
|
||||
primary_lock.release();
|
||||
} else {
|
||||
primary_invoked = true;
|
||||
}
|
||||
}
|
||||
|
||||
void secondary_controller_handler(interrupt::syscall_regs*){
|
||||
if(scheduler::is_started()){
|
||||
secondary_lock.release();
|
||||
} else {
|
||||
secondary_invoked = true;
|
||||
}
|
||||
}
|
||||
|
||||
void ata_wait_irq_primary(){
|
||||
if(scheduler::is_started()){
|
||||
primary_lock.acquire();
|
||||
} else {
|
||||
while(!primary_invoked){
|
||||
asm volatile ("nop");
|
||||
asm volatile ("nop");
|
||||
@ -80,9 +99,13 @@ void ata_wait_irq_primary(){
|
||||
}
|
||||
|
||||
primary_invoked = false;
|
||||
}
|
||||
}
|
||||
|
||||
void ata_wait_irq_secondary(){
|
||||
if(scheduler::is_started()){
|
||||
secondary_lock.acquire();
|
||||
} else {
|
||||
while(!secondary_invoked){
|
||||
asm volatile ("nop");
|
||||
asm volatile ("nop");
|
||||
@ -92,6 +115,7 @@ void ata_wait_irq_secondary(){
|
||||
}
|
||||
|
||||
secondary_invoked = false;
|
||||
}
|
||||
}
|
||||
|
||||
static uint8_t wait_for_controller(uint16_t controller, uint8_t mask, uint8_t value, uint16_t timeout){
|
||||
@ -127,6 +151,8 @@ bool select_device(ata::drive_descriptor& drive){
|
||||
}
|
||||
|
||||
bool read_write_sector(ata::drive_descriptor& drive, uint64_t start, void* data, bool read){
|
||||
std::lock_guard<decltype(ata_lock)> lock(ata_lock);
|
||||
|
||||
//Select the device
|
||||
if(!select_device(drive)){
|
||||
return false;
|
||||
@ -324,6 +350,15 @@ void identify(ata::drive_descriptor& drive){
|
||||
} //end of anonymous namespace
|
||||
|
||||
void ata::detect_disks(){
|
||||
ata_lock.init();
|
||||
|
||||
primary_lock.init(0);
|
||||
secondary_lock.init(0);
|
||||
|
||||
ata_lock.set_name("ata_lock");
|
||||
primary_lock.set_name("ata_primary_lock");
|
||||
secondary_lock.set_name("ata_secondary_lock");
|
||||
|
||||
drives = new drive_descriptor[4];
|
||||
|
||||
drives[0] = {ATA_PRIMARY, 0xE0, false, MASTER_BIT, false, "", "", ""};
|
||||
|
Loading…
x
Reference in New Issue
Block a user