2010-12-17 3 views
2

J'ai la fonction autonome suivante (c'est-à-dire qu'elle est ramifiée à l'aide bl CheckStackFunc) et je suis mystifié quant à son but. Quelqu'un de familier avec l'assemblage PowerPC pourrait-il donner un coup de main?Que fait cet assemblage PPC de vérification de pile?

_CheckStackFunc: 
    neg  %r11, %r12 
    addi %r0, %r11, 0xFFF 
    srawi. %r0, %r0, 0xC 
    blelr 
    mr  %r11, %sp 
    mtctr %r0 
loc_10176B0C:       
    lwzu %r0, -0x1000(%r11) 
    bdnz loc_10176B0C 
    blr 

Cela dit, je me sers this documents par IBM pour ma référence d'assemblage de PPC. Est-ce considéré comme la source définitive ou y en a-t-il d'autres que je devrais connaître?

Répondre

3

Je ne connais pas du tout avec PPC, mais voici ma conjecture:

Il ressemble à alloca_probe() pour moi. Le code touche la pile avec les étapes d'une page afin qu'il déclenche les exceptions PAGE_GUARD. (Veuillez excuser mon langage x86 :))

Il est utilisé après une grande allocation de pile (qui peut également être effectuée par alloca). La pile ne dispose généralement pas de toute la mémoire réservée pour la pile allouée, la dernière page réellement chargée possède un indicateur spécial, PAGE_GUARD, qui déclenche une exception matérielle interceptée par le système d'exploitation, afin de pouvoir valider davantage de pages sur la pile. Lorsque la pile est utilisée normalement (avec push/pop), cette page ne peut pas être ignorée. Cependant, pour les allocs plus grands, un appel à alloca_probe() est requis avant que la mémoire puisse être utilisée en toute sécurité.

+0

Brillant, on dirait que c'est exactement ce que c'est. Merci pour cette réponse rapide - et d'élaborer à ce sujet. Très apprécié. –

+0

De rien. J'ai passé du temps avec 'alloca_probe' une fois :) – ruslik

Questions connexes