Page MenuHomeFreeBSD

D24107.id69951.diff
No OneTemporary

D24107.id69951.diff

Index: usr.sbin/bhyve/smbiostbl.c
===================================================================
--- usr.sbin/bhyve/smbiostbl.c
+++ usr.sbin/bhyve/smbiostbl.c
@@ -255,7 +255,7 @@
uint16_t errhand; /* handle of mem error data */
uint16_t twidth; /* total width in bits */
uint16_t dwidth; /* data width in bits */
- uint16_t size; /* size in bytes */
+ uint16_t size; /* size in kb or mb */
uint8_t form; /* form factor */
uint8_t set; /* set */
uint8_t dloc; /* device locator string */
@@ -268,7 +268,7 @@
uint8_t asset; /* asset tag string */
uint8_t part; /* part number string */
uint8_t attributes; /* attributes */
- uint32_t xsize; /* extended size in mbs */
+ uint32_t xsize; /* extended size in mb */
uint16_t curspeed; /* current speed in mhz */
uint16_t minvoltage; /* minimum voltage */
uint16_t maxvoltage; /* maximum voltage */
@@ -444,7 +444,7 @@
-1, /* handle of memory error data */
64, /* total width in bits including ecc */
64, /* data width in bits */
- 0, /* size in bytes (0x7fff=use extended)*/
+ 0, /* size in kb or mb (0x7fff=use extended)*/
SMBIOS_MDFF_UNKNOWN,
0, /* set (0x00=none, 0xff=unknown) */
1, /* device locator string */
@@ -695,7 +695,8 @@
uint16_t *n, uint16_t *size)
{
struct smbios_table_type17 *type17;
- uint64_t memsize, size_MB;
+ uint64_t memsize;
+ uint32_t size_KB, size_MB;
smbios_generic_initializer(template_entry, template_strings,
curaddr, endaddr, n, size);
@@ -703,20 +704,28 @@
type17->arrayhand = type16_handle;
memsize = guest_lomem + guest_himem;
+ size_KB = memsize / 1024;
size_MB = memsize / MB;
- type17->size = size_MB & 0x7FFF;
+ // A single Type 17 entry can't represent more than ~2PB RAM
+ if (size_MB > 0x7FFFFFFF) {
+ fprintf(stderr, "Error: guest memory too big: "
+ "%uMB greater than max supported 2147483647MB\n", size_MB);
+ return (-1);
+ }
- if (guest_himem > 0) {
- curaddr = *endaddr;
- smbios_generic_initializer(template_entry, template_strings,
- curaddr, endaddr, n, size);
- type17 = (struct smbios_table_type17 *)curaddr;
- type17->arrayhand = type16_handle;
- if (size_MB > 0x7FFF) {
- type17->size = 0x7FFF;
- type17->xsize = size_MB & 0x7FFFFFFF;
- }
+ // See SMBIOS 2.7.0 section 7.18 - Memory Device (Type 17)
+ if (size_KB <= 0x7FFF) {
+ // Can represent up to 32767KB with the top bit set
+ type17->size = size_KB | (1 << 15);
+ } else if (size_MB < 0x7FFF) {
+ // Can represent up to 32766MB with the top bit unset
+ type17->size = size_MB & 0x7FFF;
+ } else {
+ type17->size = 0x7FFF;
+ // Can represent up to 2147483647MB (~2PB)
+ // The top bit is reserved
+ type17->xsize = size_MB & 0x7FFFFFFF;
}
return (0);
@@ -758,12 +767,12 @@
smbios_ep->eplen = 0x1F;
assert(sizeof (struct smbios_entry_point) == smbios_ep->eplen);
smbios_ep->major = 2;
- smbios_ep->minor = 7;
+ smbios_ep->minor = 6;
smbios_ep->revision = 0;
memcpy(smbios_ep->ianchor, SMBIOS_ENTRY_IANCHOR,
SMBIOS_ENTRY_IANCHORLEN);
smbios_ep->staddr = staddr;
- smbios_ep->bcdrev = 0x27;
+ smbios_ep->bcdrev = 0x24;
}
static void

File Metadata

Mime Type
text/plain
Expires
Fri, Oct 24, 4:16 PM (10 h, 56 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
24136863
Default Alt Text
D24107.id69951.diff (3 KB)

Event Timeline