Changeset 41316 in vbox
- Timestamp:
- May 15, 2012 2:44:36 PM (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/PC/BIOS-new/MakeDebianBiosAssembly.cpp
r41088 r41316 1 1 /* $Id$ */ 2 2 /** @file 3 * MakeDebianBiosAssembly - Generate Assembly Source for Debian Minded Distros.3 * MakeDebianBiosAssembly - Generate Assembly Source for Debian-minded Distros. 4 4 */ 5 5 … … 20 20 * Header Files * 21 21 *******************************************************************************/ 22 #include <iprt/buildconfig.h> 23 #include <iprt/file.h> 22 24 #include <iprt/getopt.h> 23 25 #include <iprt/initterm.h> … … 31 33 * Global Variables * 32 34 *******************************************************************************/ 33 34 35 static unsigned g_cVerbose = 1 /*0*/; 36 /** Pointer to the BIOS image. */ 37 static uint8_t const *g_pbImg; 38 /** The size of the BIOS image. */ 39 static size_t g_cbImg; 40 41 42 43 static RTEXITCODE DisassembleBiosImage(void) 44 { 45 return RTMsgErrorExit(RTEXITCODE_FAILURE, "DisassembleBiosImage is not implemented"); 46 } 47 48 static RTEXITCODE OpenOutputFile(const char *pszOutput) 49 { 50 return RTMsgErrorExit(RTEXITCODE_FAILURE, "OpenOutputFile is not implemented"); 51 } 52 53 54 static 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 74 static 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 93 static 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 */ 124 static 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 */ 142 static 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 } 35 159 36 160 … … 41 165 return RTMsgInitFailure(rc); 42 166 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.