From fc3f2f19989cefcdb0782c2302a0d8f334f3d865 Mon Sep 17 00:00:00 2001 From: kieron Date: Thu, 5 Apr 2018 09:26:20 +0000 Subject: [PATCH] Driver Management changes. git-svn-id: https://spexeah.com:8443/svn/Asuro@300 6dbc8c32-bb84-406f-8558-d1cf31a0ab0c --- src/driver/PCI.pas | 3 +- src/driver/testdriver.pas | 2 +- src/drivermanagement.pas | 102 +++++++++++++++++++++++++++----------- 3 files changed, 75 insertions(+), 32 deletions(-) diff --git a/src/driver/PCI.pas b/src/driver/PCI.pas index b2ed2267..6f20864e 100644 --- a/src/driver/PCI.pas +++ b/src/driver/PCI.pas @@ -312,7 +312,8 @@ begin console.writestring(' '); console.writehexln(device.prog_if); - drivermanagement.register_device(DevID, @device); + drivermanagement.register_device('PCI Device', DevID, @device); + kfree(void(DevID)); devices[device_count] := device; diff --git a/src/driver/testdriver.pas b/src/driver/testdriver.pas index bcbb4f55..17efff4e 100644 --- a/src/driver/testdriver.pas +++ b/src/driver/testdriver.pas @@ -25,7 +25,7 @@ begin devID.id2:= $00000000; { SUBCLASS } devID.id3:= $00000000; { PROGIF } devID.ex:= nil; { NO EXTENDED INFO } - drivermanagement.register_driver(@devID, @load); + drivermanagement.register_driver('DUMMY DRIVER', @devID, @load); end; end. \ No newline at end of file diff --git a/src/drivermanagement.pas b/src/drivermanagement.pas index fec8b613..ab5ea443 100644 --- a/src/drivermanagement.pas +++ b/src/drivermanagement.pas @@ -39,20 +39,64 @@ type PDriverRegistration = ^TDriverRegistration; TDriverRegistration = record - Identifier : TDeviceIdentifier; + Driver_Name : PChar; + Identifier : PDeviceIdentifier; Driver_Load : TDriverLoadCallback; Loaded : Boolean; Next : PDriverRegistration; end; -procedure register_driver(DeviceID : PDeviceIdentifier; Load_Callback : TDriverLoadCallback); -procedure register_device(DeviceID : PDeviceIdentifier; ptr : void); + PDeviceRegistration = ^TDeviceRegistration; + TDeviceRegistration = record + Device_Name : PChar; + Identifier : PDeviceIdentifier; + Driver_Loaded : Boolean; + Driver : PDriverRegistration; + Next : PDeviceRegistration; + end; + +procedure register_driver(Driver_Name : PChar; DeviceID : PDeviceIdentifier; Load_Callback : TDriverLoadCallback); +procedure register_device(Device_Name : PChar; DeviceID : PDeviceIdentifier; ptr : void); var Root : PDriverRegistration = nil; + Dev : PDeviceRegistration = nil; implementation +function copy_identifier(DeviceID : PDeviceIdentifier) : PDeviceIdentifier; +var + New_DevID : PDeviceIdentifier; + root_ex, + param_ex, + new_ex: PDevEx; + +begin + New_DevID:= PDeviceIdentifier(kalloc(sizeof(TDeviceIdentifier))); + New_DevID^.Bus:= DeviceID^.Bus; + New_DevID^.id0:= DeviceID^.id0; + New_DevID^.id1:= DeviceID^.id1; + New_DevID^.id2:= DeviceID^.id2; + New_DevID^.id3:= DeviceID^.id3; + root_ex:= nil; + if DeviceID^.ex <> nil then begin + root_ex:= PDevEx(kalloc(sizeof(TDevEx))); + param_ex:= DeviceID^.ex; + new_ex:= root_ex; + new_ex^.idN:= param_ex^.idN; + new_ex^.ex:= nil; + param_ex:= param_ex^.ex; + while param_ex <> nil do begin + new_ex^.ex:= PDevEx(kalloc(sizeof(TDevEx))); + new_ex:= new_ex^.ex; + new_ex^.idN:= param_ex^.idN; + param_ex:= param_ex^.ex; + end; + end; + New_DevID^.ex:= root_ex; + copy_identifier:= New_DevID; +end; + function identifiers_match(i1, i2 : PDeviceIdentifier) : boolean; var ll1, ll2 : PDevEx; @@ -83,37 +127,16 @@ begin end; end; -procedure register_driver(DeviceID : PDeviceIdentifier; Load_Callback : TDriverLoadCallback); +procedure register_driver(Driver_Name : PChar; DeviceID : PDeviceIdentifier; Load_Callback : TDriverLoadCallback); var - NewReg : PDriverRegistration; - root_ex, - param_ex, new_ex: PDevEx; + NewReg : PDriverRegistration; RegList : PDriverRegistration; begin if DeviceID = nil then exit; NewReg:= PDriverRegistration(kalloc(sizeof(TDriverRegistration))); - NewReg^.Identifier.Bus:= DeviceID^.Bus; - NewReg^.Identifier.id0:= DeviceID^.id0; - NewReg^.Identifier.id1:= DeviceID^.id1; - NewReg^.Identifier.id2:= DeviceID^.id2; - NewReg^.Identifier.id3:= DeviceID^.id3; - root_ex:= nil; - if DeviceID^.ex <> nil then begin - root_ex:= PDevEx(kalloc(sizeof(TDevEx))); - param_ex:= DeviceID^.ex; - new_ex:= root_ex; - new_ex^.idN:= param_ex^.idN; - new_ex^.ex:= nil; - param_ex:= param_ex^.ex; - while param_ex <> nil do begin - new_ex^.ex:= PDevEx(kalloc(sizeof(TDevEx))); - new_ex:= new_ex^.ex; - new_ex^.idN:= param_ex^.idN; - param_ex:= param_ex^.ex; - end; - end; - NewReg^.Identifier.ex:= root_ex; + NewReg^.Driver_Name:= stringCopy(Driver_Name); + NewReg^.Identifier:= copy_identifier(DeviceID); NewReg^.Loaded:= false; NewReg^.Driver_Load:= Load_Callback; NewReg^.Next:= nil; @@ -128,21 +151,40 @@ begin end; end; -procedure register_device(DeviceID : PDeviceIdentifier; ptr : void); +procedure register_device(Device_Name : PChar; DeviceID : PDeviceIdentifier; ptr : void); var drv : PDriverRegistration; + new_dev : PDeviceRegistration; + dev_list : PDeviceRegistration; begin drv:= Root; + new_dev:= PDeviceRegistration(kalloc(sizeof(TDeviceRegistration))); + new_dev^.Device_Name:= stringCopy(Device_Name); + new_dev^.Identifier:= copy_identifier(DeviceID); + new_dev^.Driver_Loaded:= false; + new_dev^.Driver:= nil; + new_dev^.next:= nil; while drv <> nil do begin - if identifiers_match(@drv^.Identifier, DeviceID) then begin + if identifiers_match(drv^.Identifier, DeviceID) then begin if drv^.Driver_Load(ptr) then begin drv^.Loaded:= true; + new_dev^.Driver_Loaded:= true; + new_dev^.Driver:= drv; exit; end; end; drv:= drv^.Next; end; + if Dev = nil then begin + Dev:= new_dev; + end else begin + dev_list:= Dev; + While dev_list^.Next <> nil do begin + dev_list:= dev_list^.Next; + end; + dev_list^.Next:= new_dev; + end; end; end. \ No newline at end of file