On 11/15/2010 07:08 PM, Linus Torvalds wrote:
> On Mon, Nov 15, 2010 at 9:40 AM, Jim Bos <jim...@xs4all.nl> wrote:
>>
>> Hmm, that doesn't work.
>>
>> [ Not sure if you read to whole thread but initial workaround was to
>> change the asm(..) to asm volatile(..) which did work. ]
> 
> Since I have a different gcc than yours (and I'm not going to compile
> my own), have you posted your broken .s file anywhere? In fact, with
> the noinline (and the removal of the "+m" thing - iow just the patch
> you tried), what does just the "i8k_smm" function assembly look like
> for you after you've done a "make drivers/char/i8k.s"?
> 
> If the asm just doesn't exist AT ALL, that's just odd. Because every
> single call-site of i8k_smm() clearly looks at the return value. So
> the volatile really shouldn't make any difference from that
> standpoint. Odd.
> 
>                        Linus
> 

Attached version with plain 2.6.36 source and version with the committed
patch, i.e with the '"+m" (*regs)'


_
Jim


        .file   "i8k.c"
# GNU C (GCC) version 4.5.1 (i486-slackware-linux)
#       compiled by GNU C version 4.5.1, GMP version 5.0.1, MPFR version 
2.4.2-p3, MPC version 0.8.2
# GGC heuristics: --param ggc-min-expand=81 --param ggc-min-heapsize=96817
# options passed:  -nostdinc -I/usr/src/linux-2.6.36/arch/x86/include
# -Iinclude -D__KERNEL__ -DCONFIG_AS_CFI=1 -DCONFIG_AS_CFI_SIGNAL_FRAME=1
# -DCONFIG_AS_CFI_SECTIONS=1 -DMODULE -DKBUILD_STR(s)=#s
# -DKBUILD_BASENAME=KBUILD_STR(i8k) -DKBUILD_MODNAME=KBUILD_STR(i8k)
# -isystem /usr/lib/gcc/i486-slackware-linux/4.5.1/include -include
# include/generated/autoconf.h -MD drivers/char/.i8k.s.d drivers/char/i8k.c
# -m32 -msoft-float -mregparm=3 -mpreferred-stack-boundary=2 -march=i686
# -mtune=pentium3 -mtune=generic -mno-sse -mno-mmx -mno-sse2 -mno-3dnow
# -auxbase-strip drivers/char/i8k.s -Os -Wall -Wundef -Wstrict-prototypes
# -Wno-trigraphs -Werror-implicit-function-declaration -Wno-format-security
# -Wno-sign-compare -Wframe-larger-than=1024 -Wdeclaration-after-statement
# -Wno-pointer-sign -fno-strict-aliasing -fno-common
# -fno-delete-null-pointer-checks -freg-struct-return -ffreestanding
# -fno-asynchronous-unwind-tables -fno-stack-protector -fomit-frame-pointer
# -fno-strict-overflow -fconserve-stack -fverbose-asm
# options enabled:  -falign-loops -fargument-alias -fauto-inc-dec
# -fbranch-count-reg -fcaller-saves -fcprop-registers -fcrossjumping
# -fcse-follow-jumps -fdefer-pop -fdwarf2-cfi-asm -fearly-inlining
# -feliminate-unused-debug-types -fexpensive-optimizations
# -fforward-propagate -ffunction-cse -fgcse -fgcse-lm
# -fguess-branch-probability -fident -fif-conversion -fif-conversion2
# -findirect-inlining -finline -finline-functions
# -finline-functions-called-once -finline-small-functions -fipa-cp
# -fipa-pure-const -fipa-reference -fipa-sra -fira-share-save-slots
# -fira-share-spill-slots -fivopts -fkeep-static-consts
# -fleading-underscore -fmath-errno -fmerge-constants -fmerge-debug-strings
# -fmove-loop-invariants -fomit-frame-pointer -foptimize-register-move
# -foptimize-sibling-calls -fpeephole -fpeephole2 -freg-struct-return
# -fregmove -freorder-blocks -freorder-functions -frerun-cse-after-loop
# -fsched-critical-path-heuristic -fsched-dep-count-heuristic
# -fsched-group-heuristic -fsched-interblock -fsched-last-insn-heuristic
# -fsched-rank-heuristic -fsched-spec -fsched-spec-insn-heuristic
# -fsched-stalled-insns-dep -fschedule-insns2 -fshow-column -fsigned-zeros
# -fsplit-ivs-in-unroller -fsplit-wide-types -fthread-jumps
# -ftoplevel-reorder -ftrapping-math -ftree-builtin-call-dce -ftree-ccp
# -ftree-ch -ftree-copy-prop -ftree-copyrename -ftree-cselim -ftree-dce
# -ftree-dominator-opts -ftree-dse -ftree-forwprop -ftree-fre
# -ftree-loop-im -ftree-loop-ivcanon -ftree-loop-optimize
# -ftree-parallelize-loops= -ftree-phiprop -ftree-pre -ftree-pta
# -ftree-reassoc -ftree-scev-cprop -ftree-sink -ftree-slp-vectorize
# -ftree-sra -ftree-switch-conversion -ftree-ter -ftree-vect-loop-version
# -ftree-vrp -funit-at-a-time -fvect-cost-model -fverbose-asm
# -fzero-initialized-in-bss -m32 -m96bit-long-double -malign-stringops
# -mfused-madd -mglibc -mieee-fp -mno-fancy-math-387 -mno-red-zone
# -mno-sse4 -mpush-args -msahf -mtls-direct-seg-refs

# Compiler executable checksum: 7ba2dc3c015559b9d16b297ee7f8d354

        .text
        .type   i8k_smm, @function
i8k_smm:
        pushl   %ebp    #
        movl    %eax, %ebp      # regs, regs
        pushl   %edi    #
        pushl   %esi    #
        pushl   %ebx    #
        subl    $8, %esp        #,
        movl    (%eax), %eax    # regs_2(D)->eax,
        movl    %eax, 4(%esp)   #, %sfp
        movl    %ebp, %eax      # regs,
#APP
# 148 "drivers/char/i8k.c" 1
        pushl %eax
        movl 0(%eax),%edx
        push %edx
        movl 4(%eax),%ebx
        movl 8(%eax),%ecx
        movl 12(%eax),%edx
        movl 16(%eax),%esi
        movl 20(%eax),%edi
        popl %eax
        out %al,$0xb2
        out %al,$0x84
        xchgl %eax,(%esp)
        movl %ebx,4(%eax)
        movl %ecx,8(%eax)
        movl %edx,12(%eax)
        movl %esi,16(%eax)
        movl %edi,20(%eax)
        popl %edx
        movl %edx,0(%eax)
        lahf
        shrl $8,%eax
        andl $1,%eax

# 0 "" 2
#NO_APP
        testl   %eax, %eax      #
        movl    $-22, %edx      #, D.15130
        movl    %eax, (%esp)    #, %sfp
        jne     .L2     #,
        movl    0(%ebp), %ecx   # regs_2(D)->eax, D.15123
        cmpw    $-1, %cx        #, D.15123
        je      .L2     #,
        cmpl    4(%esp), %ecx   # %sfp, D.15123
        cmovne  %eax, %edx      #,, D.15130
.L2:
        addl    $8, %esp        #,
        movl    %edx, %eax      # D.15130,
        popl    %ebx    #
        popl    %esi    #
        popl    %edi    #
        popl    %ebp    #
        ret
        .size   i8k_smm, .-i8k_smm
        .type   i8k_get_bios_version, @function
i8k_get_bios_version:
        pushl   %edi    #
        xorl    %eax, %eax      # tmp61
        subl    $24, %esp       #,
        movl    $6, %ecx        #, tmp62
        movl    %esp, %edi      #, tmp60
        rep stosl
        movl    %esp, %eax      #, tmp63
        movl    $166, (%esp)    #, regs.eax
        call    i8k_smm #
        movl    $166, %edx      #, tmp65
        testl   %eax, %eax      # D.15225
        cmove   %edx, %eax      # D.15225,, tmp65, D.15225
        addl    $24, %esp       #,
        popl    %edi    #
        ret
        .size   i8k_get_bios_version, .-i8k_get_bios_version
        .type   i8k_get_fn_status, @function
i8k_get_fn_status:
        pushl   %edi    #
        movl    $6, %ecx        #, tmp63
        pushl   %ebx    #
        xorl    %ebx, %ebx      # tmp62
        subl    $24, %esp       #,
        movl    %ebx, %eax      # tmp62,
        movl    %esp, %edi      #, tmp61
        rep stosl
        movl    %esp, %eax      #, tmp64
        movl    $37, (%esp)     #, regs.eax
        call    i8k_smm #
        testl   %eax, %eax      # rc
        cmovg   %ebx, %eax      # rc,, tmp62, tmp65
        addl    $24, %esp       #,
        popl    %ebx    #
        popl    %edi    #
        ret
        .size   i8k_get_fn_status, .-i8k_get_fn_status
        .type   i8k_get_power_status, @function
