14d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima///////////////////////////////////////////////////////////////////////// 24d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// $Id$ 34d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima///////////////////////////////////////////////////////////////////////// 44d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// 54d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// 32 bit Bochs BIOS init code 64d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// Copyright (C) 2006 Fabrice Bellard 74d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// 84d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// This library is free software; you can redistribute it and/or 94d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// modify it under the terms of the GNU Lesser General Public 104d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// License as published by the Free Software Foundation; either 114d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// version 2 of the License, or (at your option) any later version. 124d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// 134d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// This library is distributed in the hope that it will be useful, 144d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// but WITHOUT ANY WARRANTY; without even the implied warranty of 154d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 164d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// Lesser General Public License for more details. 174d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// 184d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// You should have received a copy of the GNU Lesser General Public 194d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// License along with this library; if not, write to the Free Software 204d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 214d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima#include "rombios.h" 224d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 234d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.globl _start 244d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.globl smp_ap_boot_code_start 254d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.globl smp_ap_boot_code_end 264d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.global smm_relocation_start 274d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.global smm_relocation_end 284d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.global smm_code_start 294d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima.global smm_code_end 304d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 314d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima_start: 324d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima /* clear bss section */ 334d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima xor %eax, %eax 344d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov $__bss_start, %edi 354d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov $__bss_end, %ecx 364d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima sub %edi, %ecx 374d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima rep stosb 384d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 394d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima /* copy data section */ 404d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov $_end, %esi 414d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov $__data_start, %edi 424d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov $__data_end, %ecx 434d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima sub %edi, %ecx 444d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima rep movsb 454d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 464d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jmp rombios32_init 474d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 484d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima .code16 494d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimasmp_ap_boot_code_start: 504d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cli 514d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima xor %ax, %ax 524d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov %ax, %ds 534d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 544d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov $SMP_MSR_ADDR, %ebx 554d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima11: 564d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov 0(%ebx), %ecx 574d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima test %ecx, %ecx 584d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jz 12f 594d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov 4(%ebx), %eax 604d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov 8(%ebx), %edx 614d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima wrmsr 624d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima add $12, %ebx 634d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jmp 11b 644d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima12: 654d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 664d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima lock incw smp_cpus 674d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima1: 684d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima hlt 694d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jmp 1b 704d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimasmp_ap_boot_code_end: 714d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 724d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima/* code to relocate SMBASE to 0xa0000 */ 734d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimasmm_relocation_start: 744d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov $0x38000 + 0x7efc, %ebx 754d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima addr32 mov (%ebx), %al /* revision ID to see if x86_64 or x86 */ 764d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp $0x64, %al 774d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima je 1f 784d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov $0x38000 + 0x7ef8, %ebx 794d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jmp 2f 804d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima1: 814d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov $0x38000 + 0x7f00, %ebx 824d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima2: 834d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima movl $0xa0000, %eax 844d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima addr32 movl %eax, (%ebx) 854d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima /* indicate to the BIOS that the SMM code was executed */ 864d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov $0x00, %al 874d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima movw $0xb3, %dx 884d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outb %al, %dx 894d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima rsm 904d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimasmm_relocation_end: 914d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 924d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima/* minimal SMM code to enable or disable ACPI */ 934d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimasmm_code_start: 944d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima movw $0xb2, %dx 954d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima inb %dx, %al 964d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp $0xf0, %al 974d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jne 1f 984d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 994d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima /* ACPI disable */ 1004d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov $PM_IO_BASE + 0x04, %dx /* PMCNTRL */ 1014d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima inw %dx, %ax 1024d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima andw $~1, %ax 1034d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outw %ax, %dx 1044d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 1054d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jmp 2f 1064d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 1074d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima1: 1084d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima cmp $0xf1, %al 1094d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima jne 2f 1104d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 1114d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima /* ACPI enable */ 1124d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima mov $PM_IO_BASE + 0x04, %dx /* PMCNTRL */ 1134d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima inw %dx, %ax 1144d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima orw $1, %ax 1154d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima outw %ax, %dx 1164d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima 1174d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima2: 1184d07f569799aaae0d7fccf8e76386d450664987fJun Nakajima rsm 1194d07f569799aaae0d7fccf8e76386d450664987fJun Nakajimasmm_code_end: 120