1

j'ai un code sur VTI qui est exécuté en mode superviseur (j'ai vérifié)

et l'instruction:

andi.w #0xF8FF, %sr

me lance une privilege violation.

j'aimerais plutot que cette ligne m'active toutes les auto-ints hehe

c'est moi qui écris n'importe quoi, ou ça devrait passer?

2

peut être que ça pourra aider.. topics/77376-jai-eu-une-idee/4

3

Adapté d'après mon gestion_primitives.s de P3S (étape 5) :[ul][li]appeler un TRAP dédié à cette modification[/li][li]on se retrouve donc avec 8 octets de plus sur la pile, qui sont, du sommet vers le bas :[ul][li]le SR actuel (word à SP)[/li][li]l'adresse de retour à l'appelant du TRAP (long à SP+2)[/li][li]l'adresse du vecteur du TRAP appelé (word à SP+6)[/li][/ul][/li][li]1re instruction de ton code TRAP : appliquer ta modification sur le SR situé sur la pile en SP fleche andi.w #0xF8FF, (%sp)[/li][li]2de instruction de ton code TRAP : appeler RTE qui va se contenter de revenir là où tu étais quand tu as appelé le TRAP... mais avec un SR modifié \o/ !!![/li][/ul]Mais bon, c'est barbare, et **il me semble** (à vérifier dans la doc 68k de Rouveyrol) que ton privilege violation vient du fait qu'un ANDI.W sur SR est interdit, même en mode superviseur, alors que le MOVE.W sur SR est autorisé (mais uniquement en superviseur), ce qui donnerait un truc du genre :

move.w %sr, %d0
andi.w #0xF8FF, %d0
move.w %d0, %sr

Ce code est vraiment à prendre avec des pincettes, je n'ai pas pratiqué depuis un an >_<"...
Quant au code barbare avec utilisation du TRAP, il **semble** me souvenir que c'est à cause du MOVE dans SR qui est interdit en mode esclave, d'où l'astuce du « je fais un TRAP pour copier SR sur la pile, je trifouille ce SR et je RTE-ise pour feinter le proc et lui faire avaler mon SR trafiqué malgré le mode esclave » (il me **semble**, j'ai bien dit !!!)
À moins que le TRAP ne fasse passer temporairement et automatiquement en mode superviseur ?
Rhâ je ne m'en souviens plus !
avatar
Je ne suis pas développeur Java : je suis artiste Java.
Ce que l’on conçoit bien s’énonce clairement, / Et le code pour l’écrire arrive aisément.
Hâtez-vous lentement ; toujours, avec méthode, / Vingt fois dans l’IDE travaillez votre code.
La perfection est atteinte, non pas lorsqu’il n’y a plus rien à ajouter, mais lorsqu’il n’y a plus rien à retirer.
You don't use science to show that you're right, you use science to become right.

4

le trap active le mode super automatiquement et c'est le seul moyen d'y parvenir, justement.

Mais alors pourquoi la page 457 de la bible montre justement que andi to SR est une instruction privilégiée? qui devrait donc passer , en mode superviseur hehe

au passage, piske t'as encore des souvenirs, je cherche pas à passer en mode utilisateur pour le démarrage de processus, mais simplement à réactiver les interruptions.

5

arf en fait non en observant avec précision le stack frame, j'ai trouvé que l'instruction qui produit mon privilege est un move USP, A0 à l'intérieur d'un TRAP, me reste juste à savoir pourquoi le code du trap s'exécute en mode utilisateur trifus

Ethaniel > Sur un 68000 le stack frame d'exception ne contient pas de vecteur number (confirmation please) , l'imagsys a un 68040 mais pas la TI.

Pen^2 > merci pour la page mais zélas ça ne m'aide pas car je ne suis pas sous tios smile

6

squalyl (./4) :
le trap active le mode super automatiquement et c'est le seul moyen d'y parvenir, justement