i8k_get_power_status:
        pushl   %edi    #
        movl    $6, %ecx        #, tmp63
        pushl   %ebx    #
        xorl    %ebx, %ebx      # tmp62
        subl    $24, %esp       #,
        movl    %ebx, %eax      # tmp62,
        movl    %esp, %edi      #, tmp61
        rep stosl
        movl    %esp, %eax      #, tmp64
        movl    $105, (%esp)    #, regs.eax
        call    i8k_smm #
        testl   %eax, %eax      # rc
        cmovg   %ebx, %eax      # rc,, tmp62, tmp65
        addl    $24, %esp       #,
        popl    %ebx    #
        popl    %edi    #
        ret
        .size   i8k_get_power_status, .-i8k_get_power_status
        .type   i8k_get_fan_status, @function
i8k_get_fan_status:
        pushl   %edi    #
        movl    %eax, %edx      # fan, fan
        subl    $24, %esp       #,
        xorl    %eax, %eax      # tmp64
        movl    %esp, %edi      #, tmp63
        movl    $6, %ecx        #, tmp65
        rep stosl
        andl    $255, %edx      #, tmp66
        movl    %esp, %eax      #, tmp67
        movl    %edx, 4(%esp)   # tmp66, regs.ebx
        movl    $163, (%esp)    #, regs.eax
        call    i8k_smm #
        movl    $163, %edx      #, tmp69
        testl   %eax, %eax      # D.15134
        cmove   %edx, %eax      # D.15134,, tmp69, D.15134
        addl    $24, %esp       #,
        popl    %edi    #
        ret
        .size   i8k_get_fan_status, .-i8k_get_fan_status
        .type   i8k_get_fan_speed, @function
i8k_get_fan_speed:
        pushl   %edi    #
        movl    %eax, %edx      # fan, fan
        subl    $24, %esp       #,
        xorl    %eax, %eax      # tmp67
        movl    %esp, %edi      #, tmp66
        movl    $6, %ecx        #, tmp68
        rep stosl
        andl    $255, %edx      #, tmp69
        movl    %esp, %eax      #, tmp70
        movl    $675, (%esp)    #, regs.eax
        movl    %edx, 4(%esp)   # tmp69, regs.ebx
        call    i8k_smm #
        testl   %eax, %eax      # D.15145
        jne     .L13    #,
        imull   $675, fan_mult, %eax    #, fan_mult, D.15145
.L13:
        addl    $24, %esp       #,
        popl    %edi    #
        ret
        .size   i8k_get_fan_speed, .-i8k_get_fan_speed
        .type   i8k_get_dell_signature, @function
i8k_get_dell_signature:
        pushl   %edi    #
        movl    %eax, %edx      # req_fn, req_fn
        subl    $24, %esp       #,
        xorl    %eax, %eax      # tmp63
        movl    %esp, %edi      #, tmp62
        movl    $6, %ecx        #, tmp64
        rep stosl
        movl    %esp, %eax      #, tmp65
        movl    %edx, (%esp)    # req_fn, regs.eax
        call    i8k_smm #
        movl    $-1, %edx       #, tmp67
        testl   %eax, %eax      # rc
        cmovns  %edx, %eax      # rc,, tmp67, rc
        addl    $24, %esp       #,
        popl    %edi    #
        ret
        .size   i8k_get_dell_signature, .-i8k_get_dell_signature
        .type   i8k_open_fs, @function
i8k_open_fs:
        movl    %edx, %eax      # file, file
        xorl    %ecx, %ecx      #
        movl    $i8k_proc_show, %edx    #,
        jmp     single_open     #
        .size   i8k_open_fs, .-i8k_open_fs
        .section        .rodata.str1.1,"aMS",@progbits,1
.LC0:
        .string "?"
        .text
        .type   i8k_get_dmi_data, @function
i8k_get_dmi_data:
        call    dmi_get_system_info     #
        testl   %eax, %eax      # dmi_data
        je      .L20    #,
        cmpb    $0, (%eax)      #,* dmi_data
        movl    $.LC0, %edx     #, tmp63
        cmove   %edx, %eax      # dmi_data,, tmp63, dmi_data
        ret
.L20:
        movl    $.LC0, %eax     #, dmi_data
        ret
        .size   i8k_get_dmi_data, .-i8k_get_dmi_data
        .type   i8k_get_temp.clone.1, @function
i8k_get_temp.clone.1:
        pushl   %edi    #
        xorl    %eax, %eax      # tmp61
        subl    $24, %esp       #,
        movl    $6, %ecx        #, tmp62
        movl    %esp, %edi      #, tmp60
        rep stosl
        movl    %esp, %eax      #, tmp63
        movl    $4259, (%esp)   #, regs.eax
        call    i8k_smm #
        testl   %eax, %eax      # rc
        js      .L22    #,
        movl    prev.12857, %eax        # prev, rc
        movl    $127, prev.12857        #, prev
.L22:
        addl    $24, %esp       #,
        popl    %edi    #
        ret
        .size   i8k_get_temp.clone.1, .-i8k_get_temp.clone.1
        .section        .rodata.str1.1
.LC1:
        .string "1.0"
.LC2:
        .string "%s %s %s %d %d %d %d %d %d %d\n"
        .text
        .type   i8k_proc_show, @function
i8k_proc_show:
        pushl   %ebp    #
        pushl   %edi    #
        pushl   %esi    #
        pushl   %ebx    #
        orl     $-1, %ebx       #, ac_power
        subl    $16, %esp       #,
        movl    %eax, 12(%esp)  # seq, %sfp
        call    i8k_get_temp.clone.1    #
        movl    %eax, (%esp)    #, %sfp
        movl    $1, %eax        #,
        call    i8k_get_fan_status      #
        movl    %eax, 4(%esp)   #, %sfp
        xorl    %eax, %eax      #
        call    i8k_get_fan_status      #
        movl    %eax, %esi      #, right_fan
        movl    $1, %eax        #,
        call    i8k_get_fan_speed       #
        movl    %eax, %edi      #, left_speed
        xorl    %eax, %eax      #
        call    i8k_get_fan_speed       #
        movl    %eax, %ebp      #, right_speed
        call    i8k_get_fn_status       #
        cmpl    $0, power_status        #, power_status
        movl    %eax, 8(%esp)   #, %sfp
        je      .L24    #,
        call    i8k_get_power_status    #
        movl    %eax, %ebx      #, ac_power
.L24:
        movl    $7, %eax        #,
        call    i8k_get_dmi_data        #
        pushl   8(%esp) # %sfp
        pushl   %ebx    # ac_power
        pushl   %ebp    # right_speed
        pushl   %edi    # left_speed
        pushl   %esi    # right_fan
        pushl   24(%esp)        # %sfp
        pushl   24(%esp)        # %sfp
        pushl   %eax    # D.15110
        pushl   $bios_version   #
        pushl   $.LC1   #
        pushl   $.LC2   #
        pushl   56(%esp)        # %sfp
        call    seq_printf      #
        addl    $64, %esp       #,
        popl    %ebx    #
        popl    %esi    #
        popl    %edi    #
        popl    %ebp    #
        ret
        .size   i8k_proc_show, .-i8k_proc_show
        .type   copy_from_user.clone.2, @function
copy_from_user.clone.2:
        movl    $4, %ecx        #,
        jmp     _copy_from_user #
        .size   copy_from_user.clone.2, .-copy_from_user.clone.2
        .type   i8k_ioctl, @function
i8k_ioctl:
        pushl   %ebp    #
        movl    %edx, %ebp      # cmd, cmd
        pushl   %edi    #
        pushl   %esi    #
        movl    $-22, %esi      #, ret
        pushl   %ebx    #
        movl    %ecx, %ebx      # arg, arg
        subl    $48, %esp       #,
        testl   %ecx, %ecx      # arg
        movl    $0, 44(%esp)    #, val
        je      .L28    #,
        cmpl    $-2147194493, %edx      #, cmd
        je      .L32    #,
        ja      .L37    #,
        cmpl    $-2147194495, %edx      #, cmd
        je      .L30    #,
        ja      .L31    #,
        cmpl    $-2147194496, %edx      #, cmd
        jne     .L46    #,
        jmp     .L58    #
.L37:
        cmpl    $-1073452667, %edx      #, cmd
        je      .L34    #,
        ja      .L38    #,
        cmpl    $-2147194492, %edx      #, cmd
        jne     .L46    #,
        jmp     .L59    #
.L38:
        cmpl    $-1073452666, %edx      #, cmd
        je      .L35    #,
        cmpl    $-1073452665, %edx      #, cmd
        jne     .L46    #,
        jmp     .L60    #
.L58:
        call    i8k_get_bios_version    #
        jmp     .L41    #
.L30:
        leal    24(%esp), %esi  #, tmp93
        xorl    %eax, %eax      # tmp95
        movl    %esi, %edi      # tmp93, tmp94
        movl    $4, %ecx        #, tmp96
        rep stosl
        movb    $7, %al #,
        call    i8k_get_dmi_data        #
        movl    $16, %ecx       #,
        movl    %eax, %edx      # D.15468,
        movl    %esi, %eax      # tmp93,
        call    strlcpy #
        jmp     .L39    #
