Autor Thema: Herausfinden, ob ein MSR implementiert ist  (Gelesen 11037 mal)

mh1962

  • Beiträge: 11
    • Profil anzeigen
Gespeichert
« am: 17. June 2019, 08:54 »
Ich bin jetzt schon zum zweiten Mal über die Frage gestolpert: Wie kann ich eigentlich herausfinden, ob ein bestimmter (beliebiger) MSR auf einem vorliegenden Prozessor implementiert ist?

Beim ersten Mal dachte ich, mach halt "rdmsr" und implementiere einen Exception-Handler. Ich hatte damals aber den Eindruck, dass ein nicht existierender MSR keine Exception auslöst (wobei ich nicht ausschließen will, dass ich damals da was falsch codiert habe und der Eindruck falsch ist). Da ich das damalige Problem dann irgendwie ganz anders gelöst habe, bin ich der Sache dann aber doch nicht weiter nachgegangen.

Jetzt stehe ich wieder vor derselben Frage.

Was ist also der richtige Weg?

mh1962

  • Beiträge: 11
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 17. June 2019, 16:50 »
Hm, ein heute durchgeführter Test scheint doch zu belegen, dass ein rdsmr mit ungültigem MSR eine Exception auslöst.

Fragt sich nur, wie ich das - konkreter heutiger Fall - in einem grub-Module am besten handhabe, denn grub2 scheint von sich aus keine Exception-Handler zu unterstützen...

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 17. June 2019, 23:43 »
Ich behaupte mal, dass das nicht zuverlässig möglich ist. Zumindest kann ich mir vorstellen, dass verschiedene Prozessoren sich da unterschiedlich verhalten. Der sinnvollste Weg dürfte daher sein, erst die CPU zu identifizieren (cpuid) und daraus abzuleiten, welche für dich relevanten MSRs existieren. Meist geht es ja darum, die MSRs passend einzustellen - die bloße Existenz ist eher wenig nützlich.

Gilt natürlich nicht, wenn du einfach mal rumprobieren und dem Prozessor seine Geheimnisse entlocken willst. :-)

mh1962

  • Beiträge: 11
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 19. June 2019, 06:44 »
Genauso habe ich jetzt auch mein konkretes Problem gelöst. War der Weg des geringsten Widerstands.

Die allgemeine Lösung gefällt mir grundsätzlich besser und es müsste auch grundsätzlich mit einem Exception Handler funktionieren.

In grub scheinen keine Exception Handler aktiv zu sein, deswegen scheint ein Zugriff auf einen nicht existierenden MSR einen Triple-Fault und somit einen Reboot auszulösen.

Interessanterweise habe ich festgestellt, dass grub im "git head" seit März die Kommandos "rdmsr" und "wrmsr" auf der grub-Kommandozeilen-Ebene implementiert. Allerdings auch ohne Exception-Handler, statt sogar als "todo" in der Source drin...

Dennoch, wenn ich mal Zeit und Lust hab, versuche ich mal einen Exception-Handler für innerhalb grub zu implementieren...

Übrigens, der Linux-Kernel implementiert folgende Lösung, die ich aber noch nicht wirklich verstanden habe:

https://github.com/torvalds/linux/blob/afe6fe7036c6efdcb46cabc64bec9b6e4a005210/arch/x86/include/asm/msr.h#L137

 

Einloggen