347 lines
5.7 KiB
C
347 lines
5.7 KiB
C
/*++
|
||
|
||
Copyright (c) 1997 Microsoft Corporation
|
||
|
||
Module Name:
|
||
|
||
acpiuasm.c
|
||
|
||
Abstract:
|
||
|
||
Test wrapper for the unassembler
|
||
|
||
Author:
|
||
|
||
Stephane Plante
|
||
Based on code by Ken Reneris
|
||
|
||
Environment:
|
||
|
||
User
|
||
|
||
Revision History:
|
||
|
||
--*/
|
||
|
||
#include "acpiuasm.h"
|
||
|
||
IFILE Orig; // Image of original aml file
|
||
BOOLEAN Verbose;
|
||
BOOLEAN ArgsParsed;
|
||
|
||
int
|
||
__cdecl
|
||
main(
|
||
IN int argc,
|
||
IN char *argv[]
|
||
)
|
||
{
|
||
//
|
||
// Init globals
|
||
//
|
||
Orig.Desc = "original image";
|
||
|
||
//
|
||
// Parse args
|
||
//
|
||
ParseArgs(argc, argv);
|
||
|
||
//
|
||
// Check the image header
|
||
//
|
||
CheckImageHeader(
|
||
&Orig
|
||
);
|
||
|
||
//
|
||
// Debug the image
|
||
//
|
||
return ScopeParser(
|
||
(PUCHAR) (Orig.Image + sizeof(DSDT)),
|
||
Orig.FileSize,
|
||
(ULONG) ( 0 - (ULONG) Orig.Image - sizeof(DSDT) ),
|
||
0
|
||
);
|
||
|
||
}
|
||
|
||
VOID
|
||
CheckImageHeader (
|
||
IN PIFILE File
|
||
)
|
||
{
|
||
PUCHAR Image;
|
||
PDSDT Dsdt;
|
||
UCHAR check;
|
||
ULONG i;
|
||
|
||
|
||
if (File->FileSize < sizeof(DSDT)) {
|
||
FAbort ("Invalid image size in", File);
|
||
}
|
||
|
||
Dsdt = (PDSDT) File->Image;
|
||
if (Dsdt->Signature != 'TDSD') {
|
||
FAbort ("Image signature not DSDT in", File);
|
||
}
|
||
|
||
if (File->FileSize != Dsdt->Length) {
|
||
FAbort ("File size in DSDT does not match image size in", File);
|
||
}
|
||
|
||
check = 0;
|
||
for (Image = File->Image; Image < File->EndOfImage; Image += 1) {
|
||
check += *Image;
|
||
}
|
||
|
||
if (check) {
|
||
FAbort ("Image checksum is incorrect in", File);
|
||
}
|
||
|
||
// normalize fixed strings
|
||
File->OemID = FixString (Dsdt->OemID, 6);
|
||
File->OemTableID = FixString (Dsdt->OemID, 8);
|
||
memcpy (File->OemRevision, Dsdt->OemRevision, 4);
|
||
for (i=0; i < 4; i++) {
|
||
if (File->OemRevision[i] == 0 || File->OemRevision[i] == ' ') {
|
||
File->OemRevision[i] = '_';
|
||
}
|
||
}
|
||
|
||
if (Verbose) {
|
||
printf ("\n");
|
||
printf ("DSDT info for %s (%s)\n", File->Desc, File->FileName);
|
||
printf (" size of image: %d\n", File->FileSize);
|
||
printf (" OEM id.......: %s\n", File->OemID);
|
||
printf (" OEM Table id.: %s\n", File->OemTableID);
|
||
printf (" OEM revision.: %4x\n", File->OemRevision);
|
||
}
|
||
}
|
||
|
||
PUCHAR
|
||
FixString (
|
||
IN PUCHAR Str,
|
||
IN ULONG Len
|
||
)
|
||
{
|
||
PUCHAR p;
|
||
ULONG i;
|
||
|
||
p = malloc(Len+1);
|
||
memcpy (p, Str, Len);
|
||
p[Len] = 0;
|
||
|
||
for (i=Len; i; i--) {
|
||
if (p[i] != ' ') {
|
||
break;
|
||
}
|
||
p[i] = 0;
|
||
}
|
||
return p;
|
||
}
|
||
|
||
VOID
|
||
FAbort (
|
||
PUCHAR Text,
|
||
PIFILE File
|
||
)
|
||
{
|
||
printf ("%s %s (%s)\n", Text, File->Desc, File->FileName);
|
||
Abort();
|
||
}
|
||
|
||
VOID
|
||
Abort(
|
||
VOID
|
||
)
|
||
{
|
||
if (!ArgsParsed) {
|
||
printf ("amlload: UpdateImage [OriginalImage] [-v] [-d]\n");
|
||
}
|
||
exit (1);
|
||
}
|
||
|
||
VOID
|
||
ParseArgs (
|
||
IN int argc,
|
||
IN char *argv[]
|
||
)
|
||
{
|
||
PIFILE File;
|
||
OFSTRUCT OpenBuf;
|
||
|
||
File = &Orig;
|
||
|
||
while (--argc) {
|
||
argv += 1;
|
||
|
||
//
|
||
// If it's a flag crack it
|
||
//
|
||
|
||
if (argv[0][0] == '-') {
|
||
switch (argv[0][1]) {
|
||
case 'v':
|
||
case 'V':
|
||
Verbose = TRUE;
|
||
break;
|
||
|
||
default:
|
||
printf ("Unkown flag %s\n", argv[0]);
|
||
Abort ();
|
||
}
|
||
|
||
} else {
|
||
|
||
if (!File) {
|
||
printf ("Unexcepted parameter %s\n", argv[0]);
|
||
Abort();
|
||
}
|
||
|
||
//
|
||
// Open the file
|
||
//
|
||
|
||
File->FileName = argv[0];
|
||
File->FileHandle = OpenFile(argv[0], &OpenBuf, OF_READ);
|
||
if (File->FileHandle == HFILE_ERROR) {
|
||
FAbort ("Can not open", File);
|
||
}
|
||
|
||
File->FileSize = GetFileSize(File->FileHandle, NULL);
|
||
|
||
//
|
||
// Map it
|
||
//
|
||
|
||
File->MapHandle =
|
||
CreateFileMapping(
|
||
File->FileHandle,
|
||
NULL,
|
||
PAGE_READONLY,
|
||
0,
|
||
File->FileSize,
|
||
NULL
|
||
);
|
||
|
||
if (!File->MapHandle) {
|
||
FAbort ("Can not map", File);
|
||
}
|
||
|
||
File->Image =
|
||
MapViewOfFile (
|
||
File->MapHandle,
|
||
FILE_MAP_READ,
|
||
0,
|
||
0,
|
||
File->FileSize
|
||
);
|
||
|
||
if (!File->Image) {
|
||
FAbort ("Can not map view of image", File);
|
||
}
|
||
File->EndOfImage = File->Image + File->FileSize;
|
||
File->Opened = TRUE;
|
||
|
||
//
|
||
// Next file param
|
||
//
|
||
File = NULL;
|
||
}
|
||
|
||
}
|
||
|
||
//
|
||
// At least a update image is needed
|
||
//
|
||
|
||
if (!Orig.Opened) {
|
||
Abort ();
|
||
}
|
||
|
||
ArgsParsed = TRUE;
|
||
return ;
|
||
}
|
||
|
||
PVOID
|
||
MEMORY_ALLOCATE(
|
||
ULONG Num
|
||
)
|
||
{
|
||
return malloc( Num );
|
||
}
|
||
|
||
VOID
|
||
MEMORY_COPY(
|
||
PVOID Dest,
|
||
PVOID Src,
|
||
ULONG Length
|
||
)
|
||
{
|
||
memcpy( Dest, Src, Length);
|
||
}
|
||
|
||
VOID
|
||
MEMORY_FREE(
|
||
PVOID Dest
|
||
)
|
||
{
|
||
free( Dest );
|
||
}
|
||
|
||
VOID
|
||
MEMORY_SET(
|
||
PVOID Src,
|
||
UCHAR Value,
|
||
ULONG Length
|
||
)
|
||
{
|
||
memset(Src, Value, Length );
|
||
}
|
||
|
||
VOID
|
||
MEMORY_ZERO(
|
||
PVOID Src,
|
||
ULONG Length
|
||
)
|
||
{
|
||
memset( Src, 0, Length );
|
||
}
|
||
|
||
VOID
|
||
PRINTF(
|
||
PUCHAR String,
|
||
...
|
||
)
|
||
{
|
||
va_list ap;
|
||
|
||
va_start( ap, String );
|
||
vprintf( String, ap );
|
||
va_end( ap );
|
||
}
|
||
|
||
ULONG
|
||
STRING_LENGTH(
|
||
PUCHAR String
|
||
)
|
||
{
|
||
return strlen( String );
|
||
}
|
||
|
||
VOID
|
||
STRING_PRINT(
|
||
PUCHAR Buffer,
|
||
PUCHAR String,
|
||
...
|
||
)
|
||
{
|
||
va_list ap;
|
||
|
||
va_start( ap, String );
|
||
vsprintf( Buffer, String, ap );
|
||
va_end( ap );
|
||
|
||
}
|
||
|