.L32:
        call    i8k_get_fn_status       #
        jmp     .L41    #
.L31:
        call    i8k_get_power_status    #
        jmp     .L41    #
.L59:
        call    i8k_get_temp.clone.1    #
        jmp     .L41    #
.L34:
        leal    44(%esp), %eax  #, tmp98
        movl    %ecx, %edx      # arg,
        call    copy_from_user.clone.2  #
        movl    $-14, %esi      #, ret
        testl   %eax, %eax      # D.15473
        jne     .L28    #,
        movl    44(%esp), %eax  # val,
        call    i8k_get_fan_speed       #
        jmp     .L41    #
.L35:
        leal    44(%esp), %eax  #, tmp100
        movl    %ecx, %edx      # arg,
        call    copy_from_user.clone.2  #
        movl    $-14, %esi      #, ret
        testl   %eax, %eax      # D.15476
        jne     .L28    #,
        movl    44(%esp), %eax  # val,
        jmp     .L57    #
.L60:
        cmpl    $0, restricted  #, restricted
        je      .L40    #,
        movl    $21, %eax       #,
        orl     $-1, %esi       #, ret
        call    capable #
        testl   %eax, %eax      # D.15479
        je      .L28    #,
.L40:
        leal    44(%esp), %eax  #, tmp102
        movl    %ebx, %edx      # arg,
        call    copy_from_user.clone.2  #
        movl    $-14, %esi      #, ret
        testl   %eax, %eax      # D.15480
        jne     .L28    #,
        leal    4(%ebx), %edx   #, tmp103
        leal    40(%esp), %eax  #, tmp104
        call    copy_from_user.clone.2  #
        testl   %eax, %eax      # D.15482
        jne     .L28    #,
        movl    %esp, %edi      #, tmp105
        movl    $6, %ecx        #, tmp107
        movl    40(%esp), %edx  # speed, speed.19
        rep stosl
        movl    44(%esp), %esi  # val, val.15
        movl    $419, (%esp)    #, regs.eax
        cmpl    $2, %edx        #, speed.19
        movb    $2, %cl #,
        cmovle  %edx, %ecx      # speed.19,, speed
        movl    %esi, %edx      # val.15, tmp112
        testl   %ecx, %ecx      # speed
        cmovns  %ecx, %eax      # speed,, tmp113
        andl    $255, %edx      #, tmp112
        sall    $8, %eax        #, tmp113
        orl     %edx, %eax      # tmp112, tmp113
        movl    %eax, 4(%esp)   # tmp113, regs.ebx
        movl    %esp, %eax      #, tmp114
        call    i8k_smm #
        testl   %eax, %eax      # D.15487
        jne     .L41    #,
        movl    %esi, %eax      # val.15,
.L57:
        call    i8k_get_fan_status      #
.L41:
        movl    %eax, 44(%esp)  # D.15487, val
.L39:
        movl    44(%esp), %esi  # val, ret
        testl   %esi, %esi      # ret
        js      .L28    #,
        cmpl    $-2147194496, %ebp      #, cmd
        je      .L55    #,
        cmpl    $-2147194495, %ebp      #, cmd
        jne     .L55    #,
        leal    24(%esp), %edx  #, tmp116
        movl    $16, %ecx       #,
.L56:
        movl    %ebx, %eax      # arg,
        call    copy_to_user    #
        cmpl    $1, %eax        #, D.15485
        sbbl    %esi, %esi      # ret
        notl    %esi    # ret
        andl    $-14, %esi      #, ret
        jmp     .L28    #
.L55:
        leal    44(%esp), %edx  #, tmp117
        movl    $4, %ecx        #,
        jmp     .L56    #
.L46:
        movl    $-22, %esi      #, ret
.L28:
        addl    $48, %esp       #,
        movl    %esi, %eax      # ret,
        popl    %ebx    #
        popl    %esi    #
        popl    %edi    #
        popl    %ebp    #
        ret
        .size   i8k_ioctl, .-i8k_ioctl
        .section        .rodata.str1.1
.LC3:
        .string "<6>i8k: not running on a supported Dell system.\n"
.LC4:
        .string "<6>i8k: vendor=%s, model=%s, version=%s\n"
.LC5:
        .string "<3>i8k: unable to get SMM Dell signature\n"
.LC6:
        .string "<4>i8k: unable to get SMM BIOS version\n"
.LC7:
        .string "<4>i8k: BIOS version mismatch: %s != %s\n"
.LC8:
        .string "1.14 21/02/2005"
.LC9:
        .string "<6>Dell laptop SMM driver v%s Massimo Dal Zotto 
(d...@debian.org)\n"
.LC10:
        .string "i8k"
        .section        .init.text,"ax",@progbits
        .type   i8k_init, @function
i8k_init:
        pushl   %esi    #
        movl    $i8k_dmi_table, %eax    #,
        pushl   %ebx    #
        subl    $4, %esp        #,
        call    dmi_check_system        #
        testl   %eax, %eax      # D.15529
        jne     .L62    #,
        cmpl    $0, ignore_dmi  #, ignore_dmi
        jne     .L63    #,
        cmpl    $0, force       #, force
        movl    $-19, %eax      #, D.15099
        je      .L64    #,
.L63:
        pushl   $.LC3   #
        call    printk  #
        movl    $2, %eax        #,
        call    i8k_get_dmi_data        #
        movl    %eax, %esi      #, D.15525
        movl    $5, %eax        #,
        call    i8k_get_dmi_data        #
        movl    %eax, %ebx      #, D.15524
        movl    $4, %eax        #,
        call    i8k_get_dmi_data        #
        pushl   %esi    # D.15525
        pushl   %ebx    # D.15524
        pushl   %eax    # D.15523
        pushl   $.LC4   #
        call    printk  #
        addl    $20, %esp       #,
.L62:
        movl    $2, %eax        #,
        call    i8k_get_dmi_data        #
        movl    $4, %ecx        #,
        movl    %eax, %edx      # D.15522,
        movl    $bios_version, %eax     #,
        call    strlcpy #
        movl    $65187, %eax    #,
        call    i8k_get_dell_signature  #
        testl   %eax, %eax      # D.15521
        je      .L65    #,
        movl    $65443, %eax    #,
        call    i8k_get_dell_signature  #
        testl   %eax, %eax      # D.15520
        je      .L65    #,
        pushl   $.LC5   #
        call    printk  #
        movl    $-19, %eax      #, D.15099
        cmpl    $0, force       #, force
        popl    %edx    #
        je      .L64    #,
.L65:
        call    i8k_get_bios_version    #
        testl   %eax, %eax      # version
        jg      .L66    #,
        pushl   $.LC6   #
        call    printk  #
        popl    %eax    #
        jmp     .L67    #
.L66:
        movl    %eax, %edx      # version, tmp79
        sarl    $16, %edx       #, tmp79
        movb    %dl, (%esp)     # tmp79, buff
        movl    %eax, %edx      # version, tmp80
        sarl    $8, %edx        #, tmp80
        movb    %al, 2(%esp)    # version, buff
        movl    $2, %eax        #,
        movb    %dl, 1(%esp)    # tmp80, buff
        movb    $0, 3(%esp)     #, buff
        call    dmi_get_system_info     #
        testl   %eax, %eax      # D.15514
        jne     .L68    #,
        movl    %esp, %edx      #, tmp81
        movl    $4, %ecx        #,
        movl    $bios_version, %eax     #,
        call    strlcpy #
.L68:
        movl    $4, %ecx        #,
        movl    $bios_version, %edx     #,
        movl    %esp, %eax      #,
        movl    %esp, %ebx      #, tmp82
        call    strncmp #
        testl   %eax, %eax      # D.15513
        je      .L67    #,
        pushl   $bios_version   #
        pushl   %ebx    # tmp82
        pushl   $.LC7   #
        call    printk  #
        addl    $12, %esp       #,
        jmp     .L67    #
.L74:
        pushl   $.LC8   #
        pushl   $.LC9   #
        call    printk  #
        xorl    %eax, %eax      # D.15099
        popl    %ebx    #
        popl    %esi    #
.L64:
        addl    $4, %esp        #,
        popl    %ebx    #
        popl    %esi    #
        ret
.L67:
        pushl   $0      #
        xorl    %ecx, %ecx      #
        xorl    %edx, %edx      #
        movl    $.LC10, %eax    #,
        pushl   $i8k_fops       #
        call    proc_create_data        #
        movl    %eax, %edx      #, proc_i8k
        testl   %edx, %edx      # proc_i8k
        popl    %eax    #
        movl    $-2, %eax       #, D.15099
        popl    %ecx    #
        je      .L64    #,
        jmp     .L74    #
        .size   i8k_init, .-i8k_init
        .section        .exit.text,"ax",@progbits
        .type   i8k_exit, @function
