VirtualBox

source: vbox/trunk/src/VBox/Devices/PC/BIOS-new/MakeDebianBiosAssembly.cpp@ 41316

Last change on this file since 41316 was 41316, checked in by vboxsync, 13 years ago

A few minutes of code in between other things.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 7.6 KB
Line 
1/* $Id: MakeDebianBiosAssembly.cpp 41316 2012-05-15 14:44:36Z vboxsync $ */
2/** @file
3 * MakeDebianBiosAssembly - Generate Assembly Source for Debian-minded Distros.
4 */
5
6/*
7 * Copyright (C) 2012 Oracle Corporation
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 */
17
18
19/*******************************************************************************
20* Header Files *
21*******************************************************************************/
22#include <iprt/buildconfig.h>
23#include <iprt/file.h>
24#include <iprt/getopt.h>
25#include <iprt/initterm.h>
26#include <iprt/mem.h>
27#include <iprt/message.h>
28#include <iprt/string.h>
29#include <iprt/stream.h>
30
31
32/*******************************************************************************
33* Global Variables *
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}
159
160
161int main(int argc, char **argv)
162{
163 int rc = RTR3InitExe(argc, &argv, 0);
164 if (RT_FAILURE(rc))
165 return RTMsgInitFailure(rc);
166
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 TracBrowser for help on using the repository browser.

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