123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 |
- #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
|