i8k_exit:
        xorl    %edx, %edx      #
        movl    $.LC10, %eax    #,
        jmp     remove_proc_entry       #
        .size   i8k_exit, .-i8k_exit
        .section        .modinfo,"a",@progbits
        .align 4
        .type   __mod_fan_mult83, @object
        .size   __mod_fan_mult83, 48
__mod_fan_mult83:
        .string "parm=fan_mult:Factor to multiply fan speed with"
        .align 4
        .type   __mod_fan_multtype82, @object
        .size   __mod_fan_multtype82, 22
__mod_fan_multtype82:
        .string "parmtype=fan_mult:int"
        .section        __param,"a",@progbits
        .align 4
        .type   __param_fan_mult, @object
        .size   __param_fan_mult, 16
__param_fan_mult:
# name:
        .long   __param_str_fan_mult
# ops:
        .long   param_ops_int
# perm:
        .value  0
# flags:
        .value  0
# <anonymous>:
# arg:
        .long   fan_mult
        .section        .modinfo
        .align 4
        .type   __mod_power_status79, @object
        .size   __mod_power_status79, 51
__mod_power_status79:
        .string "parm=power_status:Report power status in /proc/i8k"
        .align 4
        .type   __mod_power_statustype78, @object
        .size   __mod_power_statustype78, 27
__mod_power_statustype78:
        .string "parmtype=power_status:bool"
        .section        __param
        .align 4
        .type   __param_power_status, @object
        .size   __param_power_status, 16
__param_power_status:
# name:
        .long   __param_str_power_status
# ops:
        .long   param_ops_bool
# perm:
        .value  384
# flags:
        .value  0
# <anonymous>:
# arg:
        .long   power_status
        .section        .modinfo
        .align 4
        .type   __mod_restricted75, @object
        .size   __mod_restricted75, 62
__mod_restricted75:
        .string "parm=restricted:Allow fan control if SYS_ADMIN capability set"
        .align 4
        .type   __mod_restrictedtype74, @object
        .size   __mod_restrictedtype74, 25
__mod_restrictedtype74:
        .string "parmtype=restricted:bool"
        .section        __param
        .align 4
        .type   __param_restricted, @object
        .size   __param_restricted, 16
__param_restricted:
# name:
        .long   __param_str_restricted
# ops:
        .long   param_ops_bool
# perm:
        .value  0
# flags:
        .value  0
# <anonymous>:
# arg:
        .long   restricted
        .section        .modinfo
        .align 4
        .type   __mod_ignore_dmi71, @object
        .size   __mod_ignore_dmi71, 74
__mod_ignore_dmi71:
        .string "parm=ignore_dmi:Continue probing hardware even if DMI data 
does not match"
        .align 4
        .type   __mod_ignore_dmitype70, @object
        .size   __mod_ignore_dmitype70, 25
__mod_ignore_dmitype70:
        .string "parmtype=ignore_dmi:bool"
        .section        __param
        .align 4
        .type   __param_ignore_dmi, @object
        .size   __param_ignore_dmi, 16
__param_ignore_dmi:
# name:
        .long   __param_str_ignore_dmi
# ops:
        .long   param_ops_bool
# perm:
        .value  0
# flags:
        .value  0
# <anonymous>:
# arg:
        .long   ignore_dmi
        .section        .modinfo
        .align 4
        .type   __mod_force67, @object
        .size   __mod_force67, 63
__mod_force67:
        .string "parm=force:Force loading without checking for supported models"
        .align 4
        .type   __mod_forcetype66, @object
        .size   __mod_forcetype66, 20
__mod_forcetype66:
        .string "parmtype=force:bool"
        .section        __param
        .align 4
        .type   __param_force, @object
        .size   __param_force, 16
__param_force:
# name:
        .long   __param_str_force
# ops:
        .long   param_ops_bool
# perm:
        .value  0
# flags:
        .value  0
# <anonymous>:
# arg:
        .long   force
        .section        .modinfo
        .align 4
        .type   __mod_license63, @object
        .size   __mod_license63, 12
__mod_license63:
        .string "license=GPL"
        .align 4
        .type   __mod_description62, @object
        .size   __mod_description62, 58
__mod_description62:
        .string "description=Driver for accessing SMM BIOS on Dell laptops"
        .align 4
        .type   __mod_author61, @object
        .size   __mod_author61, 41
__mod_author61:
        .string "author=Massimo Dal Zotto (d...@debian.org)"
        .data
        .align 4
        .type   fan_mult, @object
        .size   fan_mult, 4
fan_mult:
        .long   30
        .local  power_status
        .comm   power_status,4,4
        .local  restricted
        .comm   restricted,4,4
        .local  ignore_dmi
        .comm   ignore_dmi,4,4
        .local  force
        .comm   force,4,4
        .section        .rodata
        .align 4
        .type   i8k_fops, @object
        .size   i8k_fops, 100
i8k_fops:
# owner:
        .long   __this_module
# llseek:
        .long   seq_lseek
# read:
        .long   seq_read
# unlocked_ioctl:
        .zero   20
        .long   i8k_ioctl
# open:
        .zero   8
        .long   i8k_open_fs
# release:
        .zero   4
        .long   single_release
        .zero   44
        .local  bios_version
        .comm   bios_version,4,4
        .local  prev.12857
        .comm   prev.12857,4,4
        .section        .rodata.str1.1
.LC11:
        .string "Dell Inspiron"
.LC12:
        .string "Dell Latitude"
.LC13:
        .string "Dell Inspiron 2"
.LC14:
        .string "Dell Latitude 2"
.LC15:
        .string "Dell Inspiron 3"
.LC16:
        .string "Dell Precision"
.LC17:
        .string "Dell Vostro"
        .section        .init.data,"aw",@progbits
        .align 4
        .type   i8k_dmi_table, @object
        .size   i8k_dmi_table, 2988
i8k_dmi_table:
# ident:
        .zero   4
        .long   .LC11
# matches:
# slot:
        .byte   4
# substr:
        .string "Dell Computer"
        .zero   65
# slot:
        .byte   5
# substr:
        .string "Inspiron"
        .zero   70
        .zero   160
        .zero   4
# ident:
        .zero   4
        .long   .LC12
# matches:
# slot:
        .byte   4
# substr:
        .string "Dell Computer"
        .zero   65
# slot:
        .byte   5
# substr:
        .string "Latitude"
        .zero   70
        .zero   160
        .zero   4
# ident:
        .zero   4
        .long   .LC13
# matches:
# slot:
        .byte   4
# substr:
        .string "Dell Inc."
        .zero   69
# slot:
        .byte   5
# substr:
        .string "Inspiron"
        .zero   70
        .zero   160
        .zero   4
# ident:
        .zero   4
        .long   .LC14
# matches:
# slot:
        .byte   4
# substr:
        .string "Dell Inc."
        .zero   69
# slot:
        .byte   5
# substr:
        .string "Latitude"
        .zero   70
        .zero   160
        .zero   4
# ident:
        .zero   4
        .long   .LC15
# matches:
# slot:
        .byte   4
# substr:
        .string "Dell Inc."
        .zero   69
# slot:
        .byte   5
# substr:
        .string "MM061"
        .zero   73
        .zero   160
        .zero   4
# ident:
        .zero   4
        .long   .LC15
# matches:
# slot:
        .byte   4
# substr:
        .string "Dell Inc."
        .zero   69
# slot:
        .byte   5
# substr:
        .string "MP061"
        .zero   73
        .zero   160
        .zero   4
# ident:
        .zero   4
        .long   .LC16
# matches:
# slot:
        .byte   4
# substr:
        .string "Dell Inc."
        .zero   69
# slot:
        .byte   5
# substr:
        .string "Precision"
        .zero   69
        .zero   160
        .zero   4
# ident:
        .zero   4
        .long   .LC17
# matches:
# slot:
        .byte   4
# substr:
        .string "Dell Inc."
        .zero   69
# slot:
        .byte   5
# substr:
        .string "Vostro"
        .zero   72
        .zero   160
        .zero   4
        .zero   332
        .section        .rodata
        .align 4
        .type   __param_str_fan_mult, @object
        .size   __param_str_fan_mult, 9
__param_str_fan_mult:
        .string "fan_mult"
        .align 4
        .type   __param_str_power_status, @object
        .size   __param_str_power_status, 13
__param_str_power_status:
        .string "power_status"
        .align 4
        .type   __param_str_restricted, @object
        .size   __param_str_restricted, 11
__param_str_restricted:
        .string "restricted"
        .align 4
        .type   __param_str_ignore_dmi, @object
        .size   __param_str_ignore_dmi, 11
__param_str_ignore_dmi:
        .string "ignore_dmi"
        .align 4
        .type   __param_str_force, @object
        .size   __param_str_force, 6
__param_str_force:
        .string "force"
.globl init_module
        .set    init_module,i8k_init
.globl cleanup_module
        .set    cleanup_module,i8k_exit
        .ident  "GCC: (GNU) 4.5.1"
        .section        .note.GNU-stack,"",@progbits
        .file   "i8k.c"
