1/*-
2 * SPDX-License-Identifier: BSD-2-Clause
3 *
4 * Copyright (c) 1997 Michael Smith
5 * Copyright (c) 1998 Jonathan Lemon
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 *    notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 *    notice, this list of conditions and the following disclaimer in the
15 *    documentation and/or other materials provided with the distribution.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 */
29
30#ifndef _SMBIOS_H_
31#define _SMBIOS_H_
32
33/*
34 * System Management BIOS
35 */
36#define	SMBIOS_START	0xf0000
37#define	SMBIOS_STEP	0x10
38#define	SMBIOS_OFF	0
39#define	SMBIOS_LEN	4
40#define	SMBIOS_SIG	"_SM_"
41#define	SMBIOS3_LEN	5
42#define	SMBIOS3_SIG	"_SM3_"
43
44struct smbios_eps {
45	uint8_t		anchor_string[4];		/* '_SM_' */
46	uint8_t		checksum;
47	uint8_t		length;
48	uint8_t		major_version;
49	uint8_t		minor_version;
50	uint16_t	maximum_structure_size;
51	uint8_t		entry_point_revision;
52	uint8_t		formatted_area[5];
53	uint8_t		intermediate_anchor_string[5];	/* '_DMI_' */
54	uint8_t		intermediate_checksum;
55	uint16_t	structure_table_length;
56	uint32_t	structure_table_address;
57	uint16_t	number_structures;
58	uint8_t		BCD_revision;
59} __packed;
60
61struct smbios3_eps {
62        uint8_t		anchor_string[5];                /* '_SM3_' */
63        uint8_t		checksum;
64        uint8_t		length;
65        uint8_t		major_version;
66        uint8_t		minor_version;
67        uint8_t		docrev;
68        uint8_t		entry_point_revision;
69        uint8_t		reserved;
70        uint32_t	structure_table_max_size;
71        uint64_t	structure_table_address;
72};
73
74struct smbios_structure_header {
75	uint8_t		type;
76	uint8_t		length;
77	uint16_t	handle;
78} __packed;
79
80typedef void (*smbios_callback_t)(struct smbios_structure_header *, void *);
81
82static inline void
83smbios_walk_table(uint8_t *p, int entries, smbios_callback_t cb, void *arg)
84{
85	struct smbios_structure_header *s;
86
87	while (entries--) {
88		s = (struct smbios_structure_header *)p;
89		cb(s, arg);
90
91		/*
92		 * Look for a double-nul after the end of the
93		 * formatted area of this structure.
94		 */
95		p += s->length;
96		while (!(p[0] == 0 && p[1] == 0))
97			p++;
98
99		/*
100		 * Skip over the double-nul to the start of the next
101		 * structure.
102		 */
103		p += 2;
104	}
105}
106
107#ifdef _KERNEL
108void identify_hypervisor_smbios(void);
109#endif
110
111#endif /* _SMBIOS_H_ */
112