VirtualBox

Changeset 41316 in vbox


Ignore:
Timestamp:
May 15, 2012 2:44:36 PM (13 years ago)
Author:
vboxsync
Message:

A few minutes of code in between other things.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/PC/BIOS-new/MakeDebianBiosAssembly.cpp

    r41088 r41316  
    11/* $Id$ */
    22/** @file
    3  * MakeDebianBiosAssembly - Generate Assembly Source for Debian Minded Distros.
     3 * MakeDebianBiosAssembly - Generate Assembly Source for Debian-minded Distros.
    44 */
    55
     
    2020*   Header Files                                                               *
    2121*******************************************************************************/
     22#include <iprt/buildconfig.h>
     23#include <iprt/file.h>
    2224#include <iprt/getopt.h>
    2325#include <iprt/initterm.h>
     
    3133*   Global Variables                                                           *
    3234*******************************************************************************/
    33 
    34 
     35static unsigned g_cVerbose = 1 /*0*/;
     36/** Pointer to the BIOS image. */
     37static uint8_t const   *g_pbImg;
     38/** The size of the BIOS image. */
     39static size_t           g_cbImg;
     40
     41
     42
     43static RTEXITCODE DisassembleBiosImage(void)
     44{
     45    return RTMsgErrorExit(RTEXITCODE_FAILURE, "DisassembleBiosImage is not implemented");
     46}
     47
     48static RTEXITCODE OpenOutputFile(const char *pszOutput)
     49{
     50    return RTMsgErrorExit(RTEXITCODE_FAILURE, "OpenOutputFile is not implemented");
     51}
     52
     53
     54static int SkipEmptyLines(PRTSTREAM hStrm, uint32_t *piLine)
     55{
     56    for (;;)
     57    {
     58        char szLine[16384];
     59        int rc = RTStrmGetLine(hStrm, szLine, sizeof(szLine));
     60        if (RT_FAILURE(rc))
     61        {
     62            RTMsgError("Error read map-file header: %Rrc", rc);
     63            return rc;
     64        }
     65
     66        *piLine += 1;
     67        const char *psz = RTStrStrip(szLine);
     68        if (*psz)
     69            return VINF_SUCCESS;
     70    }
     71}
     72
     73
     74static int SkipNonEmptyLines(PRTSTREAM hStrm, uint32_t *piLine)
     75{
     76    for (;;)
     77    {
     78        char szLine[16384];
     79        int rc = RTStrmGetLine(hStrm, szLine, sizeof(szLine));
     80        if (RT_FAILURE(rc))
     81        {
     82            RTMsgError("Error read map-file header: %Rrc", rc);
     83            return rc;
     84        }
     85
     86        *piLine += 1;
     87        const char *psz = RTStrStrip(szLine);
     88        if (!*psz)
     89            return VINF_SUCCESS;
     90    }
     91}
     92
     93static RTEXITCODE ParseMapFileInner(const char *pszBiosMap, PRTSTREAM hStrm)
     94{
     95    uint32_t    iLine = 1;
     96    char        szLine[16384];
     97    const char *psz;
     98
     99    /*
     100     * Read the header.
     101     */
     102    int rc = RTStrmGetLine(hStrm, szLine, sizeof(szLine));
     103    if (RT_FAILURE(rc))
     104        return RTMsgErrorExit(RTEXITCODE_FAILURE, "Error read map-file header: %Rrc", rc);
     105    if (strncmp(szLine, RT_STR_TUPLE("Open Watcom Linker Version")))
     106        return RTMsgErrorExit(RTEXITCODE_FAILURE, "Unexpected map-file header: '%s'", szLine);
     107    rc = SkipNonEmptyLines(hStrm, &iLine);
     108
     109
     110
     111    return RTMsgErrorExit(RTEXITCODE_FAILURE, "ParseMapFileInner is not fully implemented");
     112}
     113
     114
     115
     116/**
     117 * Parses the linker map file for the BIOS.
     118 *
     119 * This is generated by the Watcom linker.
     120 *
     121 * @returns RTEXITCODE_SUCCESS or RTEXITCODE_FAILURE+msg.
     122 * @param   pszBiosMap          Path to the map file.
     123 */
     124static RTEXITCODE ParseMapFile(const char *pszBiosMap)
     125{
     126    PRTSTREAM hStrm;
     127    int rc = RTStrmOpen(pszBiosMap, "rt", &hStrm);
     128    if (RT_FAILURE(rc))
     129        return RTMsgErrorExit(RTEXITCODE_FAILURE, "Error opening '%s': %Rrc", pszBiosMap, rc);
     130    RTEXITCODE rcExit = ParseMapFileInner(pszBiosMap, hStrm);
     131    RTStrmClose(hStrm);
     132    return rcExit;
     133}
     134
     135
     136/**
     137 * Reads the BIOS image into memory (g_pbImg and g_cbImg).
     138 *
     139 * @returns RTEXITCODE_SUCCESS or RTEXITCODE_FAILURE+msg.
     140 * @param   pszBiosImg          Path to the image file.
     141 */
     142static RTEXITCODE ReadBiosImage(const char *pszBiosImg)
     143{
     144    void  *pvImg;
     145    size_t cbImg;
     146    int rc = RTFileReadAll(pszBiosImg, &pvImg, &cbImg);
     147    if (RT_FAILURE(rc))
     148        return RTMsgErrorExit(RTEXITCODE_FAILURE, "Error reading '%s': %Rrc", pszBiosImg, rc);
     149    if (cbImg != _64K)
     150    {
     151        RTFileReadAllFree(pvImg, cbImg);
     152        return RTMsgErrorExit(RTEXITCODE_FAILURE, "The BIOS image %u bytes intead of 64KB", cbImg);
     153    }
     154
     155    g_pbImg = (uint8_t *)pvImg;
     156    g_cbImg = cbImg;
     157    return RTEXITCODE_SUCCESS;
     158}
    35159
    36160
     
    41165        return RTMsgInitFailure(rc);
    42166
    43     RTMsgError("Not implemented\n");
    44     return RTEXITCODE_FAILURE;
    45 }
    46 
     167    /*
     168     * Option config.
     169     */
     170    static RTGETOPTDEF const s_aOpts[] =
     171    {
     172        { "--bios-image",               'i',                    RTGETOPT_REQ_STRING },
     173        { "--bios-map",                 'm',                    RTGETOPT_REQ_STRING },
     174        { "--output",                   'o',                    RTGETOPT_REQ_STRING },
     175        { "--verbose",                  'v',                    RTGETOPT_REQ_NOTHING },
     176        { "--quiet",                    'q',                    RTGETOPT_REQ_NOTHING },
     177    };
     178
     179    const char *pszBiosMap = NULL;
     180    const char *pszBiosImg = NULL;
     181    const char *pszOutput  = NULL;
     182
     183    RTGETOPTUNION   ValueUnion;
     184    RTGETOPTSTATE   GetOptState;
     185    rc = RTGetOptInit(&GetOptState, argc, argv, &s_aOpts[0], RT_ELEMENTS(s_aOpts), 1, RTGETOPTINIT_FLAGS_OPTS_FIRST);
     186    AssertReleaseRCReturn(rc, RTEXITCODE_FAILURE);
     187
     188    /*
     189     * Process the options.
     190     */
     191    while ((rc = RTGetOpt(&GetOptState, &ValueUnion)) != 0)
     192    {
     193        switch (rc)
     194        {
     195            case 'i':
     196                if (pszBiosImg)
     197                    return RTMsgErrorExit(RTEXITCODE_SYNTAX, "--bios-image is given more than once");
     198                pszBiosImg = ValueUnion.psz;
     199                break;
     200
     201            case 'm':
     202                if (pszBiosMap)
     203                    return RTMsgErrorExit(RTEXITCODE_SYNTAX, "--bios-map is given more than once");
     204                pszBiosMap = ValueUnion.psz;
     205                break;
     206
     207            case 'o':
     208                if (pszOutput)
     209                    return RTMsgErrorExit(RTEXITCODE_SYNTAX, "--output is given more than once");
     210                pszOutput = ValueUnion.psz;
     211                break;
     212
     213            case 'v':
     214                g_cVerbose++;
     215                break;
     216
     217            case 'q':
     218                g_cVerbose = 0;
     219                break;
     220
     221            case 'H':
     222                RTPrintf("usage: %Rbn --bios-image <file.img> --bios-map <file.map> [--output <file.asm>]\n",
     223                         argv[0]);
     224                return RTEXITCODE_SUCCESS;
     225
     226            case 'V':
     227            {
     228                /* The following is assuming that svn does it's job here. */
     229                RTPrintf("r%u\n", RTBldCfgRevision());
     230                return RTEXITCODE_SUCCESS;
     231            }
     232
     233            default:
     234                return RTGetOptPrintError(rc, &ValueUnion);
     235        }
     236    }
     237
     238    /*
     239     * Got it all?
     240     */
     241    if (!pszBiosImg)
     242        return RTMsgErrorExit(RTEXITCODE_SYNTAX, "--bios-image is required");
     243    if (!pszBiosMap)
     244        return RTMsgErrorExit(RTEXITCODE_SYNTAX, "--bios-map is required");
     245
     246    /*
     247     * Do the job.
     248     */
     249    RTEXITCODE rcExit;
     250    rcExit = ReadBiosImage(pszBiosImg);
     251    if (rcExit == RTEXITCODE_SUCCESS)
     252        rcExit = ParseMapFile(pszBiosMap);
     253    if (rcExit == RTEXITCODE_SUCCESS)
     254        rcExit = OpenOutputFile(pszOutput);
     255    if (rcExit == RTEXITCODE_SUCCESS)
     256        rcExit = DisassembleBiosImage();
     257
     258    return rcExit;
     259}
     260
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