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