diff options
Diffstat (limited to 'arch/x86/boot/main.c')
| -rw-r--r-- | arch/x86/boot/main.c | 39 |
1 files changed, 21 insertions, 18 deletions
diff --git a/arch/x86/boot/main.c b/arch/x86/boot/main.c index 58f0415d3ae0..140172b895bd 100644 --- a/arch/x86/boot/main.c +++ b/arch/x86/boot/main.c | |||
| @@ -2,6 +2,7 @@ | |||
| 2 | * | 2 | * |
| 3 | * Copyright (C) 1991, 1992 Linus Torvalds | 3 | * Copyright (C) 1991, 1992 Linus Torvalds |
| 4 | * Copyright 2007 rPath, Inc. - All Rights Reserved | 4 | * Copyright 2007 rPath, Inc. - All Rights Reserved |
| 5 | * Copyright 2009 Intel Corporation; author H. Peter Anvin | ||
| 5 | * | 6 | * |
| 6 | * This file is part of the Linux kernel, and is made available under | 7 | * This file is part of the Linux kernel, and is made available under |
| 7 | * the terms of the GNU General Public License version 2. | 8 | * the terms of the GNU General Public License version 2. |
| @@ -61,11 +62,10 @@ static void copy_boot_params(void) | |||
| 61 | */ | 62 | */ |
| 62 | static void keyboard_set_repeat(void) | 63 | static void keyboard_set_repeat(void) |
| 63 | { | 64 | { |
| 64 | u16 ax = 0x0305; | 65 | struct biosregs ireg; |
| 65 | u16 bx = 0; | 66 | initregs(&ireg); |
| 66 | asm volatile("int $0x16" | 67 | ireg.ax = 0x0305; |
| 67 | : "+a" (ax), "+b" (bx) | 68 | intcall(0x16, &ireg, NULL); |
| 68 | : : "ecx", "edx", "esi", "edi"); | ||
| 69 | } | 69 | } |
| 70 | 70 | ||
| 71 | /* | 71 | /* |
| @@ -73,18 +73,22 @@ static void keyboard_set_repeat(void) | |||
| 73 | */ | 73 | */ |
| 74 | static void query_ist(void) | 74 | static void query_ist(void) |
| 75 | { | 75 | { |
| 76 | struct biosregs ireg, oreg; | ||
| 77 | |||
| 76 | /* Some older BIOSes apparently crash on this call, so filter | 78 | /* Some older BIOSes apparently crash on this call, so filter |
| 77 | it from machines too old to have SpeedStep at all. */ | 79 | it from machines too old to have SpeedStep at all. */ |
| 78 | if (cpu.level < 6) | 80 | if (cpu.level < 6) |
| 79 | return; | 81 | return; |
| 80 | 82 | ||
| 81 | asm("int $0x15" | 83 | initregs(&ireg); |
| 82 | : "=a" (boot_params.ist_info.signature), | 84 | ireg.ax = 0xe980; /* IST Support */ |
| 83 | "=b" (boot_params.ist_info.command), | 85 | ireg.edx = 0x47534943; /* Request value */ |
| 84 | "=c" (boot_params.ist_info.event), | 86 | intcall(0x15, &ireg, &oreg); |
| 85 | "=d" (boot_params.ist_info.perf_level) | 87 | |
| 86 | : "a" (0x0000e980), /* IST Support */ | 88 | boot_params.ist_info.signature = oreg.eax; |
| 87 | "d" (0x47534943)); /* Request value */ | 89 | boot_params.ist_info.command = oreg.ebx; |
| 90 | boot_params.ist_info.event = oreg.ecx; | ||
| 91 | boot_params.ist_info.perf_level = oreg.edx; | ||
| 88 | } | 92 | } |
| 89 | 93 | ||
| 90 | /* | 94 | /* |
| @@ -93,13 +97,12 @@ static void query_ist(void) | |||
| 93 | static void set_bios_mode(void) | 97 | static void set_bios_mode(void) |
| 94 | { | 98 | { |
| 95 | #ifdef CONFIG_X86_64 | 99 | #ifdef CONFIG_X86_64 |
| 96 | u32 eax, ebx; | 100 | struct biosregs ireg; |
| 97 | 101 | ||
| 98 | eax = 0xec00; | 102 | initregs(&ireg); |
| 99 | ebx = 2; | 103 | ireg.ax = 0xec00; |
| 100 | asm volatile("int $0x15" | 104 | ireg.bx = 2; |
| 101 | : "+a" (eax), "+b" (ebx) | 105 | intcall(0x15, &ireg, NULL); |
| 102 | : : "ecx", "edx", "esi", "edi"); | ||
| 103 | #endif | 106 | #endif |
| 104 | } | 107 | } |
| 105 | 108 | ||
