1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19#ifndef QEMU_SMBIOS_BUILD_H
20#define QEMU_SMBIOS_BUILD_H
21
22bool smbios_skip_table(uint8_t type, bool required_table);
23
24extern uint8_t *smbios_tables;
25extern size_t smbios_tables_len;
26extern unsigned smbios_table_max;
27extern unsigned smbios_table_cnt;
28
29#define SMBIOS_BUILD_TABLE_PRE(tbl_type, tbl_handle, tbl_required) \
30 struct smbios_type_##tbl_type *t; \
31 size_t t_off; \
32 int str_index = 0; \
33 do { \
34 \
35 if (smbios_skip_table(tbl_type, tbl_required)) { \
36 return; \
37 } \
38 \
39 \
40 \
41 t_off = smbios_tables_len; \
42 smbios_tables_len += sizeof(*t); \
43 smbios_tables = g_realloc(smbios_tables, smbios_tables_len); \
44 t = (struct smbios_type_##tbl_type *)(smbios_tables + t_off); \
45 \
46 t->header.type = tbl_type; \
47 t->header.length = sizeof(*t); \
48 t->header.handle = cpu_to_le16(tbl_handle); \
49 } while (0)
50
51#define SMBIOS_TABLE_SET_STR(tbl_type, field, value) \
52 do { \
53 int len = (value != NULL) ? strlen(value) + 1 : 0; \
54 if (len > 1) { \
55 smbios_tables = g_realloc(smbios_tables, \
56 smbios_tables_len + len); \
57 memcpy(smbios_tables + smbios_tables_len, value, len); \
58 smbios_tables_len += len; \
59 \
60 t = (struct smbios_type_##tbl_type *)(smbios_tables + t_off); \
61 t->field = ++str_index; \
62 } else { \
63 t->field = 0; \
64 } \
65 } while (0)
66
67#define SMBIOS_TABLE_SET_STR_LIST(tbl_type, value) \
68 do { \
69 int len = (value != NULL) ? strlen(value) + 1 : 0; \
70 if (len > 1) { \
71 smbios_tables = g_realloc(smbios_tables, \
72 smbios_tables_len + len); \
73 memcpy(smbios_tables + smbios_tables_len, value, len); \
74 smbios_tables_len += len; \
75 ++str_index; \
76 } \
77 } while (0)
78
79#define SMBIOS_BUILD_TABLE_POST \
80 do { \
81 size_t term_cnt, t_size; \
82 \
83 \
84 term_cnt = (str_index == 0) ? 2 : 1; \
85 smbios_tables = g_realloc(smbios_tables, \
86 smbios_tables_len + term_cnt); \
87 memset(smbios_tables + smbios_tables_len, 0, term_cnt); \
88 smbios_tables_len += term_cnt; \
89 \
90 \
91 t_size = smbios_tables_len - t_off; \
92 if (t_size > smbios_table_max) { \
93 smbios_table_max = t_size; \
94 } \
95 \
96 \
97 smbios_table_cnt++; \
98 } while (0)
99
100
101void smbios_build_type_38_table(void);
102
103#endif
104