ben non, tu peux facilement détourner le vecteur de "illegal" (topics/77376-jai-eu-une-idee/4#97)

7

En fait n'importe quelle interruption matérielle ou logicielle passe en mode superviseur, donc on peut détourner un trap, une exception, etc.
Après dire pourquoi ça plante, là sans le code je sais pas trop hehe
avatar
Que cache le pays des Dieux ? - Forum Ghibli - Forum Littéraire

La fin d'un monde souillé est venue. L'oiseau blanc plane dans le ciel annonçant le début d'une longue ère de purification. Détachons-nous à jamais de notre vie dans ce monde de souffrance. Ô toi l'oiseau blanc, l'être vêtu de bleu, guide nous vers ce monde de pureté. - Sutra originel dork.

8

pen2>oui, évidemment, mais je n'utilise lâârgement pas ça dans mon code, j'appelle proprement des traps, et c'est tout.

Donc, y'a qc qui désactive le mode superviseur entre l'instruction TRAP et le code qui sauve USP.

Vu que le code c'est:

trap_0:
	movem.l %d1-%d7/%a0-%a6, -(%sp)		/*sauvegarder tous les registres */
	move.l	%usp, %a0			/*on a seulement le droit de faire usp<->an*/
	move.l	%a0, -(%sp)			/*sauvegarder la pile utilisateur sur la pile systeme*/
	...

	move.l	(%sp)+, %a0			/*restaurer la pile utilisateur*/
	move.l	%a0, %usp			/*on a seulement le droit de faire usp<->an*/
	movem.l (%sp)+, %d1-%d7/%a0-%a6		/*restaurer tous les registres*/

	rte	/*fin du trap zero*/


je vois pas ce qui désactive le mode superviseur en 2 instructions trifus

je pense que mon bug est ailleurs.

9

Et faire du pas à pas dans un débogueur, ça donne rien ? grin
Peut-être qu'une interruption que tu ne maîtrises pas (ou que tu crois maîtriser grin) va modifier le mode superviseur pendant que les IT sont réactivées effectivement.
avatar
Que cache le pays des Dieux ? - Forum Ghibli - Forum Littéraire

La fin d'un monde souillé est venue. L'oiseau blanc plane dans le ciel annonçant le début d'une longue ère de purification. Détachons-nous à jamais de notre vie dans ce monde de souffrance. Ô toi l'oiseau blanc, l'être vêtu de bleu, guide nous vers ce monde de pureté. - Sutra originel dork.

10

j'ai mis un breakpoint sur cette adresse, et à moment donné, le code arrive ici avec le SR à 0x0700!

ouais, il va me falloir de la patience, et me taper le pas à pas...

A priori, toutes les it non utilisées sont initialisées avec un vecteur qui pointe sur un simple RTE.

Sur TI, les auto-ints des timers, elles démarrent automatiquement dès que les IT sont démasquées? ça marche comment? C'est ptet ça en fait... sorry

11

Si tu as désactivé les IT assez longtemps pour qu'elles arrivent à échéance, si je me souviens bien effectivement elles claquent de suite.
D'expérience, activer les IT quant tu fais un changement de tâche et qu'AMS est là, c'est une mauvaise idée grin
Est-ce que ça ne peut pas venir de ton mécanisme de changement de tâches ? (sr sauvé sur la pile en mode utilisateur, changement de contexte alors que tu croyais être en superviseur, donc rétablissement sans le vouloir du mode utilisateur et paf)
avatar
Que cache le pays des Dieux ? - Forum Ghibli - Forum Littéraire

La fin d'un monde souillé est venue. L'oiseau blanc plane dans le ciel annonçant le début d'une longue ère de purification. Détachons-nous à jamais de notre vie dans ce monde de souffrance. Ô toi l'oiseau blanc, l'être vêtu de bleu, guide nous vers ce monde de pureté. - Sutra originel dork.

12

./4, ./8 > D'après ton commentaire « on a seulement le droit de faire usp<->a », on dirait bien que j'ai confondu SR et USP pour l'histoire du « AND interdit, MOVE seul autorisé » trioui...

./5 > Je ne connais pas la stack frame d'exception.
Mais pour la stack frame normale lors d'un appel TRAP, le fait d'avoir « l'adresse du vecteur du TRAP appelé (word à SP+6) » n'est, je crois, pas marqué dans la doc... mais a été vérifié sur IMAGSYS (ces 2 octets de décalage non indiqués dans la doc expliquant pourquoi je tapais sytématiquement de travers quand je fouillais la pile >_<"... vive 16xBug !).

./5, ./8 > Dans gestion_primitives.s de l'étape 6 (pas 5, cette fois), je fais :

MOVE.L %A6, -(%SP) /* Sauvegarde de A6 sur la pile maître */
MOVE.L %USP, %A6 /* Connexion à la pile esclave par A6 */

Et ça marche très bien.
Le problème doit sans doute venir d'encore ailleurs...
avatar
Je ne suis pas développeur Java : je suis artiste Java.
Ce que l’on conçoit bien s’énonce clairement, / Et le code pour l’écrire arrive aisément.
Hâtez-vous lentement ; toujours, avec méthode, / Vingt fois dans l’IDE travaillez votre code.
La perfection est atteinte, non pas lorsqu’il n’y a plus rien à ajouter, mais lorsqu’il n’y a plus rien à retirer.
You don't use science to show that you're right, you use science to become right.

13

je viens de tester sur la machine "imagsys" avec un 68040, et j'ai la meme violation sur le meme opcode, donc c'est pas un problème de ti, mais un problème d'algo tritop

je pense qu'il y a un truc à la con qui saute dans mon appel sans passer par le trap trifus

14

trisotfl
avatar
Je ne suis pas développeur Java : je suis artiste Java.
Ce que l’on conçoit bien s’énonce clairement, / Et le code pour l’écrire arrive aisément.
Hâtez-vous lentement ; toujours, avec méthode, / Vingt fois dans l’IDE travaillez votre code.
La perfection est atteinte, non pas lorsqu’il n’y a plus rien à ajouter, mais lorsqu’il n’y a plus rien à retirer.
You don't use science to show that you're right, you use science to become right.

15

bon, assez perdu de temps, je vais invoquer le pouvoir magique de "svn revert -r WORKING" triso

16

17

squalyl (./5) :
merci pour la page mais zélas ça ne m'aide pas car je ne suis pas sous tios smile.gif


18

Martial Demolins (./16) :
Ethaniel -> un stack frame de trap prend bien 6 octets, pas 8. en effet, un rte ne vire que 6 octets sur la pile superviseur, pas 8.
6 octets, c'est ce que dit la doc.
Et pourtant, ce sont bel et bien 8 octets (débuggeur pas à pas avec affichage de la RAM faisant foi) qui sont empilés/dépilés par TRAP/RTE... du moins sur la machine IMAGSYS, qui a un 68040 (d'après ./5), et peut-être d'autres spécificités que j'ai oubliées.
avatar
Je ne suis pas développeur Java : je suis artiste Java.
Ce que l’on conçoit bien s’énonce clairement, / Et le code pour l’écrire arrive aisément.
Hâtez-vous lentement ; toujours, avec méthode, / Vingt fois dans l’IDE travaillez votre code.
La perfection est atteinte, non pas lorsqu’il n’y a plus rien à ajouter, mais lorsqu’il n’y a plus rien à retirer.
You don't use science to show that you're right, you use science to become right.

19

est-ce que ça veut dire que "move sr,-(a7);bsr plop;rte;plop:" ne marche pas sur ta plateforme ?

en tout cas c'est certain que c'est faux sur 68000 de base :
- je ne vois pas qui serait chargé du dépilément : rte ? (mais à ce moment-là le code que j'ai donné ne marcherait pas) le retour en mode utilisateur ? (mais à ce moment-là ça foirerait si une interruption arrive au milieu de l'interruption)
- la table des cycles dit que rte fait seulement 4 cycles de plus que rts, et que toutes les interruptions n'écrivent que 3 mots en mémoire
Martial Demolins (./16) :
quant à ton move.l a0,-(sp), tu pourrait en faire un pea.l (a0) pour gagner deux cycles (je sais, je chipotte xD)

non, les deux font 8 cycles happy (le mode d'adressage -(an) ne coûte 2 cycles de plus que s'il est en source, pas s'il est en destination)

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

20

21

Ethaniel est un têtu qui ne veut pas comprendre que les stacks frame du 68000 de la TI sont plus courts que les stack frames du 68040 des machines imagsys de l'ensimag hehe

cherchez dans le 68kUM aux pages 6.9 et suivantes si vous me croyez pas !

22

./21 > Hem embarrassed...
Ethaniel (./12) :
[...] mais a été vérifié sur IMAGSYS [...]
Ethaniel (./18) :
[...] du moins sur la machine IMAGSYS, qui a un 68040 (d'après ./5), et peut-être d'autres spécificités que j'ai oubliées.
À part en ./3 où je ne précise pas les conditions (enfin si, je parle de P3S, mais personne ne connaît, donc forcément, pour savoir que c'est sur IMAGSYS...), je n'ai jamais marqué que ça s'appliquait à tous les 68k...

Edit pour ./23 > Je ne connais pas le 68000, donc pour une fois, je n'ai rien eu à oublier tongue.
Pourquoi crois-tu que ce topic est le *tout premier* de la catégorie Asm TI sur lequel j'interviens ?
Parce que je n'y connais pas grand-chose au 68k, ma seule expérience de la bête se limite à IMAGSYS...
avatar
Je ne suis pas développeur Java : je suis artiste Java.
Ce que l’on conçoit bien s’énonce clairement, / Et le code pour l’écrire arrive aisément.
Hâtez-vous lentement ; toujours, avec méthode, / Vingt fois dans l’IDE travaillez votre code.
La perfection est atteinte, non pas lorsqu’il n’y a plus rien à ajouter, mais lorsqu’il n’y a plus rien à retirer.
You don't use science to show that you're right, you use science to become right.

23

trigni ben ouais alors t'as oublié que le 68000 stocke pas le numéro de vecteur langue

le truc c'est que je code pas sur imagsys en ce moment, mais sur ti grin

24

25

squalyl (./8) :
pen2>oui, évidemment, mais je n'utilise lâârgement pas ça dans mon code, j'appelle proprement des traps, et c'est tout.

Donc, y'a qc qui désactive le mode superviseur entre l'instruction TRAP et le code qui sauve USP.

Vu que le code c'est:

trap_0:
	movem.l %d1-%d7/%a0-%a6, -(%sp)		/*sauvegarder tous les registres */
	move.l	%usp, %a0			/*on a seulement le droit de faire usp<->an*/
	move.l	%a0, -(%sp)			/*sauvegarder la pile utilisateur sur la pile systeme*/
	...

	move.l	(%sp)+, %a0			/*restaurer la pile utilisateur*/
	move.l	%a0, %usp			/*on a seulement le droit de faire usp<->an*/
	movem.l (%sp)+, %d1-%d7/%a0-%a6		/*restaurer tous les registres*/

	rte	/*fin du trap zero*/


je vois pas ce qui désactive le mode superviseur en 2 instructions trifus

je pense que mon bug est ailleurs.

hé hé j'ai vu ce code en vrai il y a deux jours smile
Tout ce qui passe pas par le port 80, c'est de la triche.

26

grin

bon j'ai corrigé mes bugs happy

en fait, j'avais fait plusieurs modifs simultanément, ce qui fait que je ne savais plus quelle modif a créé mon bug.
En fait c'était plutôt un souci au niveau du retour depuis le mode utilisateur.

je vais ajouter mes nouvelles fonctions petit à petit, on va voir si ça passe happy

merci pour vos conseils et vos idées. ça m'a permis de prendre un minimum de recul ^^