# GNU C (GCC) version 4.5.1 (i486-slackware-linux)
#       compiled by GNU C version 4.5.1, GMP version 5.0.1, MPFR version 
2.4.2-p3, MPC version 0.8.2
# GGC heuristics: --param ggc-min-expand=81 --param ggc-min-heapsize=96817
# options passed:  -nostdinc -I/usr/src/linux-2.6.36/arch/x86/include
# -Iinclude -D__KERNEL__ -DCONFIG_AS_CFI=1 -DCONFIG_AS_CFI_SIGNAL_FRAME=1
# -DCONFIG_AS_CFI_SECTIONS=1 -DMODULE -DKBUILD_STR(s)=#s
# -DKBUILD_BASENAME=KBUILD_STR(i8k) -DKBUILD_MODNAME=KBUILD_STR(i8k)
# -isystem /usr/lib/gcc/i486-slackware-linux/4.5.1/include -include
# include/generated/autoconf.h -MD drivers/char/.i8k.s.d drivers/char/i8k.c
# -m32 -msoft-float -mregparm=3 -mpreferred-stack-boundary=2 -march=i686
# -mtune=pentium3 -mtune=generic -mno-sse -mno-mmx -mno-sse2 -mno-3dnow
# -auxbase-strip drivers/char/i8k.s -Os -Wall -Wundef -Wstrict-prototypes
# -Wno-trigraphs -Werror-implicit-function-declaration -Wno-format-security
# -Wno-sign-compare -Wframe-larger-than=1024 -Wdeclaration-after-statement
# -Wno-pointer-sign -fno-strict-aliasing -fno-common
# -fno-delete-null-pointer-checks -freg-struct-return -ffreestanding
# -fno-asynchronous-unwind-tables -fno-stack-protector -fomit-frame-pointer
# -fno-strict-overflow -fconserve-stack -fverbose-asm
# options enabled:  -falign-loops -fargument-alias -fauto-inc-dec
# -fbranch-count-reg -fcaller-saves -fcprop-registers -fcrossjumping
# -fcse-follow-jumps -fdefer-pop -fdwarf2-cfi-asm -fearly-inlining
# -feliminate-unused-debug-types -fexpensive-optimizations
# -fforward-propagate -ffunction-cse -fgcse -fgcse-lm
# -fguess-branch-probability -fident -fif-conversion -fif-conversion2
# -findirect-inlining -finline -finline-functions
# -finline-functions-called-once -finline-small-functions -fipa-cp
# -fipa-pure-const -fipa-reference -fipa-sra -fira-share-save-slots
# -fira-share-spill-slots -fivopts -fkeep-static-consts
# -fleading-underscore -fmath-errno -fmerge-constants -fmerge-debug-strings
# -fmove-loop-invariants -fomit-frame-pointer -foptimize-register-move
# -foptimize-sibling-calls -fpeephole -fpeephole2 -freg-struct-return
# -fregmove -freorder-blocks -freorder-functions -frerun-cse-after-loop
# -fsched-critical-path-heuristic -fsched-dep-count-heuristic
# -fsched-group-heuristic -fsched-interblock -fsched-last-insn-heuristic
# -fsched-rank-heuristic -fsched-spec -fsched-spec-insn-heuristic
# -fsched-stalled-insns-dep -fschedule-insns2 -fshow-column -fsigned-zeros
# -fsplit-ivs-in-unroller -fsplit-wide-types -fthread-jumps
# -ftoplevel-reorder -ftrapping-math -ftree-builtin-call-dce -ftree-ccp
# -ftree-ch -ftree-copy-prop -ftree-copyrename -ftree-cselim -ftree-dce
# -ftree-dominator-opts -ftree-dse -ftree-forwprop -ftree-fre
# -ftree-loop-im -ftree-loop-ivcanon -ftree-loop-optimize
# -ftree-parallelize-loops= -ftree-phiprop -ftree-pre -ftree-pta
# -ftree-reassoc -ftree-scev-cprop -ftree-sink -ftree-slp-vectorize
# -ftree-sra -ftree-switch-conversion -ftree-ter -ftree-vect-loop-version
# -ftree-vrp -funit-at-a-time -fvect-cost-model -fverbose-asm
# -fzero-initialized-in-bss -m32 -m96bit-long-double -malign-stringops
# -mfused-madd -mglibc -mieee-fp -mno-fancy-math-387 -mno-red-zone
# -mno-sse4 -mpush-args -msahf -mtls-direct-seg-refs

# Compiler executable checksum: 7ba2dc3c015559b9d16b297ee7f8d354

        .text
        .type   i8k_smm, @function
i8k_smm:
        pushl   %ebp    #
        movl    %eax, %ebp      # regs, regs
        pushl   %edi    #
        pushl   %esi    #
        pushl   %ebx    #
        subl    $8, %esp        #,
        movl    (%eax), %eax    # regs_2(D)->eax,
        movl    %eax, 4(%esp)   #, %sfp
        movl    %ebp, %eax      # regs,
#APP
# 148 "drivers/char/i8k.c" 1
        pushl %eax
        movl 0(%eax),%edx
        push %edx
        movl 4(%eax),%ebx
        movl 8(%eax),%ecx
        movl 12(%eax),%edx
        movl 16(%eax),%esi
        movl 20(%eax),%edi
        popl %eax
        out %al,$0xb2
        out %al,$0x84
        xchgl %eax,(%esp)
        movl %ebx,4(%eax)
        movl %ecx,8(%eax)
        movl %edx,12(%eax)
        movl %esi,16(%eax)
        movl %edi,20(%eax)
        popl %edx
        movl %edx,0(%eax)
        lahf
        shrl $8,%eax
        andl $1,%eax

# 0 "" 2
#NO_APP
        testl   %eax, %eax      #
        movl    $-22, %edx      #, D.15130
        movl    %eax, (%esp)    #, %sfp
        jne     .L2     #,
        movl    0(%ebp), %ecx   # regs_2(D)->eax, D.15123
        cmpw    $-1, %cx        #, D.15123
        je      .L2     #,
        cmpl    4(%esp), %ecx   # %sfp, D.15123
        cmovne  %eax, %edx      #,, D.15130
.L2:
        addl    $8, %esp        #,
        movl    %edx, %eax      # D.15130,
        popl    %ebx    #
        popl    %esi    #
        popl    %edi    #
        popl    %ebp    #
        ret
        .size   i8k_smm, .-i8k_smm
        .type   i8k_get_bios_version, @function
i8k_get_bios_version:
        pushl   %edi    #
        xorl    %eax, %eax      # tmp62
        subl    $24, %esp       #,
        movl    $6, %ecx        #, tmp63
        movl    %esp, %edi      #, tmp61
        rep stosl
        movl    %esp, %eax      #, tmp64
        movl    $166, (%esp)    #, regs.eax
        call    i8k_smm #
        testl   %eax, %eax      # D.15225
        cmove   (%esp), %eax    # regs.eax,, D.15225
        addl    $24, %esp       #,
        popl    %edi    #
        ret
        .size   i8k_get_bios_version, .-i8k_get_bios_version
        .type   i8k_get_fn_status, @function
i8k_get_fn_status:
        pushl   %edi    #
        xorl    %eax, %eax      # tmp65
        subl    $24, %esp       #,
        movl    $6, %ecx        #, tmp66
        movl    %esp, %edi      #, tmp64
        rep stosl
        movl    %esp, %eax      #, tmp67
        movl    $37, (%esp)     #, regs.eax
        call    i8k_smm #
        testl   %eax, %eax      # rc
        js      .L9     #,
        movl    (%esp), %eax    # regs.eax, csui.31
        shrl    $8, %eax        #, csui.31
        andl    $7, %eax        #, csui.31
        leal    -1(%eax), %edx  #, csui.31
        xorl    %eax, %eax      # rc
        cmpl    $3, %edx        #, csui.31
        ja      .L9     #,
        movl    CSWTCH.30(,%edx,4), %eax        # CSWTCH.30, rc
.L9:
        addl    $24, %esp       #,
        popl    %edi    #
        ret
        .size   i8k_get_fn_status, .-i8k_get_fn_status
        .type   i8k_get_power_status, @function
i8k_get_power_status:
        pushl   %edi    #
        xorl    %eax, %eax      # tmp63
        subl    $24, %esp       #,
        movl    $6, %ecx        #, tmp64
        movl    %esp, %edi      #, tmp62
        rep stosl
        movl    %esp, %eax      #, tmp65
        movl    $105, (%esp)    #, regs.eax
        call    i8k_smm #
        testl   %eax, %eax      # rc
        js      .L12    #,
        xorl    %eax, %eax      # rc
        cmpb    $5, (%esp)      #, regs.eax
        sete    %al     #, rc
.L12:
        addl    $24, %esp       #,
        popl    %edi    #
        ret
        .size   i8k_get_power_status, .-i8k_get_power_status
        .type   i8k_get_fan_status, @function
