Autor Thema: AHCI - HBA, mögliche Registerwerte  (Gelesen 3235 mal)

SqrT

  • Beiträge: 9
    • Profil anzeigen
Gespeichert
« am: 21. October 2013, 21:06 »
Guten Abend,
gestern habe ich mir mein OS mal wieder angesehen und wollte mal wieder ein bisschen weiter schreiben, also habe ich dort weiter gemacht, wo ich letztes mal aufgehört habe beim AHCI Treiber.
Dabei hat sich folgendes Problem herausgestellt, ich habe 3 SATA-Festplatten an den PC angeschlossen, beim auslesen der HBA Register, im speziellen das Register NP ( Number of Ports ) wird mir jedoch nur der Wert 1 , d. h. es gibt 2 Ports ausgegeben, ebenfalls enthält das Register ISS ( Interface Speed Support ) keinen von der Specifikation vorgeschriebenen Wert. Nun ist die Frage die sich mir stellt, habe ich die richtige physiche Addresse für den HBA, oder habe ich eine falsche ?

Das HBA-Register hat zwar einen Wert der zu dem Wert von Num of Ports passt ( 0x00000003 ), jedoch müsste der HBA doch mehr als 2 Ports haben und einen gültigen Wert in das Register ISS laden oder?
« Letzte Änderung: 21. October 2013, 21:25 von SqrT »

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 22. October 2013, 08:39 »
Habe eigentlich keine Ahnung von AHCI, aber hab mir gerade mal die Spec angeschaut.

Erst mal: Welche Adresse hast du denn für die HBA-Register (BAR5)

Dann: wie liehst du HBA.CAP aus und wie extrahierst du daraus NP. ( NP := HBA.CAP & 0x1f )

Von welchem HBA-Register redest du im letzten Satz? Was ist der Wert für HBA.PI?

Und was für eine AHCI Version bekommst du aus der HBA.VS
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

SqrT

  • Beiträge: 9
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 23. October 2013, 15:35 »
Entschuldigung, hatte die letzten Tage viel zu tun, deswegen kommt die Antwort erst so spät. Ich habe aus BAR5 die Addresse 0xFBB00000 bekommen, diese konnte ich mittlerweile bestätigen, da man sich im Windows Gerätemanager die physische Addresse des HBA-Controllers anschauen kann ( Geräte Manager - > IDE ATA/ATAPI-Controller - > SATA-Controller auswählen -> Eigenschaften -> Ressourcen -> und da steht die physische Addresse des HBA ). Ich schreibe mein Hobby OS in Assembler und extrahiere CAP wie folgt:

   mov esi, dword[ HBA_BAR5 ]      ; in der Variablen HBA_BAR5 steht die physische Addresse des HBA, das heißt in esi steht nun 0xFBB00000
   mov eax, dword[ esi ]               ; Lade das CAP register nach eax
   
   and eax, 0x1F                          ; Lösche die oberen Bits, behalte nur die Bits [ 04 : 00 ]
   
So bekomme ich NP heraus, also genauso wie von dir beschrieben. Das Register, welche ich im letzten Satz erwähnte war PI, d.h. Ports implemented:
                              0000 0000 0000 0000 0000 0000 0000 0011      = 0x00000003  = PI
Die Version habe ich noch nicht getestest, dies folgt aber in der nächsten Zeit. Vielleicht noch wichtig zu erwähnen ist, dass Port Multiplier unterstützt werden von meinem HBA, jedoch dachte ich das SATA-Festplatten direkt an den HBA angeschlossen sind und nicht durch einen Port Multiplier.
« Letzte Änderung: 23. October 2013, 15:43 von SqrT »

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 23. October 2013, 18:42 »
Wenn du nicht mit Segmentierung und/oder Paging die virtuelle Adresse irgendwo anders hinmappst, müsste dein Code so passen. (Caching abzuschalten ist evtl. auch eine gute Idee)

Und wenn es Port Multiplier gibt sehen die Werte doch gar nicht mehr sooo falsch aus. Das Kapitel über Port Multiplier habe ich mir jetzt allerdings nicht durchgelesen.

Was das ISS angeht, ist das natürlich auch von der passenden spec abhängig, welche werte gültig sind (wobei sich da nicht viel getan hat; 0x3 ist seit rev0.95 dazugekommen). Falls der Wert trotzdem noch nicht passt kann es natürlich auch am assembler liegen; Assembler ist ja nicht gerade dafür bekannt das es besonders übersichtlich ist:
ISS := (HBA.CAP >> 20) & 0xf
mov esi, dword[ HBA_BAR5 ]      ; in der Variablen HBA_BAR5 steht die physische Addresse des HBA, das heißt in esi steht nun 0xFBB00000
mov eax, dword[ esi ]           ; Lade das CAP register nach eax
mov edx, eax   
and eax, 0x1F                   ; EAX := NP
shr edx, 0x14
and edx, 0xf                    ; EDX := ISS
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

SqrT

  • Beiträge: 9
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 24. October 2013, 01:14 »
Vielen Dank für die Antwort  :-D ich fürchte ich habe das ISS register falsch extrahiert,  :| mein shift left war um eins zu wenig :x, na ja jetzt sind alle Werte gültig, meine Verwirrung enstand nur durch die 2 Ports, die mir angezeigt wurden, da ich dachte, dass eine am Mainboard angeschlossene SATA-Platte einen eigenen Port im HBA bekommt, scheinbar ein Irrtum :-D. Dann versuche ich mal diese Port Multiplier in den Griff zu bekommen, und hoffe dass ich bald auch im Long Mode Daten von der Festplatte lesen kann.

MfG SqrT

 

Einloggen