1 /** @file
2   Command structures for the QEMU FwCfg table loader interface.
3 
4   Copyright (C) 2014, Red Hat, Inc.
5 
6   This program and the accompanying materials are licensed and made available
7   under the terms and conditions of the BSD License which accompanies this
8   distribution.  The full text of the license may be found at
9   http://opensource.org/licenses/bsd-license.php
10 
11   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT
12   WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
13 
14 **/
15 
16 #ifndef __QEMU_LOADER_H__
17 #define __QEMU_LOADER_H__
18 
19 #include <Include/Base.h>
20 #include <Library/QemuFwCfgLib.h>
21 
22 //
23 // The types and the documentation reflects the SeaBIOS interface.
24 //
25 #define QEMU_LOADER_FNAME_SIZE QEMU_FW_CFG_FNAME_SIZE
26 
27 typedef enum {
28   QemuLoaderCmdAllocate = 1,
29   QemuLoaderCmdAddPointer,
30   QemuLoaderCmdAddChecksum
31 } QEMU_LOADER_COMMAND_TYPE;
32 
33 typedef enum {
34   QemuLoaderAllocHigh = 1,
35   QemuLoaderAllocFSeg
36 } QEMU_LOADER_ALLOC_ZONE;
37 
38 #pragma pack (1)
39 //
40 // QemuLoaderCmdAllocate: download the fw_cfg file named File, to a buffer
41 // allocated in the zone specified by Zone, aligned at a multiple of Alignment.
42 //
43 typedef struct {
44   UINT8  File[QEMU_LOADER_FNAME_SIZE]; // NUL-terminated
45   UINT32 Alignment;                    // power of two
46   UINT8  Zone;                         // QEMU_LOADER_ALLOC_ZONE values
47 } QEMU_LOADER_ALLOCATE;
48 
49 //
50 // QemuLoaderCmdAddPointer: the bytes at
51 // [PointerOffset..PointerOffset+PointerSize) in the file PointerFile contain a
52 // relative pointer (an offset) into PointeeFile. Increment the relative
53 // pointer's value by the base address of where PointeeFile's contents have
54 // been placed (when QemuLoaderCmdAllocate has been executed for PointeeFile).
55 //
56 typedef struct {
57   UINT8  PointerFile[QEMU_LOADER_FNAME_SIZE]; // NUL-terminated
58   UINT8  PointeeFile[QEMU_LOADER_FNAME_SIZE]; // NUL-terminated
59   UINT32 PointerOffset;
60   UINT8  PointerSize;                         // one of 1, 2, 4, 8
61 } QEMU_LOADER_ADD_POINTER;
62 
63 //
64 // QemuLoaderCmdAddChecksum: calculate the UINT8 checksum (as per
65 // CalculateChecksum8()) of the range [Start..Start+Length) in File. Store the
66 // UINT8 result at ResultOffset in the same File.
67 //
68 typedef struct {
69   UINT8  File[QEMU_LOADER_FNAME_SIZE]; // NUL-terminated
70   UINT32 ResultOffset;
71   UINT32 Start;
72   UINT32 Length;
73 } QEMU_LOADER_ADD_CHECKSUM;
74 
75 typedef struct {
76   UINT32 Type;                             // QEMU_LOADER_COMMAND_TYPE values
77   union {
78     QEMU_LOADER_ALLOCATE     Allocate;
79     QEMU_LOADER_ADD_POINTER  AddPointer;
80     QEMU_LOADER_ADD_CHECKSUM AddChecksum;
81     UINT8                    Padding[124];
82   } Command;
83 } QEMU_LOADER_ENTRY;
84 #pragma pack ()
85 
86 #endif
87