.file "physmap.c" .section .rodata.str1.1,"aMS",@progbits,1 .LC0: .string "No MSR initialized.\n" .text .globl cleanup_cpu_msr .type cleanup_cpu_msr, @function cleanup_cpu_msr: pushl %ebp movl %esp, %ebp subl $8, %esp movl fd_msr, %eax cmpl $-1, %eax jne .L2 pushl %eax pushl %eax pushl $.LC0 pushl $1 call print jmp .L5 .L2: subl $12, %esp pushl %eax call close movl $-1, fd_msr .L5: addl $16, %esp leave ret .size cleanup_cpu_msr, .-cleanup_cpu_msr .section .rodata.str1.1 .LC1: .string "Could not lseek() to MSR" .LC2: .string "Could not write() MSR" .text .globl wrmsr .type wrmsr, @function wrmsr: pushl %ebp movl %esp, %ebp subl $12, %esp pushl $0 pushl 8(%ebp) pushl fd_msr call lseek addl $16, %esp incl %eax jne .L8 subl $12, %esp pushl $.LC1 jmp .L13 .L8: pushl %ecx pushl $8 leal 12(%ebp), %eax pushl %eax pushl fd_msr call write addl $16, %esp cmpl $8, %eax je .L9 call __errno_location cmpl $5, (%eax) je .L9 subl $12, %esp pushl $.LC2 .L13: call perror popl %edx pushl fd_msr call close movl $1, (%esp) call exit .L9: call __errno_location cmpl $5, (%eax) setne %al movzbl %al, %eax decl %eax leave ret .size wrmsr, .-wrmsr .section .rodata.str1.1 .LC3: .string "Could not read() MSR" .text .globl rdmsr .type rdmsr, @function rdmsr: pushl %ebp movl %esp, %ebp pushl %ebx subl $24, %esp movl 8(%ebp), %ebx pushl $0 pushl 12(%ebp) pushl fd_msr call lseek addl $16, %esp incl %eax jne .L15 subl $12, %esp pushl $.LC1 jmp .L20 .L15: pushl %eax pushl $8 leal -16(%ebp), %eax pushl %eax pushl fd_msr call read addl $16, %esp cmpl $8, %eax jne .L16 movl -16(%ebp), %eax movl %eax, 4(%ebx) movl -12(%ebp), %eax movl %eax, (%ebx) jmp .L14 .L16: call __errno_location cmpl $5, (%eax) je .L18 subl $12, %esp pushl $.LC3 .L20: call perror popl %ebx pushl fd_msr call close movl $1, (%esp) call exit .L18: movl $-1, 4(%ebx) movl $-1, (%ebx) .L14: movl %ebx, %eax movl -4(%ebp), %ebx leave ret $4 .size rdmsr, .-rdmsr .section .rodata.str1.1 .LC4: .string "Not unmapping zero size at %p\n" .text .globl physunmap .type physunmap, @function physunmap: pushl %ebp movl %esp, %ebp subl $8, %esp movl 8(%ebp), %eax movl 12(%ebp), %edx testl %edx, %edx jne .L22 pushl %edx pushl %eax pushl $.LC4 pushl $3 call print addl $16, %esp leave ret .L22: movl %edx, 12(%ebp) movl %eax, 8(%ebp) leave jmp munmap .size physunmap, .-physunmap .section .rodata.str1.1 .LC5: .string "/dev/mem" .LC6: .string "Critical error: open(/dev/mem): %s" .text .globl sys_physmap_ro_cached .type sys_physmap_ro_cached, @function sys_physmap_ro_cached: pushl %ebp movl %esp, %ebp subl $8, %esp cmpl $-1, fd_mem_cached jne .L26 pushl %eax pushl %eax pushl $2 pushl $.LC5 call open movl %eax, fd_mem_cached addl $16, %esp incl %eax jne .L26 call __errno_location subl $12, %esp pushl (%eax) call strerror addl $12, %esp pushl %eax pushl $.LC6 pushl $0 call print movl $2, (%esp) call exit .L26: pushl %ecx pushl %ecx pushl 8(%ebp) pushl fd_mem_cached pushl $1 pushl $1 pushl 12(%ebp) pushl $0 call mmap addl $32, %esp xorl %edx, %edx cmpl $-1, %eax setne %dl negl %edx andl %edx, %eax leave ret .size sys_physmap_ro_cached, .-sys_physmap_ro_cached .section .rodata.str1.1 .LC7: .string "Critical error: open(/dev/mem)" .text .globl sys_physmap_rw_uncached .type sys_physmap_rw_uncached, @function sys_physmap_rw_uncached: pushl %ebp movl %esp, %ebp subl $8, %esp cmpl $-1, fd_mem jne .L30 pushl %ecx pushl %ecx pushl $4098 pushl $.LC5 call open movl %eax, fd_mem addl $16, %esp incl %eax jne .L30 subl $12, %esp pushl $.LC7 call perror movl $2, (%esp) call exit .L30: pushl %edx pushl %edx pushl 8(%ebp) pushl fd_mem pushl $1 pushl $3 pushl 12(%ebp) pushl $0 call mmap addl $32, %esp xorl %edx, %edx cmpl $-1, %eax setne %dl negl %edx andl %edx, %eax leave ret .size sys_physmap_rw_uncached, .-sys_physmap_rw_uncached .section .rodata.str1.1 .LC8: .string "Not mapping %s, zero size at 0x%08lx.\n" .LC9: .string "Mapping %s at 0x%08lx, unaligned size 0x%lx.\n" .LC10: .string "Mapping %s, 0x%lx bytes at unaligned 0x%08lx.\n" .LC11: .string "memory" .LC12: .string "Error accessing %s, 0x%lx bytes at 0x%08lx\n" .LC13: .string "/dev/mem mmap failed" .LC14: .string "In Linux this error can be caused by the CONFIG_NONPROMISC_DEVMEM (<2.6.27),\n" .LC15: .string "CONFIG_STRICT_DEVMEM (>=2.6.27) and CONFIG_X86_PAT kernel options.\n" .LC16: .string "Please check if either is enabled in your kernel before reporting a failure.\n" .LC17: .string "You can override CONFIG_X86_PAT at boot with the nopat kernel parameter but\n" .LC18: .string "disabling the other option unfortunately requires a kernel recompile. Sorry!\n" .text .globl physmap_common .type physmap_common, @function physmap_common: pushl %ebp movl %esp, %ebp pushl %edi pushl %esi pushl %ebx subl $28, %esp movl 8(%ebp), %edi movl 12(%ebp), %esi movl 16(%ebp), %ebx testl %ebx, %ebx jne .L34 pushl %esi pushl %edi pushl $.LC8 pushl $3 call print xorl %edx, %edx addl $16, %esp jmp .L35 .L34: call getpagesize decl %eax movl %eax, -28(%ebp) testl %ebx, %eax je .L36 subl $12, %esp pushl %ebx pushl %esi pushl %edi pushl $.LC9 pushl $0 call print addl $32, %esp .L36: testl %esi, -28(%ebp) je .L37 subl $12, %esp pushl %esi pushl %ebx pushl %edi pushl $.LC10 pushl $0 call print addl $32, %esp .L37: cmpl $0, 24(%ebp) je .L38 pushl %edx pushl %edx pushl %ebx pushl %esi call sys_physmap_ro_cached jmp .L43 .L38: pushl %eax pushl %eax pushl %ebx pushl %esi call sys_physmap_rw_uncached .L43: movl %eax, %edx addl $16, %esp testl %eax, %eax jne .L35 testl %edi, %edi jne .L40 movl $.LC11, %edi .L40: subl $12, %esp pushl %esi pushl %ebx pushl %edi pushl $.LC12 pushl $0 movl %edx, -32(%ebp) call print addl $20, %esp pushl $.LC13 call perror call __errno_location addl $16, %esp cmpl $22, (%eax) movl -32(%ebp), %edx jne .L41 pushl %edi pushl %edi pushl $.LC14 pushl $0 call print popl %ebx popl %esi pushl $.LC15 pushl $0 call print popl %edx popl %ecx pushl $.LC16 pushl $0 call print popl %edi popl %eax pushl $.LC17 pushl $0 call print popl %ebx popl %esi pushl $.LC18 pushl $0 call print addl $16, %esp movl -32(%ebp), %edx .L41: cmpl $0, 20(%ebp) jne .L35 subl $12, %esp pushl $3 call exit .L35: movl %edx, %eax leal -12(%ebp), %esp popl %ebx popl %esi popl %edi popl %ebp ret .size physmap_common, .-physmap_common .globl physmap_try_ro .type physmap_try_ro, @function physmap_try_ro: pushl %ebp movl %esp, %ebp subl $20, %esp pushl $1 pushl $1 pushl 16(%ebp) pushl 12(%ebp) pushl 8(%ebp) call physmap_common leave ret .size physmap_try_ro, .-physmap_try_ro .globl physmap .type physmap, @function physmap: pushl %ebp movl %esp, %ebp subl $20, %esp pushl $0 pushl $0 pushl 16(%ebp) pushl 12(%ebp) pushl 8(%ebp) call physmap_common leave ret .size physmap, .-physmap .section .rodata.str1.1 .LC19: .string "/dev/cpu/%d/msr" .LC20: .string "MSR was already initialized\n" .LC21: .string "Error while opening /dev/cpu/0/msr" .LC22: .string "Did you run 'modprobe msr'?\n" .text .globl setup_cpu_msr .type setup_cpu_msr, @function setup_cpu_msr: pushl %ebp movl %esp, %ebp pushl %edi pushl %ebx subl $76, %esp cld leal -72(%ebp), %ebx movl $16, %ecx xorl %eax, %eax movl %ebx, %edi rep stosl pushl 8(%ebp) pushl $.LC19 pushl $64 pushl $1 pushl %ebx call __sprintf_chk addl $32, %esp cmpl $-1, fd_msr je .L49 pushl %eax pushl %eax pushl $.LC20 jmp .L53 .L49: pushl %edi pushl %edi pushl $2 pushl %ebx call open movl %eax, %edx movl %eax, fd_msr addl $16, %esp xorl %eax, %eax testl %edx, %edx jns .L50 subl $12, %esp pushl $.LC21 call perror popl %ecx popl %ebx pushl $.LC22 .L53: pushl $1 call print orl $-1, %eax addl $16, %esp .L50: leal -8(%ebp), %esp popl %ebx popl %edi popl %ebp ret .size setup_cpu_msr, .-setup_cpu_msr .data .align 4 .type fd_msr, @object .size fd_msr, 4 fd_msr: .long -1 .align 4 .type fd_mem_cached, @object .size fd_mem_cached, 4 fd_mem_cached: .long -1 .align 4 .type fd_mem, @object .size fd_mem, 4 fd_mem: .long -1 .ident "GCC: (Gentoo 4.4.3 p1.0) 4.4.3" .section .note.GNU-stack,"",@progbits