mret
lyszt.net mret और अन्य RISC-V निर्देशों को अधिक विस्तार से कवर करता है।
विवरण
mret एक ट्रैप हैंडलर से वापस लौटता है। एक ट्रैप तब होता है जब प्रोसेसर उस प्रोग्राम को रोक देता है जिसे वह चला रहा है ताकि एक हैंडलर उसका कार्यभार संभाल सके। एक हैंडलर एक निश्चित पते पर स्थित एक रूटीन है। एक डिवाइस एक इंटरप्ट उत्पन्न करता है, जैसे GPIO बोर्ड पर बटन, और वह एक ट्रैप शुरू करता है। यह नाम मशीन-मोड रिटर्न के लिए खड़ा है।
mret
जब एक ट्रैप शुरू होता है, तो प्रोसेसर बाधित निर्देश के पते को mepc में संग्रहीत करता है, कारण को mcause में रिकॉर्ड करता है, mstatus के ग्लोबल इंटरप्ट इनेबल बिट को साफ़ करता है, और mtvec में रखे हैंडलर पते पर कूद जाता है। mret इसे पूर्ववत करता है। यह प्रोग्राम काउंटर को mepc में मौजूद पते के साथ लोड करता है और उस इंटरप्ट इनेबल बिट को पुनर्स्थापित करता है जिसे mstatus ने ट्रैप की शुरुआत में सहेजा था। बाधित प्रोग्राम फिर उस निर्देश पर फिर से शुरू होता है जिसे वह चलाने वाला था।
mret कोई ऑपरेंड नहीं लेता। इसके बिना प्रोसेसर हैंडलर के अंत से आगे उस कोड में चलता रहता है जो उसके बाद आता है।
एक इंटरप्ट किन्हीं दो निर्देशों के बीच आ सकता है, और बाधित प्रोग्राम ने इसके लिए कोई तैयारी नहीं की है। इसलिए एक हैंडलर अपने द्वारा बदले गए प्रत्येक रजिस्टर को सहेजता है और mret से पहले उन्हें पुनर्स्थापित करता है।
एक बटन हैंडलर mret से पहले बटन का पेंडिंग बिट भी साफ़ करता है। यदि वह बिट सेट रहता है, तो mret के इंटरप्ट को फिर से चालू करते ही वही इंटरप्ट दोबारा उत्पन्न होता है।
उदाहरण target का पता mepc में लिखता है और mret चलाता है, जो वहाँ कूद जाता है। एक वास्तविक ट्रैप के बाहर यह अकेले जंप को दर्शाता है। CSR लिखने के लिए csrw देखें।
उदाहरण
la t0, target csrw mepc, t0 mret # pc = mepc, so execution continues at target target: nop
