Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fe04f22f authored by Bradley Smith's avatar Bradley Smith Committed by Linus Torvalds
Browse files

I8K: allow i8k driver to be built on x86_64 systems



Adds #if clause and additional inline assembly so that the driver
builds on x86_64 systems.

Signed-off-by: default avatarBradley Smith <bradjsmith@btinternet.com>
Cc: Frank Sorenson <frank@tuxrocks.com>
Cc: Jeff Garzik <jeff@garzik.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 9a7744f9
Loading
Loading
Loading
Loading
+28 −1
Original line number Original line Diff line number Diff line
@@ -113,6 +113,33 @@ static int i8k_smm(struct smm_regs *regs)
	int rc;
	int rc;
	int eax = regs->eax;
	int eax = regs->eax;


#if defined(CONFIG_X86_64)
	asm("pushq %%rax\n\t"
		"movl 0(%%rax),%%edx\n\t"
		"pushq %%rdx\n\t"
		"movl 4(%%rax),%%ebx\n\t"
		"movl 8(%%rax),%%ecx\n\t"
		"movl 12(%%rax),%%edx\n\t"
		"movl 16(%%rax),%%esi\n\t"
		"movl 20(%%rax),%%edi\n\t"
		"popq %%rax\n\t"
		"out %%al,$0xb2\n\t"
		"out %%al,$0x84\n\t"
		"xchgq %%rax,(%%rsp)\n\t"
		"movl %%ebx,4(%%rax)\n\t"
		"movl %%ecx,8(%%rax)\n\t"
		"movl %%edx,12(%%rax)\n\t"
		"movl %%esi,16(%%rax)\n\t"
		"movl %%edi,20(%%rax)\n\t"
		"popq %%rdx\n\t"
		"movl %%edx,0(%%rax)\n\t"
		"lahf\n\t"
		"shrl $8,%%eax\n\t"
		"andl $1,%%eax\n"
		:"=a"(rc)
		:    "a"(regs)
		:    "%ebx", "%ecx", "%edx", "%esi", "%edi", "memory");
#else
	asm("pushl %%eax\n\t"
	asm("pushl %%eax\n\t"
	    "movl 0(%%eax),%%edx\n\t"
	    "movl 0(%%eax),%%edx\n\t"
	    "push %%edx\n\t"
	    "push %%edx\n\t"
@@ -137,7 +164,7 @@ static int i8k_smm(struct smm_regs *regs)
	    "andl $1,%%eax\n":"=a"(rc)
	    "andl $1,%%eax\n":"=a"(rc)
	    :    "a"(regs)
	    :    "a"(regs)
	    :    "%ebx", "%ecx", "%edx", "%esi", "%edi", "memory");
	    :    "%ebx", "%ecx", "%edx", "%esi", "%edi", "memory");

#endif
	if (rc != 0 || (regs->eax & 0xffff) == 0xffff || regs->eax == eax)
	if (rc != 0 || (regs->eax & 0xffff) == 0xffff || regs->eax == eax)
		return -EINVAL;
		return -EINVAL;