VirtualBox

Changeset 84752 in vbox for trunk/src/VBox/Devices


Ignore:
Timestamp:
Jun 10, 2020 10:58:33 AM (5 years ago)
Author:
vboxsync
Message:

BIOS: On boot failure, call into INT 18h and report that to the host through the shutdown interface (see bugref:6549).

Location:
trunk/src/VBox/Devices/PC
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/PC/BIOS/apm.c

    r82968 r84752  
    129129 */
    130130
    131 /* Output a null-terminated string to a specified port, without the
    132  * terminating null character.
    133  */
    134 static void apm_out_str_asm(uint16_t port, const char *s);
    135 #pragma aux apm_out_str_asm =   \
    136     "mov    al, [bx]"       \
    137     "next:"                 \
    138     "out    dx, al"         \
    139     "inc    bx"             \
    140     "mov    al, [bx]"       \
    141     "or     al, al"         \
    142     "jnz    next"           \
    143     parm [dx] [bx] modify exact [ax bx] nomemory;
    144 
    145131/* Wrapper to avoid unnecessary inlining. */
    146 void apm_out_str(const char *s, uint16_t port)
     132void apm_out_str(const char *s)
    147133{
    148134    if (*s)
    149         apm_out_str_asm(port, s);
     135        out_ctrl_str_asm(VBOX_BIOS_SHUTDOWN_PORT, s);
    150136}
    151137
     
    200186        switch (CX) {
    201187        case APM_PS_STANDBY:
    202             apm_out_str("Standby", VBOX_BIOS_SHUTDOWN_PORT);
     188            apm_out_str("Standby");
    203189            break;
    204190        case APM_PS_SUSPEND:
    205             apm_out_str("Suspend", VBOX_BIOS_SHUTDOWN_PORT);
     191            apm_out_str("Suspend");
    206192            break;
    207193        case APM_PS_OFF:
    208             apm_out_str("Shutdown", VBOX_BIOS_SHUTDOWN_PORT);  /* Should not return. */
     194            apm_out_str("Shutdown");    /* Should not return. */
    209195            break;
    210196        default:
  • trunk/src/VBox/Devices/PC/BIOS/bios.c

    r82968 r84752  
    5757#include "inlines.h"
    5858#include "biosint.h"
     59#include "VBox/bios.h"
    5960#ifndef VBOX_VERSION_STRING
    6061#include <VBox/version.h>
     
    121122void BIOSCALL int18_panic_msg(void)
    122123{
    123     BX_PANIC("INT18: BOOT FAILURE\n");
     124    BX_INFO("INT18: BOOT FAILURE\n");
     125    out_ctrl_str_asm(VBOX_BIOS_SHUTDOWN_PORT, "Bootfail");
    124126}
    125127
  • trunk/src/VBox/Devices/PC/BIOS/biosint.h

    r82968 r84752  
    286286#ifdef VBOX
    287287#define BX_INFO(...)    do { put_str(BIOS_PRINTF_INFO, bios_prefix_string); bios_printf(BIOS_PRINTF_INFO, __VA_ARGS__); } while (0)
     288#define BX_INFO_CON(...)do { put_str(BIOS_PRINTF_INFO, bios_prefix_string); bios_printf(BIOS_PRINTF_ALL, __VA_ARGS__); } while (0)
    288289#else /* !VBOX */
    289290#define BX_INFO(...)    bios_printf(BIOS_PRINTF_INFO, __VA_ARGS__)
  • trunk/src/VBox/Devices/PC/BIOS/boot.c

    r82968 r84752  
    151151    if (lastdrive==1) {
    152152        if (reason==0)
    153             BX_PANIC("No bootable medium found! System halted.\n");
     153            BX_INFO_CON("No bootable medium found! Please insert a bootable medium and reboot.\n");
    154154        else
    155155            BX_PANIC("Could not read from the boot medium! System halted.\n");
  • trunk/src/VBox/Devices/PC/BIOS/inlines.h

    r82968 r84752  
    9999    "jmp forever"           \
    100100    modify exact [] nomemory aborts;
     101
     102/* Output a null-terminated string to a specified port, without the
     103 * terminating null character.
     104 */
     105static void out_ctrl_str_asm(uint16_t port, const char *s);
     106#pragma aux out_ctrl_str_asm =   \
     107    "mov    al, [bx]"       \
     108    "next:"                 \
     109    "out    dx, al"         \
     110    "inc    bx"             \
     111    "mov    al, [bx]"       \
     112    "or     al, al"         \
     113    "jnz    next"           \
     114    parm [dx] [bx] modify exact [ax bx] nomemory;
    101115
    102116#ifdef __386__
  • trunk/src/VBox/Devices/PC/BIOS/orgs.asm

    r84673 r84752  
    15801580                call    _int18_panic_msg
    15811581                ;; TODO: handle failure better?
     1582                sti
     1583stay_here:
    15821584                hlt
    1583                 iret
     1585                jmp     stay_here
    15841586
    15851587;;
  • trunk/src/VBox/Devices/PC/DevPcBios.cpp

    r83032 r84752  
    155155    /** Boot devices (ordered). */
    156156    DEVPCBIOSBOOT   aenmBootDevice[4];
    157     /** Bochs shutdown index. */
    158     uint32_t        iShutdown;
     157    /** Bochs control string index. */
     158    uint32_t        iControl;
    159159    /** Floppy device. */
    160160    char           *pszFDDevice;
     
    338338    {
    339339        static const unsigned char s_szShutdown[] = "Shutdown";
    340         if (   pThis->iShutdown < sizeof(s_szShutdown) /* paranoia */
    341             && u32 == s_szShutdown[pThis->iShutdown])
    342         {
    343             pThis->iShutdown++;
    344             if (pThis->iShutdown >= 8)
     340        static const unsigned char s_szBootfail[] = "Bootfail";
     341        AssertCompile(sizeof(s_szShutdown) == sizeof(s_szBootfail));
     342
     343        if (pThis->iControl < sizeof(s_szShutdown)) /* paranoia */
     344        {
     345            if (u32 == s_szShutdown[pThis->iControl])
    345346            {
    346                 pThis->iShutdown = 0;
    347                 LogRel(("PcBios: APM shutdown request\n"));
    348                 return PDMDevHlpVMPowerOff(pDevIns);
     347
     348                pThis->iControl++;
     349                if (pThis->iControl >= 8)
     350                {
     351                    pThis->iControl = 0;
     352                    LogRel(("PcBios: APM shutdown request\n"));
     353                    return PDMDevHlpVMPowerOff(pDevIns);
     354                }
    349355            }
     356            else if (u32 == s_szBootfail[pThis->iControl])
     357            {
     358                pThis->iControl++;
     359                if (pThis->iControl >= 8)
     360                {
     361                    pThis->iControl = 0;
     362                    LogRel(("PcBios: Boot failure\n"));
     363                }
     364            }
     365            else
     366                pThis->iControl = 0;
    350367        }
    351368        else
    352             pThis->iShutdown = 0;
     369            pThis->iControl = 0;
    353370    }
    354371    /* else: not in use. */
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette