1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
|
/* $NetBSD: platid.h,v 1.4 2006/01/17 02:50:59 uwe Exp $ */
/*-
* Copyright (c) 1999-2001
* Shin Takemura and PocketBSD Project. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the PocketBSD project
* and its contributors.
* 4. Neither the name of the project nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
*/
#ifndef _HPC_PLATID_H_
#define _HPC_PLATID_H_
#include <sys/cdefs.h>
#define PLATID_FLAGS_BITS 8
#define PLATID_CPU_SUBMODEL_BITS 6
#define PLATID_CPU_MODEL_BITS 6
#define PLATID_CPU_SERIES_BITS 6
#define PLATID_CPU_ARCH_BITS 6
#define PLATID_SUBMODEL_BITS 8
#define PLATID_MODEL_BITS 8
#define PLATID_SERIES_BITS 6
#define PLATID_VENDOR_BITS 10
typedef union {
struct {
unsigned long dw0, dw1;
} dw;
#if BYTE_ORDER == LITTLE_ENDIAN
struct platid {
unsigned int flags :PLATID_FLAGS_BITS;
unsigned int cpu_submodel :PLATID_CPU_SUBMODEL_BITS;
unsigned int cpu_model :PLATID_CPU_MODEL_BITS;
unsigned int cpu_series :PLATID_CPU_SERIES_BITS;
unsigned int cpu_arch :PLATID_CPU_ARCH_BITS;
unsigned int submodel :PLATID_SUBMODEL_BITS;
unsigned int model :PLATID_MODEL_BITS;
unsigned int series :PLATID_SERIES_BITS;
unsigned int vendor :PLATID_VENDOR_BITS;
} s;
#else
#error BYTE_ORDER != LITTLE_ENDIAN
#endif
} platid_t;
typedef platid_t platid_mask_t;
#ifdef UNICODE
typedef unsigned short tchar;
#ifndef TEXT
#define TEXT(x) L##x
#endif
#else
typedef char tchar;
#define TEXT(x) x
#endif
struct platid_name {
platid_mask_t *mask;
const tchar *name;
};
struct platid_data {
platid_mask_t *mask;
void *data;
};
#define PLATID_FLAGS_SHIFT 0
#define PLATID_CPU_SUBMODEL_SHIFT 8
#define PLATID_CPU_MODEL_SHIFT 14
#define PLATID_CPU_SERIES_SHIFT 20
#define PLATID_CPU_ARCH_SHIFT 26
#define PLATID_SUBMODEL_SHIFT 0
#define PLATID_MODEL_SHIFT 8
#define PLATID_SERIES_SHIFT 16
#define PLATID_VENDOR_SHIFT 22
#define PLATID_FLAGS_MASK \
(((1 << PLATID_FLAGS_BITS) - 1) << PLATID_FLAGS_SHIFT)
#define PLATID_CPU_SUBMODEL_MASK \
(((1 << PLATID_CPU_SUBMODEL_BITS) - 1) << PLATID_CPU_SUBMODEL_SHIFT)
#define PLATID_CPU_MODEL_MASK \
(((1 << PLATID_CPU_MODEL_BITS) - 1) << PLATID_CPU_MODEL_SHIFT)
#define PLATID_CPU_SERIES_MASK \
(((1 << PLATID_CPU_SERIES_BITS) - 1) << PLATID_CPU_SERIES_SHIFT)
#define PLATID_CPU_ARCH_MASK \
(((1 << PLATID_CPU_ARCH_BITS) - 1) << PLATID_CPU_ARCH_SHIFT)
#define PLATID_SUBMODEL_MASK \
(((1 << PLATID_SUBMODEL_BITS) - 1) << PLATID_SUBMODEL_SHIFT)
#define PLATID_MODEL_MASK \
(((1 << PLATID_MODEL_BITS) - 1) << PLATID_MODEL_SHIFT)
#define PLATID_SERIES_MASK \
(((1 << PLATID_SERIES_BITS) - 1) << PLATID_SERIES_SHIFT)
#define PLATID_VENDOR_MASK \
(((1 << PLATID_VENDOR_BITS) - 1) << PLATID_VENDOR_SHIFT)
#define PLATID_UNKNOWN 0
#define PLATID_WILD PLATID_UNKNOWN
#define PLATID_DEREFP(pp) ((platid_t *)(pp))
#define PLATID_DEREF(pp) (*PLATID_DEREFP(pp))
__BEGIN_DECLS
extern platid_t platid_unknown;
extern platid_t platid_wild;
extern platid_t platid;
extern struct platid_name platid_name_table[];
extern int platid_name_table_size;
void platid_ntoh(platid_t *);
void platid_hton(platid_t *);
int platid_match(platid_t *, platid_mask_t *);
int platid_match_sub(platid_t *, platid_mask_t *, int);
const tchar *platid_name(platid_t *);
struct platid_data *platid_search_data(platid_t *, struct platid_data *);
void *platid_search(platid_t *, void *, int, int);
#ifdef PLATID_TEST
void platid_dump(const char *, void *);
#endif
__END_DECLS
#if defined(_KERNEL_OPT)
#include "opt_spec_platform.h"
#endif
#include <machine/platid_generated.h>
#endif /* _HPC_PLATID_H_ */
|