Avec la version Buster et le container 64 bits que j’utilise,
je n’ai pas pu faire fonctionner les accès au GPIO car il manque la description
des peripheriques /dev/mem et /dev/gpiomem. Ces périphériques sont necessaires
car Linux interdit les accès directs aux registres du gpio. En attendant qu’une
version de Buster corrige ces problèmes, je vous propose de voir les lectures/écritures
des fichiers en assembleur 64 bits.
Dans le programme lectfic1.s nous effectuons l’ouverture et
la lecture d’un fichier simple. Pour cela il nous faut rechercher le code de l’appel
système linux Open mais hélas qui n’existe pas en 64 bits. Il faut se rabattre
sur le code OPENAT valeur 56 mais qui necessite une adaptation par rapport à l’Open
32 bits. Il faut transmettre dans le registre x0, une constante AT_FDCWD pour
indiquer que le nom du fichier (avec son répertoire) s’effectuera à partir du
répertoire courant. Ceci implique que nous ne pouvons pas ouvrir des fichiers
avec un nom fixe partant de la racine comme /home/pi/toto.txt. Par contre, nous
ouvrirons un fichier de la forme ../../rep1/rep2/toto.txt. Il doit y avoir une
solution mais je n’ai pas encore trouvé.
Ensuite la lecture (code 63) et la fermeture (code 57) du
fichier ne posent aucun problème
Le programme ecritfic2.s monte l’écriture dans un fichier. La
seule petite difficulté provient de l’attribution des droits lors de l’ouverture
du fichier. En effet il faut préciser dans le paramètre mode le masque à
attribuer. La documentation sur les droits indique par exemple qu’il faut
mettre 644 pour autoriser le propriétaire à lire et à écrire sur le fichier
ainsi crée et les autres ne sont autorisés qu’en lecture. Sauf que ce code doit
être mis en octal sinon les résultats sont bizarroïdes et donc il doit être
écrit 0644 (avec un zéro devant !!) pour que l’assembleur as le comprenne.
Le programme lectecrfic.s reprend l’exemple donné au
chapitre 8 de ce blog et écrit en assembleur 32 bits. Ici je l’ai adapté pour
le 64 bits. Cette adaptation m’a permis de dresser une liste des opérations à
effectuer pour passer d’un programme ARM 32 bits à 64 bits :
Changer le symbole des
commentaires : @ -> //
Modifier tous les registres r en x
Remplacer tous les push et pop par des stp, str ldp ldr.
Remplacer le r7 par x8 pour les call system
Remplacer swi par svc pour les call system
Vérifier le passage des paramètres pour les call system (x0
à x7 puis les autres sur la pile).
Remplacer les .int par des .quad pour les définitions
d’adresse
Vérifier et modifier les descriptions de données dans la
.data et la .bss
Changer le nom du fichier des constantes et celui des
macros.
Changer les instructions conditionnelles : moveq par exemple
Modifier les instructions de type add x1,#1 en add x1,x1,1
Modifier les déplacements:
lsl x1,#2 en lsl x1,x1,2
Aucun commentaire:
Enregistrer un commentaire