i8k_get_fan_status:
        pushl   %edi    #
        movl    %eax, %edx      # fan, fan
        subl    $24, %esp       #,
        xorl    %eax, %eax      # tmp66
        movl    %esp, %edi      #, tmp65
        movl    $6, %ecx        #, tmp67
        rep stosl
        andl    $255, %edx      #, tmp68
        movl    %esp, %eax      #, tmp69
        movl    $163, (%esp)    #, regs.eax
        movl    %edx, 4(%esp)   # tmp68, regs.ebx
        call    i8k_smm #
        testl   %eax, %eax      # D.15134
        jne     .L14    #,
        movl    (%esp), %eax    # regs.eax, regs.eax
        andl    $255, %eax      #, D.15134
.L14:
        addl    $24, %esp       #,
        popl    %edi    #
        ret
        .size   i8k_get_fan_status, .-i8k_get_fan_status
        .type   i8k_get_fan_speed, @function
i8k_get_fan_speed:
        pushl   %edi    #
        movl    %eax, %edx      # fan, fan
        subl    $24, %esp       #,
        xorl    %eax, %eax      # tmp69
        movl    %esp, %edi      #, tmp68
        movl    $6, %ecx        #, tmp70
        rep stosl
        andl    $255, %edx      #, tmp71
        movl    %esp, %eax      #, tmp72
        movl    $675, (%esp)    #, regs.eax
        movl    %edx, 4(%esp)   # tmp71, regs.ebx
        call    i8k_smm #
        testl   %eax, %eax      # D.15145
        jne     .L16    #,
        movl    (%esp), %eax    # regs.eax, regs.eax
        andl    $65535, %eax    #, D.15145
        imull   fan_mult, %eax  # fan_mult, D.15145
.L16:
        addl    $24, %esp       #,
        popl    %edi    #
        ret
        .size   i8k_get_fan_speed, .-i8k_get_fan_speed
        .type   i8k_get_dell_signature, @function
i8k_get_dell_signature:
        pushl   %edi    #
        movl    %eax, %edx      # req_fn, req_fn
        subl    $24, %esp       #,
        xorl    %eax, %eax      # tmp65
        movl    %esp, %edi      #, tmp64
        movl    $6, %ecx        #, tmp66
        rep stosl
        movl    %esp, %eax      #, tmp67
        movl    %edx, (%esp)    # req_fn, regs.eax
        call    i8k_smm #
        testl   %eax, %eax      # rc
        js      .L18    #,
        orl     $-1, %eax       #, rc
        cmpl    $1145651527, (%esp)     #, regs.eax
        jne     .L18    #,
        xorl    %eax, %eax      # rc
        cmpl    $1145392204, 12(%esp)   #, regs.edx
        sete    %al     #, rc
        decl    %eax    # rc
.L18:
        addl    $24, %esp       #,
        popl    %edi    #
        ret
        .size   i8k_get_dell_signature, .-i8k_get_dell_signature
        .type   i8k_open_fs, @function
i8k_open_fs:
        movl    %edx, %eax      # file, file
        xorl    %ecx, %ecx      #
        movl    $i8k_proc_show, %edx    #,
        jmp     single_open     #
        .size   i8k_open_fs, .-i8k_open_fs
        .section        .rodata.str1.1,"aMS",@progbits,1
.LC0:
        .string "?"
        .text
        .type   i8k_get_dmi_data, @function
i8k_get_dmi_data:
        call    dmi_get_system_info     #
        testl   %eax, %eax      # dmi_data
        je      .L24    #,
        cmpb    $0, (%eax)      #,* dmi_data
        movl    $.LC0, %edx     #, tmp63
        cmove   %edx, %eax      # dmi_data,, tmp63, dmi_data
        ret
.L24:
        movl    $.LC0, %eax     #, dmi_data
        ret
        .size   i8k_get_dmi_data, .-i8k_get_dmi_data
        .type   i8k_get_temp.clone.1, @function
i8k_get_temp.clone.1:
        pushl   %edi    #
        xorl    %eax, %eax      # tmp63
        subl    $24, %esp       #,
        movl    $6, %ecx        #, tmp64
        movl    %esp, %edi      #, tmp62
        rep stosl
        movl    %esp, %eax      #, tmp65
        movl    $4259, (%esp)   #, regs.eax
        call    i8k_smm #
        testl   %eax, %eax      # rc
        js      .L26    #,
        movl    (%esp), %eax    # regs.eax, regs.eax
        andl    $255, %eax      #, rc
        cmpl    $127, %eax      #, rc
        jle     .L27    #,
        movl    prev.12857, %eax        # prev, rc
        movl    $127, prev.12857        #, prev
        jmp     .L26    #
.L27:
        movl    %eax, prev.12857        # rc, prev
.L26:
        addl    $24, %esp       #,
        popl    %edi    #
        ret
        .size   i8k_get_temp.clone.1, .-i8k_get_temp.clone.1
        .section        .rodata.str1.1
.LC1:
        .string "1.0"
.LC2:
        .string "%s %s %s %d %d %d %d %d %d %d\n"
        .text
        .type   i8k_proc_show, @function
i8k_proc_show:
        pushl   %ebp    #
        pushl   %edi    #
        pushl   %esi    #
        pushl   %ebx    #
        orl     $-1, %ebx       #, ac_power
        subl    $16, %esp       #,
        movl    %eax, 12(%esp)  # seq, %sfp
        call    i8k_get_temp.clone.1    #
        movl    %eax, (%esp)    #, %sfp
        movl    $1, %eax        #,
        call    i8k_get_fan_status      #
        movl    %eax, 4(%esp)   #, %sfp
        xorl    %eax, %eax      #
        call    i8k_get_fan_status      #
        movl    %eax, %esi      #, right_fan
        movl    $1, %eax        #,
        call    i8k_get_fan_speed       #
        movl    %eax, %edi      #, left_speed
        xorl    %eax, %eax      #
        call    i8k_get_fan_speed       #
        movl    %eax, %ebp      #, right_speed
        call    i8k_get_fn_status       #
        cmpl    $0, power_status        #, power_status
        movl    %eax, 8(%esp)   #, %sfp
        je      .L29    #,
        call    i8k_get_power_status    #
        movl    %eax, %ebx      #, ac_power
.L29:
        movl    $7, %eax        #,
        call    i8k_get_dmi_data        #
        pushl   8(%esp) # %sfp
        pushl   %ebx    # ac_power
        pushl   %ebp    # right_speed
        pushl   %edi    # left_speed
        pushl   %esi    # right_fan
        pushl   24(%esp)        # %sfp
        pushl   24(%esp)        # %sfp
        pushl   %eax    # D.15110
        pushl   $bios_version   #
        pushl   $.LC1   #
        pushl   $.LC2   #
        pushl   56(%esp)        # %sfp
        call    seq_printf      #
        addl    $64, %esp       #,
        popl    %ebx    #
        popl    %esi    #
        popl    %edi    #
        popl    %ebp    #
        ret
        .size   i8k_proc_show, .-i8k_proc_show
        .type   copy_from_user.clone.2, @function
copy_from_user.clone.2:
        movl    $4, %ecx        #,
        jmp     _copy_from_user #
        .size   copy_from_user.clone.2, .-copy_from_user.clone.2
        .type   i8k_ioctl, @function
i8k_ioctl:
        pushl   %ebp    #
        movl    %edx, %ebp      # cmd, cmd
        pushl   %edi    #
        pushl   %esi    #
        movl    $-22, %esi      #, ret
        pushl   %ebx    #
        movl    %ecx, %ebx      # arg, arg
        subl    $48, %esp       #,
        testl   %ecx, %ecx      # arg
        movl    $0, 44(%esp)    #, val
        je      .L33    #,
        cmpl    $-2147194493, %edx      #, cmd
        je      .L37    #,
        ja      .L42    #,
        cmpl    $-2147194495, %edx      #, cmd
        je      .L35    #,
        ja      .L36    #,
        cmpl    $-2147194496, %edx      #, cmd
        jne     .L51    #,
        jmp     .L63    #
.L42:
        cmpl    $-1073452667, %edx      #, cmd
        je      .L39    #,
        ja      .L43    #,
        cmpl    $-2147194492, %edx      #, cmd
        jne     .L51    #,
        jmp     .L64    #
.L43:
        cmpl    $-1073452666, %edx      #, cmd
        je      .L40    #,
        cmpl    $-1073452665, %edx      #, cmd
        jne     .L51    #,
        jmp     .L65    #
.L63:
        call    i8k_get_bios_version    #
        jmp     .L46    #
.L35:
        leal    24(%esp), %esi  #, tmp93
        xorl    %eax, %eax      # tmp95
        movl    %esi, %edi      # tmp93, tmp94
        movl    $4, %ecx        #, tmp96
        rep stosl
        movb    $7, %al #,
        call    i8k_get_dmi_data        #
        movl    $16, %ecx       #,
        movl    %eax, %edx      # D.15467,
        movl    %esi, %eax      # tmp93,
        call    strlcpy #
        jmp     .L44    #
