1///////////////////////////////////////////////////////////////////////// 2// $Id$ 3///////////////////////////////////////////////////////////////////////// 4// 5// 32 bit Bochs BIOS init code 6// Copyright (C) 2006 Fabrice Bellard 7// 8// This library is free software; you can redistribute it and/or 9// modify it under the terms of the GNU Lesser General Public 10// License as published by the Free Software Foundation; either 11// version 2 of the License, or (at your option) any later version. 12// 13// This library is distributed in the hope that it will be useful, 14// but WITHOUT ANY WARRANTY; without even the implied warranty of 15// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16// Lesser General Public License for more details. 17// 18// You should have received a copy of the GNU Lesser General Public 19// License along with this library; if not, write to the Free Software 20// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 21#include "rombios.h" 22 23.globl _start 24.globl smp_ap_boot_code_start 25.globl smp_ap_boot_code_end 26.global smm_relocation_start 27.global smm_relocation_end 28.global smm_code_start 29.global smm_code_end 30 31_start: 32 /* clear bss section */ 33 xor %eax, %eax 34 mov $__bss_start, %edi 35 mov $__bss_end, %ecx 36 sub %edi, %ecx 37 rep stosb 38 39 /* copy data section */ 40 mov $_end, %esi 41 mov $__data_start, %edi 42 mov $__data_end, %ecx 43 sub %edi, %ecx 44 rep movsb 45 46 jmp rombios32_init 47 48 .code16 49smp_ap_boot_code_start: 50 cli 51 xor %ax, %ax 52 mov %ax, %ds 53 54 mov $SMP_MSR_ADDR, %ebx 5511: 56 mov 0(%ebx), %ecx 57 test %ecx, %ecx 58 jz 12f 59 mov 4(%ebx), %eax 60 mov 8(%ebx), %edx 61 wrmsr 62 add $12, %ebx 63 jmp 11b 6412: 65 66 lock incw smp_cpus 671: 68 hlt 69 jmp 1b 70smp_ap_boot_code_end: 71 72/* code to relocate SMBASE to 0xa0000 */ 73smm_relocation_start: 74 mov $0x38000 + 0x7efc, %ebx 75 addr32 mov (%ebx), %al /* revision ID to see if x86_64 or x86 */ 76 cmp $0x64, %al 77 je 1f 78 mov $0x38000 + 0x7ef8, %ebx 79 jmp 2f 801: 81 mov $0x38000 + 0x7f00, %ebx 822: 83 movl $0xa0000, %eax 84 addr32 movl %eax, (%ebx) 85 /* indicate to the BIOS that the SMM code was executed */ 86 mov $0x00, %al 87 movw $0xb3, %dx 88 outb %al, %dx 89 rsm 90smm_relocation_end: 91 92/* minimal SMM code to enable or disable ACPI */ 93smm_code_start: 94 movw $0xb2, %dx 95 inb %dx, %al 96 cmp $0xf0, %al 97 jne 1f 98 99 /* ACPI disable */ 100 mov $PM_IO_BASE + 0x04, %dx /* PMCNTRL */ 101 inw %dx, %ax 102 andw $~1, %ax 103 outw %ax, %dx 104 105 jmp 2f 106 1071: 108 cmp $0xf1, %al 109 jne 2f 110 111 /* ACPI enable */ 112 mov $PM_IO_BASE + 0x04, %dx /* PMCNTRL */ 113 inw %dx, %ax 114 orw $1, %ax 115 outw %ax, %dx 116 1172: 118 rsm 119smm_code_end: 120