2016-08-09 39 views
0

Ich konnte meinen Prozessor in Hyp-Modus aus SVC-Modus mit dem Befehl hvC#0 setzen. Ich habe einige Lese- und Schreiboperationen auf HVBAR durchgeführt und möchte zurück in den Supervisor-Modus.
Ich habe versucht, die folgenden Möglichkeiten:wie zurück zu SVC-Modus von Hyp-Modus mit ELR_Hyp in Armv7

  1. die sp und lr vor dem Aufruf des hvc kopiert und wiederhergestellt sie dann nach dem Registeroperationen sind vorbei. Dann verzweigt sich der Link-Register-Wert.

    mov r5,sp; 
    mov r6,lr; 
    bx lr; 
    
  2. Ich habe auch versuchte die alte Methode, um das Link-Register direkt mit dem Programmzähler vorbei

    mov pc,lr; 
    
  3. Ich habe versucht, einen SVC-Aufruf aus dem hyp-Modus zu tun, und erwartete, dass es um den Prozessor zu ändern Zustand Supervisor-Modus

    svC#0; 
    
  4. ich habe die eret Instruktion im Ende der Registeroperationen verwendet s ee, ob es einen Effekt hat. Es hatte keine Auswirkungen.

Aber nichts davon verursachte den Prozessor den Zustand zu ändern. Nach dem Ausführen des Codes Der Modus in meinem CPSR und SPSR ist nur der nicht sichere Hypervisor-Modus.
Nach einer Literaturstudie bekam ich eine Idee, dass ich mit dem ELR_Hyp-Register arbeiten muss, da ich die Virtualisierungserweiterungen verwende. Aber ich verstehe nicht, wie man den ELR_Hyp benutzt, um vom Hyp-Modus in den Supervisor-Modus zurückzukehren.

+0

Ziemlich sicher, dass Sie eine Ausnahmeerklärung (nicht nur eine Verzweigung) benötigen, ich denke, das ist eine explizite Anweisung in ARMv7 (aber ich habe keine Zeit, dies zu überprüfen) –

+0

@achoora Könnten Sie bitte Ihren Code für die Eingabe teilen Hyp-Modus? Ich meine alle Vorbereitungen, bevor ich "hvC# 0" nennen kann. Es gibt keinen Code dafür im gesamten Internet. – Joey

+0

@Joey Sorry Alter, ich verstehe die Bedenken, aber der Code, den ich geschrieben habe, ist jetzt proprietär. Arm Architektur Referenzhandbuch hat alles, was Sie brauchen. vor allem Seite B1136. Sie müssen sich um die Stapel kümmern, wenn Sie aus den Modi zurückkehren, wenn Sie den Kontext beibehalten möchten. – achoora

Antwort

1

Das Herunterfallen vom Hyp-Modus in einen PL1-Modus ist vergleichbar mit dem Wechsel von einem PL1-Modus in den Benutzermodus; Es ist eine Ausnahmeerklärung. Der einzige Unterschied ist, dass Sie die spezifische eret instruction statt movs pc, lr und Freunde verwenden müssen.

+0

Ich habe das auch versucht. Es hatte keine Wirkung. – achoora

+0

Na dann gibt es eindeutig mehr als die Grundlagen im Spiel. Was ist der Modus in SPSR_hyp? Es könnte sein, dass Sie geschachtelte Ausnahmen machen (z. B. wird Ihre 'svc' immer noch im Hyp-Modus gemacht, und an diesem Punkt stecken Sie fest, weil Sie die vorherige ELR/SPSR überschrieben haben). Darüber hinaus impliziert die Tatsache, dass jemand in der Nähe war, um Ihren "hvc" -Aufruf zu beantworten, impliziert, dass Sie bereits einen Hypervisor laufen haben, und das ist wahrscheinlich nicht allzu glücklich darüber, dass sein Systemregister-Status durcheinander gebracht wurde. – Notlikethat

+0

Der Modus in SPSR_hyp ist auch NSHyp, d. H. Hypervisor-Modus – achoora