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