.L37:
        call    i8k_get_fn_status       #
        jmp     .L46    #
.L36:
        call    i8k_get_power_status    #
        jmp     .L46    #
.L64:
        call    i8k_get_temp.clone.1    #
        jmp     .L46    #
.L39:
        leal    44(%esp), %eax  #, tmp98
        movl    %ecx, %edx      # arg,
        call    copy_from_user.clone.2  #
        movl    $-14, %esi      #, ret
        testl   %eax, %eax      # D.15472
        jne     .L33    #,
        movl    44(%esp), %eax  # val,
        call    i8k_get_fan_speed       #
        jmp     .L46    #
.L40:
        leal    44(%esp), %eax  #, tmp100
        movl    %ecx, %edx      # arg,
        call    copy_from_user.clone.2  #
        movl    $-14, %esi      #, ret
        testl   %eax, %eax      # D.15475
        jne     .L33    #,
        movl    44(%esp), %eax  # val,
        jmp     .L62    #
.L65:
        cmpl    $0, restricted  #, restricted
        je      .L45    #,
        movl    $21, %eax       #,
        orl     $-1, %esi       #, ret
        call    capable #
        testl   %eax, %eax      # D.15478
        je      .L33    #,
.L45:
        leal    44(%esp), %eax  #, tmp102
        movl    %ebx, %edx      # arg,
        call    copy_from_user.clone.2  #
        movl    $-14, %esi      #, ret
        testl   %eax, %eax      # D.15479
        jne     .L33    #,
        leal    4(%ebx), %edx   #, tmp103
        leal    40(%esp), %eax  #, tmp104
        call    copy_from_user.clone.2  #
        testl   %eax, %eax      # D.15481
        jne     .L33    #,
        movl    %esp, %edi      #, tmp105
        movl    $6, %ecx        #, tmp107
        movl    40(%esp), %edx  # speed, speed.19
        rep stosl
        movl    44(%esp), %esi  # val, val.15
        movl    $419, (%esp)    #, regs.eax
        cmpl    $2, %edx        #, speed.19
        movb    $2, %cl #,
        cmovle  %edx, %ecx      # speed.19,, speed
        movl    %esi, %edx      # val.15, tmp112
        testl   %ecx, %ecx      # speed
        cmovns  %ecx, %eax      # speed,, tmp113
        andl    $255, %edx      #, tmp112
        sall    $8, %eax        #, tmp113
        orl     %edx, %eax      # tmp112, tmp113
        movl    %eax, 4(%esp)   # tmp113, regs.ebx
        movl    %esp, %eax      #, tmp114
        call    i8k_smm #
        testl   %eax, %eax      # D.15486
        jne     .L46    #,
        movl    %esi, %eax      # val.15,
.L62:
        call    i8k_get_fan_status      #
.L46:
        movl    %eax, 44(%esp)  # D.15486, val
.L44:
        movl    44(%esp), %esi  # val, ret
        testl   %esi, %esi      # ret
        js      .L33    #,
        cmpl    $-2147194496, %ebp      #, cmd
        je      .L60    #,
        cmpl    $-2147194495, %ebp      #, cmd
        jne     .L60    #,
        leal    24(%esp), %edx  #, tmp116
        movl    $16, %ecx       #,
.L61:
        movl    %ebx, %eax      # arg,
        call    copy_to_user    #
        cmpl    $1, %eax        #, D.15484
        sbbl    %esi, %esi      # ret
        notl    %esi    # ret
        andl    $-14, %esi      #, ret
        jmp     .L33    #
.L60:
        leal    44(%esp), %edx  #, tmp117
        movl    $4, %ecx        #,
        jmp     .L61    #
.L51:
        movl    $-22, %esi      #, ret
.L33:
        addl    $48, %esp       #,
        movl    %esi, %eax      # ret,
        popl    %ebx    #
        popl    %esi    #
        popl    %edi    #
        popl    %ebp    #
        ret
        .size   i8k_ioctl, .-i8k_ioctl
        .section        .rodata.str1.1
.LC3:
        .string "<6>i8k: not running on a supported Dell system.\n"
.LC4:
        .string "<6>i8k: vendor=%s, model=%s, version=%s\n"
.LC5:
        .string "<3>i8k: unable to get SMM Dell signature\n"
.LC6:
        .string "<4>i8k: unable to get SMM BIOS version\n"
.LC7:
        .string "<4>i8k: BIOS version mismatch: %s != %s\n"
.LC8:
        .string "1.14 21/02/2005"
.LC9:
        .string "<6>Dell laptop SMM driver v%s Massimo Dal Zotto 
(d...@debian.org)\n"
.LC10:
        .string "i8k"
        .section        .init.text,"ax",@progbits
        .type   i8k_init, @function
i8k_init:
        pushl   %esi    #
        movl    $i8k_dmi_table, %eax    #,
        pushl   %ebx    #
        subl    $4, %esp        #,
        call    dmi_check_system        #
        testl   %eax, %eax      # D.15529
        jne     .L67    #,
        cmpl    $0, ignore_dmi  #, ignore_dmi
        jne     .L68    #,
        cmpl    $0, force       #, force
        movl    $-19, %eax      #, D.15099
        je      .L69    #,
.L68:
        pushl   $.LC3   #
        call    printk  #
        movl    $2, %eax        #,
        call    i8k_get_dmi_data        #
        movl    %eax, %esi      #, D.15525
        movl    $5, %eax        #,
        call    i8k_get_dmi_data        #
        movl    %eax, %ebx      #, D.15524
        movl    $4, %eax        #,
        call    i8k_get_dmi_data        #
        pushl   %esi    # D.15525
        pushl   %ebx    # D.15524
        pushl   %eax    # D.15523
        pushl   $.LC4   #
        call    printk  #
        addl    $20, %esp       #,
.L67:
        movl    $2, %eax        #,
        call    i8k_get_dmi_data        #
        movl    $4, %ecx        #,
        movl    %eax, %edx      # D.15522,
        movl    $bios_version, %eax     #,
        call    strlcpy #
        movl    $65187, %eax    #,
        call    i8k_get_dell_signature  #
        testl   %eax, %eax      # D.15521
        je      .L70    #,
        movl    $65443, %eax    #,
        call    i8k_get_dell_signature  #
        testl   %eax, %eax      # D.15520
        je      .L70    #,
        pushl   $.LC5   #
        call    printk  #
        movl    $-19, %eax      #, D.15099
        cmpl    $0, force       #, force
        popl    %edx    #
        je      .L69    #,
.L70:
        call    i8k_get_bios_version    #
        testl   %eax, %eax      # version
        jg      .L71    #,
        pushl   $.LC6   #
        call    printk  #
        popl    %eax    #
        jmp     .L72    #
.L71:
        movl    %eax, %edx      # version, tmp79
        sarl    $16, %edx       #, tmp79
        movb    %dl, (%esp)     # tmp79, buff
        movl    %eax, %edx      # version, tmp80
        sarl    $8, %edx        #, tmp80
        movb    %al, 2(%esp)    # version, buff
        movl    $2, %eax        #,
        movb    %dl, 1(%esp)    # tmp80, buff
        movb    $0, 3(%esp)     #, buff
        call    dmi_get_system_info     #
        testl   %eax, %eax      # D.15514
        jne     .L73    #,
        movl    %esp, %edx      #, tmp81
        movl    $4, %ecx        #,
        movl    $bios_version, %eax     #,
        call    strlcpy #
.L73:
        movl    $4, %ecx        #,
        movl    $bios_version, %edx     #,
        movl    %esp, %eax      #,
        movl    %esp, %ebx      #, tmp82
        call    strncmp #
        testl   %eax, %eax      # D.15513
        je      .L72    #,
        pushl   $bios_version   #
        pushl   %ebx    # tmp82
        pushl   $.LC7   #
        call    printk  #
        addl    $12, %esp       #,
        jmp     .L72    #
.L79:
        pushl   $.LC8   #
        pushl   $.LC9   #
        call    printk  #
        xorl    %eax, %eax      # D.15099
        popl    %ebx    #
        popl    %esi    #
.L69:
        addl    $4, %esp        #,
        popl    %ebx    #
        popl    %esi    #
        ret
.L72:
        pushl   $0      #
        xorl    %ecx, %ecx      #
        xorl    %edx, %edx      #
        movl    $.LC10, %eax    #,
        pushl   $i8k_fops       #
        call    proc_create_data        #
        movl    %eax, %edx      #, proc_i8k
        testl   %edx, %edx      # proc_i8k
        popl    %eax    #
        movl    $-2, %eax       #, D.15099
        popl    %ecx    #
        je      .L69    #,
        jmp     .L79    #
        .size   i8k_init, .-i8k_init
        .section        .exit.text,"ax",@progbits
        .type   i8k_exit, @function
i8k_exit:
        xorl    %edx, %edx      #
        movl    $.LC10, %eax    #,
        jmp     remove_proc_entry       #
        .size   i8k_exit, .-i8k_exit
        .section        .modinfo,"a",@progbits
        .align 4
        .type   __mod_fan_mult83, @object
        .size   __mod_fan_mult83, 48
