assembly - गलत वापसी का पता SVC कॉल के बाद किया गया है



arm stack (0)

मैं एक कस्टम प्रोसेसर के एआरएम कॉर्टेक्स-ए 5 कोर पर काम कर रहा हूं और वास्तव में एक अजीब इकलौता अंक प्राप्त कर रहा हूं जो कि एसडब्ल्यू बिंदु दृश्य से अन्वेषनीय है। मुद्दा यह है कि किसी समय में सिस्टम पर तनाव-परीक्षण (कई बार सैकड़ों रिबूट), कभी-कभी कुछ एसवीसी कॉल से लौटने पर कभी भी प्रीफेच रद्द हो रहा है। कॉल निम्नलिखित के रूप में लागू किए गए हैं:

उपयोगकर्ता मोड कोड:

;...Stuff
    BL       foo
;.. Stuff.

foo
    PUSH     {r4,lr}
    SVC      #0x1a 
    POP      {r4,pc}

एसवीसी हैंडलर:

SVC_Handler
    PUSH     {r0-r12,lr}
    ;... Do stuff
    POP      {r0-r12,lr}
    SUBS     pc,lr,#0

जब गर्भपात हो रहा है, तो LR_USR BL foo बगल में निर्देश की तरफ इशारा कर रहा है, लेकिन LR_USR में शून्य और साथ ही r4 मूल्य हैं। तो LR_ABT पास 0x4 मान है, जो समझ में आता है अगर हम पते को शून्य करने की कोशिश करते हैं। इन टिप्पणियों को देखते हुए यह POP {r4,pc} निर्देश सही मूल्यों के बजाय स्टैक से दो शून्य ले रहा है, जो सही पदों पर स्टैक में है, जैसा कि गर्भपात के बाद डीबगर के साथ मनाया जाता है (वे दो हैं SP_USR ऊपर के शब्द)। तो ऐसा लगता है कि पॉप निर्देश होने के बाद या तो स्टैक सही मानों के साथ अपडेट किया जाता है, या POP अनुदेश सिर्फ छोटी गाड़ी है।

यह ध्यान देने योग्य है कि कोड और स्टैक कैशेबल मेमोरी में हैं यूजर मोड और एसवीसी मोड में अलग स्टैक हैं।

क्या यह प्रभाव एसडब्ल्यू बिंदु दृश्य से समझाया जा सकता है या संभवतः एक हार्डवेयर बग (मेमोरी / कैश नियंत्रक?) है। क्या किसी ने अपने करियर के समान कुछ देखा है? दुर्भाग्य से यह केवल पोस्टमार्टम को डीबग करना संभव है और कोड लिखना बग को दूसरे कॉल में स्थानांतरित कर रहा है (हां, यह हाइजेनबग है ...)