[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