125e9651afb26a004a9debda42da3f90234cc05e2Lang Hames///////////////////////////////////////////////////////////////////////// 225e9651afb26a004a9debda42da3f90234cc05e2Lang Hames// $Id$ 325e9651afb26a004a9debda42da3f90234cc05e2Lang Hames///////////////////////////////////////////////////////////////////////// 425e9651afb26a004a9debda42da3f90234cc05e2Lang Hames// 525e9651afb26a004a9debda42da3f90234cc05e2Lang Hames// 32 bit Bochs BIOS init code 625e9651afb26a004a9debda42da3f90234cc05e2Lang Hames// Copyright (C) 2006 Fabrice Bellard 725e9651afb26a004a9debda42da3f90234cc05e2Lang Hames// 825e9651afb26a004a9debda42da3f90234cc05e2Lang Hames// This library is free software; you can redistribute it and/or 925e9651afb26a004a9debda42da3f90234cc05e2Lang Hames// modify it under the terms of the GNU Lesser General Public 103ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames// License as published by the Free Software Foundation; either 113ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames// version 2 of the License, or (at your option) any later version. 123ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames// 133ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames// This library is distributed in the hope that it will be useful, 143ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames// but WITHOUT ANY WARRANTY; without even the implied warranty of 153ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 163ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames// Lesser General Public License for more details. 173ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames// 183ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames// You should have received a copy of the GNU Lesser General Public 193ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames// License along with this library; if not, write to the Free Software 203ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 213ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames#include "rombios.h" 223ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames 233ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames.globl _start 243ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames.globl smp_ap_boot_code_start 253ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames.globl smp_ap_boot_code_end 263ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames.global smm_relocation_start 273ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames.global smm_relocation_end 283ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames.global smm_code_start 293ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames.global smm_code_end 303ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames 313ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames_start: 323ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames /* clear bss section */ 333ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames xor %eax, %eax 343ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames mov $__bss_start, %edi 353ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames mov $__bss_end, %ecx 363ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames sub %edi, %ecx 373ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames rep stosb 383ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames 393ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames /* copy data section */ 403ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames mov $_end, %esi 413ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames mov $__data_start, %edi 423ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames mov $__data_end, %ecx 433ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames sub %edi, %ecx 443ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames rep movsb 453ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames 463ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames jmp rombios32_init 473ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames 483ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames .code16 493ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hamessmp_ap_boot_code_start: 503ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames cli 513ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames xor %ax, %ax 523ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames mov %ax, %ds 533ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames 543ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames mov $SMP_MSR_ADDR, %ebx 553ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames11: 563ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames mov 0(%ebx), %ecx 573ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames test %ecx, %ecx 583ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames jz 12f 593ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames mov 4(%ebx), %eax 603ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames mov 8(%ebx), %edx 613ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames wrmsr 623ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames add $12, %ebx 633ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames jmp 11b 643ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames12: 653ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames 663ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames lock incw smp_cpus 673ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames1: 683ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames hlt 693ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames jmp 1b 703ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hamessmp_ap_boot_code_end: 713ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames 723ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames/* code to relocate SMBASE to 0xa0000 */ 733ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hamessmm_relocation_start: 743ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames mov $0x38000 + 0x7efc, %ebx 753ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames addr32 mov (%ebx), %al /* revision ID to see if x86_64 or x86 */ 763ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames cmp $0x64, %al 773ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames je 1f 783ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames mov $0x38000 + 0x7ef8, %ebx 793ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames jmp 2f 803ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames1: 813ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames mov $0x38000 + 0x7f00, %ebx 823ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames2: 833ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames movl $0xa0000, %eax 843ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames addr32 movl %eax, (%ebx) 853ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames /* indicate to the BIOS that the SMM code was executed */ 863ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames mov $0x00, %al 873ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames movw $0xb3, %dx 883ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames outb %al, %dx 893ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames rsm 903ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hamessmm_relocation_end: 913ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames 923ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames/* minimal SMM code to enable or disable ACPI */ 933ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hamessmm_code_start: 943ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames movw $0xb2, %dx 953ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames inb %dx, %al 963ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames cmp $0xf0, %al 973ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames jne 1f 983ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames 993ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames /* ACPI disable */ 1003ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames mov $PM_IO_BASE + 0x04, %dx /* PMCNTRL */ 1013ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames inw %dx, %ax 1023ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames andw $~1, %ax 1033ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames outw %ax, %dx 1043ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames 1053ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames jmp 2f 1063ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames 1073ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames1: 1083ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames cmp $0xf1, %al 1093ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames jne 2f 1103ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames 1113ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames /* ACPI enable */ 1123ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames mov $PM_IO_BASE + 0x04, %dx /* PMCNTRL */ 1133ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames inw %dx, %ax 1143ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames orw $1, %ax 1153ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames outw %ax, %dx 1163ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames 1173ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames2: 1183ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames rsm 1193ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hamessmm_code_end: 1203ca9a5bb440033db33cc5fa3318fa7f6f7c6a1ebLang Hames