__mod_fan_mult83:
        .string "parm=fan_mult:Factor to multiply fan speed with"
        .align 4
        .type   __mod_fan_multtype82, @object
        .size   __mod_fan_multtype82, 22
__mod_fan_multtype82:
        .string "parmtype=fan_mult:int"
        .section        __param,"a",@progbits
        .align 4
        .type   __param_fan_mult, @object
        .size   __param_fan_mult, 16
__param_fan_mult:
# name:
        .long   __param_str_fan_mult
# ops:
        .long   param_ops_int
# perm:
        .value  0
# flags:
        .value  0
# <anonymous>:
# arg:
        .long   fan_mult
        .section        .modinfo
        .align 4
        .type   __mod_power_status79, @object
        .size   __mod_power_status79, 51
__mod_power_status79:
        .string "parm=power_status:Report power status in /proc/i8k"
        .align 4
        .type   __mod_power_statustype78, @object
        .size   __mod_power_statustype78, 27
__mod_power_statustype78:
        .string "parmtype=power_status:bool"
        .section        __param
        .align 4
        .type   __param_power_status, @object
        .size   __param_power_status, 16
__param_power_status:
# name:
        .long   __param_str_power_status
# ops:
        .long   param_ops_bool
# perm:
        .value  384
# flags:
        .value  0
# <anonymous>:
# arg:
        .long   power_status
        .section        .modinfo
        .align 4
        .type   __mod_restricted75, @object
        .size   __mod_restricted75, 62
__mod_restricted75:
        .string "parm=restricted:Allow fan control if SYS_ADMIN capability set"
        .align 4
        .type   __mod_restrictedtype74, @object
        .size   __mod_restrictedtype74, 25
__mod_restrictedtype74:
        .string "parmtype=restricted:bool"
        .section        __param
        .align 4
        .type   __param_restricted, @object
        .size   __param_restricted, 16
__param_restricted:
# name:
        .long   __param_str_restricted
# ops:
        .long   param_ops_bool
# perm:
        .value  0
# flags:
        .value  0
# <anonymous>:
# arg:
        .long   restricted
        .section        .modinfo
        .align 4
        .type   __mod_ignore_dmi71, @object
        .size   __mod_ignore_dmi71, 74
__mod_ignore_dmi71:
        .string "parm=ignore_dmi:Continue probing hardware even if DMI data 
does not match"
        .align 4
        .type   __mod_ignore_dmitype70, @object
        .size   __mod_ignore_dmitype70, 25
__mod_ignore_dmitype70:
        .string "parmtype=ignore_dmi:bool"
        .section        __param
        .align 4
        .type   __param_ignore_dmi, @object
        .size   __param_ignore_dmi, 16
__param_ignore_dmi:
# name:
        .long   __param_str_ignore_dmi
# ops:
        .long   param_ops_bool
# perm:
        .value  0
# flags:
        .value  0
# <anonymous>:
# arg:
        .long   ignore_dmi
        .section        .modinfo
        .align 4
        .type   __mod_force67, @object
        .size   __mod_force67, 63
__mod_force67:
        .string "parm=force:Force loading without checking for supported models"
        .align 4
        .type   __mod_forcetype66, @object
        .size   __mod_forcetype66, 20
__mod_forcetype66:
        .string "parmtype=force:bool"
        .section        __param
        .align 4
        .type   __param_force, @object
        .size   __param_force, 16
__param_force:
# name:
        .long   __param_str_force
# ops:
        .long   param_ops_bool
# perm:
        .value  0
# flags:
        .value  0
# <anonymous>:
# arg:
        .long   force
        .section        .modinfo
        .align 4
        .type   __mod_license63, @object
        .size   __mod_license63, 12
__mod_license63:
        .string "license=GPL"
        .align 4
        .type   __mod_description62, @object
        .size   __mod_description62, 58
__mod_description62:
        .string "description=Driver for accessing SMM BIOS on Dell laptops"
        .align 4
        .type   __mod_author61, @object
        .size   __mod_author61, 41
__mod_author61:
        .string "author=Massimo Dal Zotto (d...@debian.org)"
        .data
        .align 4
        .type   fan_mult, @object
        .size   fan_mult, 4
fan_mult:
        .long   30
        .local  power_status
        .comm   power_status,4,4
        .local  restricted
        .comm   restricted,4,4
        .local  ignore_dmi
        .comm   ignore_dmi,4,4
        .local  force
        .comm   force,4,4
        .section        .rodata
        .align 4
        .type   i8k_fops, @object
        .size   i8k_fops, 100
i8k_fops:
# owner:
        .long   __this_module
# llseek:
        .long   seq_lseek
# read:
        .long   seq_read
# unlocked_ioctl:
        .zero   20
        .long   i8k_ioctl
# open:
        .zero   8
        .long   i8k_open_fs
# release:
        .zero   4
        .long   single_release
        .zero   44
        .local  bios_version
        .comm   bios_version,4,4
        .local  prev.12857
        .comm   prev.12857,4,4
        .section        .rodata.str1.1
.LC11:
        .string "Dell Inspiron"
.LC12:
        .string "Dell Latitude"
.LC13:
        .string "Dell Inspiron 2"
.LC14:
        .string "Dell Latitude 2"
.LC15:
        .string "Dell Inspiron 3"
.LC16:
        .string "Dell Precision"
.LC17:
        .string "Dell Vostro"
        .section        .init.data,"aw",@progbits
        .align 4
        .type   i8k_dmi_table, @object
        .size   i8k_dmi_table, 2988
i8k_dmi_table:
# ident:
        .zero   4
        .long   .LC11
# matches:
# slot:
        .byte   4
# substr:
        .string "Dell Computer"
        .zero   65
# slot:
        .byte   5
# substr:
        .string "Inspiron"
        .zero   70
        .zero   160
        .zero   4
# ident:
        .zero   4
        .long   .LC12
# matches:
# slot:
        .byte   4
# substr:
        .string "Dell Computer"
        .zero   65
# slot:
        .byte   5
# substr:
        .string "Latitude"
        .zero   70
        .zero   160
        .zero   4
# ident:
        .zero   4
        .long   .LC13
# matches:
# slot:
        .byte   4
# substr:
        .string "Dell Inc."
        .zero   69
# slot:
        .byte   5
# substr:
        .string "Inspiron"
        .zero   70
        .zero   160
        .zero   4
# ident:
        .zero   4
        .long   .LC14
# matches:
# slot:
        .byte   4
# substr:
        .string "Dell Inc."
        .zero   69
# slot:
        .byte   5
# substr:
        .string "Latitude"
        .zero   70
        .zero   160
        .zero   4
# ident:
        .zero   4
        .long   .LC15
# matches:
# slot:
        .byte   4
# substr:
        .string "Dell Inc."
        .zero   69
# slot:
        .byte   5
# substr:
        .string "MM061"
        .zero   73
        .zero   160
        .zero   4
# ident:
        .zero   4
        .long   .LC15
# matches:
# slot:
        .byte   4
# substr:
        .string "Dell Inc."
        .zero   69
# slot:
        .byte   5
# substr:
        .string "MP061"
        .zero   73
        .zero   160
        .zero   4
# ident:
        .zero   4
        .long   .LC16
# matches:
# slot:
        .byte   4
# substr:
        .string "Dell Inc."
        .zero   69
# slot:
        .byte   5
# substr:
        .string "Precision"
        .zero   69
        .zero   160
        .zero   4
# ident:
        .zero   4
        .long   .LC17
# matches:
# slot:
        .byte   4
# substr:
        .string "Dell Inc."
        .zero   69
# slot:
        .byte   5
# substr:
        .string "Vostro"
        .zero   72
        .zero   160
        .zero   4
        .zero   332
        .section        .rodata
        .align 4
        .type   CSWTCH.30, @object
        .size   CSWTCH.30, 16
CSWTCH.30:
        .long   1
        .long   2
        .long   0
        .long   4
        .align 4
        .type   __param_str_fan_mult, @object
        .size   __param_str_fan_mult, 9
__param_str_fan_mult:
        .string "fan_mult"
        .align 4
        .type   __param_str_power_status, @object
        .size   __param_str_power_status, 13
__param_str_power_status:
        .string "power_status"
        .align 4
        .type   __param_str_restricted, @object
        .size   __param_str_restricted, 11
__param_str_restricted:
        .string "restricted"
        .align 4
        .type   __param_str_ignore_dmi, @object
        .size   __param_str_ignore_dmi, 11
__param_str_ignore_dmi:
        .string "ignore_dmi"
        .align 4
        .type   __param_str_force, @object
        .size   __param_str_force, 6
__param_str_force:
        .string "force"
.globl init_module
        .set    init_module,i8k_init
.globl cleanup_module
        .set    cleanup_module,i8k_exit
        .ident  "GCC: (GNU) 4.5.1"
        .section        .note.GNU-stack,"",@progbits

Reply via email to