aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/char/i8k.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/char/i8k.c')
-rw-r--r--drivers/char/i8k.c29
1 files changed, 28 insertions, 1 deletions
diff --git a/drivers/char/i8k.c b/drivers/char/i8k.c
index 179223a17414..3d181021a862 100644
--- a/drivers/char/i8k.c
+++ b/drivers/char/i8k.c
@@ -113,6 +113,33 @@ static int i8k_smm(struct smm_regs *regs)
113 int rc; 113 int rc;
114 int eax = regs->eax; 114 int eax = regs->eax;
115 115
116#if defined(CONFIG_X86_64)
117 asm("pushq %%rax\n\t"
118 "movl 0(%%rax),%%edx\n\t"
119 "pushq %%rdx\n\t"
120 "movl 4(%%rax),%%ebx\n\t"
121 "movl 8(%%rax),%%ecx\n\t"
122 "movl 12(%%rax),%%edx\n\t"
123 "movl 16(%%rax),%%esi\n\t"
124 "movl 20(%%rax),%%edi\n\t"
125 "popq %%rax\n\t"
126 "out %%al,$0xb2\n\t"
127 "out %%al,$0x84\n\t"
128 "xchgq %%rax,(%%rsp)\n\t"
129 "movl %%ebx,4(%%rax)\n\t"
130 "movl %%ecx,8(%%rax)\n\t"
131 "movl %%edx,12(%%rax)\n\t"
132 "movl %%esi,16(%%rax)\n\t"
133 "movl %%edi,20(%%rax)\n\t"
134 "popq %%rdx\n\t"
135 "movl %%edx,0(%%rax)\n\t"
136 "lahf\n\t"
137 "shrl $8,%%eax\n\t"
138 "andl $1,%%eax\n"
139 :"=a"(rc)
140 : "a"(regs)
141 : "%ebx", "%ecx", "%edx", "%esi", "%edi", "memory");
142#else
116 asm("pushl %%eax\n\t" 143 asm("pushl %%eax\n\t"
117 "movl 0(%%eax),%%edx\n\t" 144 "movl 0(%%eax),%%edx\n\t"
118 "push %%edx\n\t" 145 "push %%edx\n\t"
@@ -137,7 +164,7 @@ static int i8k_smm(struct smm_regs *regs)
137 "andl $1,%%eax\n":"=a"(rc) 164 "andl $1,%%eax\n":"=a"(rc)
138 : "a"(regs) 165 : "a"(regs)
139 : "%ebx", "%ecx", "%edx", "%esi", "%edi", "memory"); 166 : "%ebx", "%ecx", "%edx", "%esi", "%edi", "memory");
140 167#endif
141 if (rc != 0 || (regs->eax & 0xffff) == 0xffff || regs->eax == eax) 168 if (rc != 0 || (regs->eax & 0xffff) == 0xffff || regs->eax == eax)
142 return -EINVAL; 169 return -EINVAL;
143 170