--- qemu/roms/seabios/src/romlayout.S 2018/04/24 18:58:43 1.1.1.4 +++ qemu/roms/seabios/src/romlayout.S 2018/04/24 19:43:33 1.1.1.6 @@ -1,18 +1,10 @@ // Rom layout and bios assembler to C interface. // -// Copyright (C) 2008,2009 Kevin O'Connor +// Copyright (C) 2008-2012 Kevin O'Connor // Copyright (C) 2002 MandrakeSoft S.A. // // This file may be distributed under the terms of the GNU LGPLv3 license. - -/**************************************************************** - * Include of 16bit C code - ****************************************************************/ - - .code16gcc -#include "ccode.16.s" - #include "config.h" // CONFIG_* #include "ioport.h" // PORT_A20 #include "bregs.h" // CR0_* @@ -29,6 +21,7 @@ // %edx = return location (in 32bit mode) // Clobbers: ecx, flags, segment registers, cr0, idt/gdt DECLFUNC transition32 + .code16gcc transition32: movl %eax, %ecx @@ -230,64 +223,25 @@ __call16big_from32: /**************************************************************** - * POST entry point + * Misc. entry points. ****************************************************************/ - DECLFUNC entry_post -entry_post: - // Enable cache - movl %cr0, %eax - andl $~(CR0_CD|CR0_NW), %eax - movl %eax, %cr0 - +// Resume (and reboot) entry point - called from entry_post + DECLFUNC entry_resume +entry_resume: // Disable interrupts cli cld - - // Check for restart indicator. - movl $CMOS_RESET_CODE|NMI_DISABLE_BIT, %eax - outb %al, $PORT_CMOS_INDEX - inb $PORT_CMOS_DATA, %al - cmpb $0x0, %al - jnz 1f - - // Normal entry point - ENTRY_INTO32 _cfunc32flat__start - - // Entry point when a post call looks like a resume. -1: - // Save old shutdown status. - movl %eax, %ebx - - // Clear shutdown status register. - movl $CMOS_RESET_CODE|NMI_DISABLE_BIT, %eax - outb %al, $PORT_CMOS_INDEX - xorl %eax, %eax - outb %al, $PORT_CMOS_DATA - // Use a stack in EBDA movw $SEG_BDA, %ax movw %ax, %ds movw BDA_ebda_seg, %ax - - cmpw $EBDA_SEGMENT_START, %ax - jle 2f - // EBDA segment doesn't look valid - use startup value. - movw $EBDA_SEGMENT_START, %ax - -2: movw %ax, %ds + movw %ax, %ds movw %ax, %ss movl $EBDA_OFFSET_TOP_STACK, %esp - // Call handler. - movl %ebx, %eax jmp handle_resume - -/**************************************************************** - * Misc. entry points. - ****************************************************************/ - // PMM entry point DECLFUNC entry_pmm entry_pmm: @@ -303,8 +257,10 @@ entry_pmm: pushw %ds movw %ss, %cx // Move %ss to %ds movw %cx, %ds - leal 28(%esp), %eax // %eax points to start of args - calll handle_pmm + movl $_cfunc32flat_handle_pmm, %eax // Setup: call32(handle_pmm, args, -1) + leal 28(%esp), %edx // %edx points to start of args + movl $-1, %ecx + calll call32 movw %ax, 12(%esp) // Modify %ax:%dx to return %eax shrl $16, %eax movw %ax, 4(%esp) @@ -350,8 +306,8 @@ entry_pnp_real: lretw // APM entry points - DECLFUNC apm16protected_entry -apm16protected_entry: + DECLFUNC entry_apm16 +entry_apm16: pushfw // save flags pushl %eax // dummy ENTRY_ARG handle_apm16 @@ -360,8 +316,8 @@ apm16protected_entry: lretw .code32 - DECLFUNC apm32protected_entry -apm32protected_entry: + DECLFUNC entry_apm32 +entry_apm32: pushfl pushl %gs pushl %cs // Move second descriptor after %cs to %gs @@ -373,8 +329,8 @@ apm32protected_entry: lretl // PCI-BIOS 32bit entry point - DECLFUNC pcibios32_entry -pcibios32_entry: + DECLFUNC entry_pcibios32 +entry_pcibios32: pushfl pushl %gs // Backup %gs and set %gs=%ds pushl %ds @@ -385,8 +341,8 @@ pcibios32_entry: lretl // BIOS32 support - EXPORTFUNC bios32_entry -bios32_entry: + EXPORTFUNC entry_bios32 +entry_bios32: pushfl #if CONFIG_PCIBIOS // Check for PCI-BIOS request @@ -394,7 +350,7 @@ bios32_entry: jne 1f movl $BUILD_BIOS_ADDR, %ebx movl $BUILD_BIOS_SIZE, %ecx - movl $pcibios32_entry, %edx + movl $entry_pcibios32, %edx xorb %al, %al jmp 2f #endif @@ -405,8 +361,8 @@ bios32_entry: lretl // 32bit elf entry point - EXPORTFUNC post32 -post32: + EXPORTFUNC entry_elf +entry_elf: cli cld lidtl (BUILD_BIOS_ADDR + pmode_IDT_info) @@ -418,7 +374,7 @@ post32: movw %ax, %gs movw %ax, %ss movl $BUILD_STACK_ADDR, %esp - ljmpl $SEG32_MODE32_CS, $_cfunc32flat__start + ljmpl $SEG32_MODE32_CS, $_cfunc32flat_handle_post .code16gcc @@ -494,8 +450,10 @@ entry_18: .endm ORG 0xe05b -entry_post_official: - jmp entry_post +entry_post: + cmpl $0, %cs:HaveRunPost // Check for resume/reboot + jnz entry_resume + ENTRY_INTO32 _cfunc32flat_handle_post // Normal entry point ORG 0xe2c3 IRQ_ENTRY 02 @@ -578,7 +536,7 @@ entry_iret_official: ORG 0xfff0 // Power-up Entry Point .global reset_vector reset_vector: - ljmpw $SEG_BIOS, $entry_post_official + ljmpw $SEG_BIOS, $entry_post // 0xfff5 - BiosDate in misc.c