#include <stdint.h>
#include <xen/xen.h>
#include <xen/version.h>
+#include <xen/hvm/hvm_info_table.h>
#include "smbios_types.h"
#include "util.h"
#include "hypercall.h"
uint8_t uuid[16], char *xen_version,
uint32_t xen_major_version, uint32_t xen_minor_version);
+static struct hvm_smtable_header *
+get_sminfo_by_type(struct hvm_sminfo_table *pa_sm, uint8_t type);
static void
get_cpu_manufacturer(char *buf, int len);
static void
static void *
smbios_type_127_init(void *start);
+static struct hvm_smtable_header *
+get_sminfo_by_type(struct hvm_sminfo_table *pa_sm, uint8_t type)
+{
+ struct hvm_smtable_header *header = (struct hvm_smtable_header*)((uint8_t*)pa_sm + sizeof(struct hvm_sminfo_table));
+ uint32_t count;
+ uint8_t *ptr;
+
+ for (count = 0; count < pa_sm->sm_count; count++) {
+ if (header->sm_length == 0) {
+ printf("Invalid SMINFO tables passed to HVM loader.");
+ return NULL;
+ }
+ ptr = ((uint8_t*)header + sizeof(struct hvm_smtable_header));
+ if (ptr[0] == type)
+ return header;
+ header = (struct hvm_smtable_header*)(ptr + header->sm_length);
+ }
+ return NULL;
+}
+
static void
get_cpu_manufacturer(char *buf, int len)
{
}
do_struct(smbios_type_32_init(p));
+ /* NOTE: future enhancement - vendor specific structures (range 128 - 256) would be
+ processed and added here */
do_struct(smbios_type_127_init(p));
#undef do_struct
smbios_type_0_init(void *start, const char *xen_version,
uint32_t xen_major_version, uint32_t xen_minor_version)
{
- struct smbios_type_0 *p = (struct smbios_type_0 *)start;
static const char *smbios_release_date = __SMBIOS_DATE__;
+ struct smbios_type_0 *p = (struct smbios_type_0 *)start;
+ struct hvm_sminfo_table *pa_sm;
+ struct hvm_smtable_header *header;
+
+ /* if passed a struct, use it */
+ pa_sm = get_hvm_sminfo_table();
+ while (pa_sm != NULL) {
+ header = get_sminfo_by_type(pa_sm, 0);
+ if (header == NULL)
+ break;
+ if (header->sm_length < sizeof(struct smbios_type_0))
+ break;
+ memcpy(start, ((uint8_t*)header + sizeof(struct hvm_smtable_header)), header->sm_length);
+
+ /* fix up some bits */
+ p->header.handle = 0;
+ p->starting_address_segment = 0xe800;
+ p->rom_size = 0;
+ p->characteristics[0] = 0x80; /* PCI is supported */
+ p->characteristics[2] = 0x08; /* EDD is supported */
+ p->characteristics_extension_bytes[1] = 0x04; /* Enable Targeted Content Distribution. */
+
+ printf("***RJP*** COPIED IN TYPE 0 - length: %d (0x%x)\n", header->sm_length, header->sm_length); /* TODO REMOVE */
+ return (start + header->sm_length);
+ }
+ /* fall back to building our own */
memset(p, 0, sizeof(*p));
p->header.type = 0;
char uuid_str[37];
struct smbios_type_1 *p = (struct smbios_type_1 *)start;
int next = 5;
+ struct hvm_sminfo_table *pa_sm;
+ struct hvm_smtable_header *header;
+
+ /* if passed a struct, use it */
+ pa_sm = get_hvm_sminfo_table();
+ while (pa_sm != NULL) {
+ header = get_sminfo_by_type(pa_sm, 1);
+ if (header == NULL)
+ break;
+ if (header->sm_length < sizeof(struct smbios_type_1))
+ break;
+ memcpy(start, ((uint8_t*)header + sizeof(struct hvm_smtable_header)), header->sm_length);
+
+ /* fix up some bits */
+ p->header.handle = 0x100;
+
+ printf("***RJP*** COPIED IN TYPE 1 - length: %d (0x%x)\n", header->sm_length, header->sm_length); /* TODO REMOVE */
+ return (start + header->sm_length);
+ }
+ /* fall back to building our own */
memset(p, 0, sizeof(*p));
p->header.type = 1;
smbios_type_3_init(void *start)
{
struct smbios_type_3 *p = (struct smbios_type_3 *)start;
-
+ struct hvm_sminfo_table *pa_sm;
+ struct hvm_smtable_header *header;
+
+ /* if passed a struct, use it */
+ pa_sm = get_hvm_sminfo_table();
+ while (pa_sm != NULL) {
+ header = get_sminfo_by_type(pa_sm, 3);
+ if (header == NULL)
+ break;
+ if (header->sm_length < sizeof(struct smbios_type_3))
+ break;
+ memcpy(start, ((uint8_t*)header + sizeof(struct hvm_smtable_header)), header->sm_length);
+
+ /* fix up some bits */
+ p->header.handle = 0x300;
+
+ printf("***RJP*** COPIED IN TYPE 3 - length: %d (0x%x)\n", header->sm_length, header->sm_length); /* TODO REMOVE */
+ return (start + header->sm_length);
+ }
+
+ /* fall back to building our own */
memset(p, 0, sizeof(*p));
p->header.type = 3;
{
struct smbios_type_11 *p = (struct smbios_type_11 *)start;
int i = 0;
+ struct hvm_sminfo_table *pa_sm;
+ struct hvm_smtable_header *header;
+
+ /* if passed a struct, use it */
+ pa_sm = get_hvm_sminfo_table();
+ while (pa_sm != NULL) {
+ header = get_sminfo_by_type(pa_sm, 11);
+ if (header == NULL)
+ break;
+ if (header->sm_length < sizeof(struct smbios_type_11))
+ break;
+ memcpy(start, ((uint8_t*)header + sizeof(struct hvm_smtable_header)), header->sm_length);
+
+ /* fix up some bits */
+ p->header.handle = 0xB00;
+
+ printf("***RJP*** COPIED IN TYPE 11 - length: %d (0x%x)\n", header->sm_length, header->sm_length); /* TODO REMOVE */
+ return (start + header->sm_length);
+ }
+
+ /* fall back to building our own */
if ( oem_strings_array[0] == NULL )
return start; /* no OEM strings to add */