summaryrefslogtreecommitdiff
path: root/apps/plugins/sdl/progs/quake/dosasm.S
diff options
context:
space:
mode:
Diffstat (limited to 'apps/plugins/sdl/progs/quake/dosasm.S')
-rw-r--r--apps/plugins/sdl/progs/quake/dosasm.S77
1 files changed, 77 insertions, 0 deletions
diff --git a/apps/plugins/sdl/progs/quake/dosasm.S b/apps/plugins/sdl/progs/quake/dosasm.S
new file mode 100644
index 0000000..2633be9
--- /dev/null
+++ b/apps/plugins/sdl/progs/quake/dosasm.S
@@ -0,0 +1,77 @@
+#include "asm_i386.h"
+
+.data
+fpenv: .long 0, 0, 0, 0, 0, 0, 0, 0
+
+.text
+.globl C(StartMSRInterval)
+C(StartMSRInterval):
+ movl $0x11,%ecx // read the CESR
+ .byte 0x0F
+ .byte 0x32 // RDMSR
+
+ andl $0xFE3FFE3F,%eax // stop both counters
+ .byte 0x0F
+ .byte 0x30 // WRMSR
+
+ movl 4(%esp),%eax // point counter 0 to desired event, with counters
+ andl $0x3F,%eax // still stopped
+ movl $0x11,%ecx
+ .byte 0x0F
+ .byte 0x30 // WRMSR
+
+ movl $0x12,%ecx // set counter 0 to the value 0
+ subl %eax,%eax
+ subl %edx,%edx
+ .byte 0x0F
+ .byte 0x30 // WRMSR
+
+ movl 4(%esp),%eax // restart counter 0 with selected event
+ andl $0x3F,%eax
+ subl %edx,%edx
+ orl $0xC0,%eax
+ movl $0x11,%ecx // control and event select
+ .byte 0x0F
+ .byte 0x30 // WRMSR
+
+ ret
+
+.globl C(EndMSRInterval)
+C(EndMSRInterval):
+ movl $0x12,%ecx // counter 0
+ .byte 0x0F
+ .byte 0x32 // RDMSR
+
+ ret // lower 32 bits of count in %eax
+
+#if 0
+ .data
+Lxxx: .long 0
+
+ .text
+
+.globl C(setstackcheck)
+C(setstackcheck):
+
+ movl %esp,%eax
+ subl $0x38000,%eax
+ movl $0x5A5A5A5A,(%eax)
+ movl %eax,Lxxx
+
+ ret
+
+
+.globl C(dostackcheck)
+C(dostackcheck):
+
+ movl Lxxx,%edx
+ movl $0,%eax
+
+ cmpl $0x5A5A5A5A,(%edx)
+ jz qqq
+ incl %eax
+qqq:
+
+ ret
+#endif
+