[Kos-dev] LBA qui marche !

kos-dev@enix.org kos-dev@enix.org
14 Feb 2002 10:20:40 +0100


Salut,

Ca y est enfin, ca fait une semaine que j'etais dessus, mais j'ai
enfin trouve pourquoi ce foutu LBA ne fonctionnait pas !

En fait (comme d'habitude) c'est un bug vraiment, mais alors vraiment
tout con : pour l'envoi de la valeur sur le port Drive Register (qui
doit contenir la tete, et aussi un bit indiquant si on veut du LBA ou
non), je faisais ca :

outb(ATA_D_IBM
     =A6 (harddisk->device =3D=3D MASTER) ? ATA_MASTER : ATA_SLAVE
     | head,=20
     ctrl->ioaddr + ATA_DRIVE);

Ce qui me semblait correct. Mais en fait l'operateur | est prioritaire
devant l'operateur ? et :, donc au lieu de parentheser comme ca (comme
je voulais) :

ATA_D_IBM | ((harddisk->device =3D=3D MASTER) ? ATA_MASTER : ATA_SLAVE)=
 |
head

La parenthesation se faisait comme ca :

(ATA_D_IBM | (harddisk->device =3D=3D MASTER)) ? ATA_MASTER : (ATA_SLAV=
E |
head)

or ATA_D_IBM =3D=3D 0xa0 !=3D 0, donc equivaut =E0 vrai.

La condition etait donc toujours verifiee, et on envoyait toujours
ATA_MASTER (soit 0) dans ce port la !

Donc en fait meme en CHS c'etait bugge : pour un cylindre donne, et un
secteur donne, je pouvais demander n'importe quelle tete, j'avais tout
le temps le meme secteur. C'est ca qui m'a mis la puce a
l'oreille. Pour l'instant je m'en etais pas rendu compte parce que les
infos sur les partitions sont toujours en debut de cylindre
(head=3D0). Mais des que j'ai commence a travailler sur la FAT ca s'est
vu !

Voila ca m'apprendra a vouloir jouer au
mega-programmeur-d'OS-qui-fait-des-expressions-de-la-mort-ki-tue !

Bonne journee,

Thomas
--=20
PETAZZONI Thomas - thomas.petazzoni@enix.org - UIN : 34937744
(Perso)      http://www.enix.org/~thomas/
(KOS)        http://kos.enix.org/=20
(Club LinUT) http://club-linut.enix.org