platid.awk revision 1.1.2.2 1 1.1.2.2 bouyer # $NetBSD: platid.awk,v 1.1.2.2 2001/02/11 19:09:25 bouyer Exp $
2 1.1.2.2 bouyer #
3 1.1.2.2 bouyer # Copyright (c) 1999
4 1.1.2.2 bouyer # Shin Takemura and PocketBSD Project. All rights reserved.
5 1.1.2.2 bouyer #
6 1.1.2.2 bouyer # Redistribution and use in source and binary forms, with or without
7 1.1.2.2 bouyer # modification, are permitted provided that the following conditions
8 1.1.2.2 bouyer # are met:
9 1.1.2.2 bouyer # 1. Redistributions of source code must retain the above copyright
10 1.1.2.2 bouyer # notice, this list of conditions and the following disclaimer.
11 1.1.2.2 bouyer # 2. Redistributions in binary form must reproduce the above copyright
12 1.1.2.2 bouyer # notice, this list of conditions and the following disclaimer in the
13 1.1.2.2 bouyer # documentation and/or other materials provided with the distribution.
14 1.1.2.2 bouyer # 3. All advertising materials mentioning features or use of this software
15 1.1.2.2 bouyer # must display the following acknowledgement:
16 1.1.2.2 bouyer # This product includes software developed by the PocketBSD project
17 1.1.2.2 bouyer # and its contributors.
18 1.1.2.2 bouyer # 4. Neither the name of the project nor the names of its contributors
19 1.1.2.2 bouyer # may be used to endorse or promote products derived from this software
20 1.1.2.2 bouyer # without specific prior written permission.
21 1.1.2.2 bouyer #
22 1.1.2.2 bouyer # THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
23 1.1.2.2 bouyer # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24 1.1.2.2 bouyer # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25 1.1.2.2 bouyer # ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
26 1.1.2.2 bouyer # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27 1.1.2.2 bouyer # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28 1.1.2.2 bouyer # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29 1.1.2.2 bouyer # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30 1.1.2.2 bouyer # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31 1.1.2.2 bouyer # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32 1.1.2.2 bouyer # SUCH DAMAGE.
33 1.1.2.2 bouyer #
34 1.1.2.2 bouyer
35 1.1.2.2 bouyer #
36 1.1.2.2 bouyer # sub routines
37 1.1.2.2 bouyer #
38 1.1.2.2 bouyer
39 1.1.2.2 bouyer function gen_header(file) {
40 1.1.2.2 bouyer printf("/*\n") >> file
41 1.1.2.2 bouyer printf(" * Do not edit.\n") > file
42 1.1.2.2 bouyer printf(" * This file is automatically generated by platid.awk.\n") > file
43 1.1.2.2 bouyer printf(" */\n") > file
44 1.1.2.2 bouyer }
45 1.1.2.2 bouyer
46 1.1.2.2 bouyer function error() {
47 1.1.2.2 bouyer printf("ERROR!\n") > stderr
48 1.1.2.2 bouyer exit
49 1.1.2.2 bouyer }
50 1.1.2.2 bouyer
51 1.1.2.2 bouyer function mode_check() {
52 1.1.2.2 bouyer if (mode != MACH && mode != CPU) {
53 1.1.2.2 bouyer printf("ERROR: invalid mode( = %d)\n", mode) > stderr
54 1.1.2.2 bouyer exit
55 1.1.2.2 bouyer }
56 1.1.2.2 bouyer }
57 1.1.2.2 bouyer
58 1.1.2.2 bouyer function defname() {
59 1.1.2.2 bouyer mode_check()
60 1.1.2.2 bouyer
61 1.1.2.2 bouyer #
62 1.1.2.2 bouyer # master header
63 1.1.2.2 bouyer #
64 1.1.2.2 bouyer enumerator[mode] += 1
65 1.1.2.2 bouyer printf("#define PLATID_%s_%s%s_NUM\t%d\n",
66 1.1.2.2 bouyer mode_name[mode], nm, saved_name, enumerator[mode]) > out_h
67 1.1.2.2 bouyer printf("#define PLATID_%s_%s%s\t\\\n",
68 1.1.2.2 bouyer mode_name[mode], nm, saved_name) > out_h
69 1.1.2.2 bouyer printf(" ((PLATID_%s_%s%s_NUM << %s)",
70 1.1.2.2 bouyer mode_name[mode], nm, saved_name, shifts[mode, nest]) > out_h
71 1.1.2.2 bouyer if (nest) {
72 1.1.2.2 bouyer printf("| \\\n PLATID_%s", mode_name[mode]) > out_h
73 1.1.2.2 bouyer for (i = 0; i < nest; i++) {
74 1.1.2.2 bouyer printf("_%s", names[i]) > out_h
75 1.1.2.2 bouyer }
76 1.1.2.2 bouyer }
77 1.1.2.2 bouyer printf(")\n") > out_h
78 1.1.2.2 bouyer
79 1.1.2.2 bouyer #
80 1.1.2.2 bouyer # mask header
81 1.1.2.2 bouyer #
82 1.1.2.2 bouyer printf("extern platid_t platid_mask_%s_%s%s;\n",
83 1.1.2.2 bouyer mode_name[mode], nm, saved_name) > out_mask_h
84 1.1.2.2 bouyer printf("#ifdef PLATID_DEFINE_MASK_NICKNAME\n") > out_mask_h
85 1.1.2.2 bouyer if (mode == CPU) {
86 1.1.2.2 bouyer printf("# define GENERIC_%s%s ((int)&platid_mask_%s_%s%s)\n",
87 1.1.2.2 bouyer nm, saved_name,
88 1.1.2.2 bouyer mode_name[mode], nm, saved_name) > out_mask_h
89 1.1.2.2 bouyer } else {
90 1.1.2.2 bouyer printf("# define %s%s ((int)&platid_mask_%s_%s%s)\n",
91 1.1.2.2 bouyer nm, saved_name,
92 1.1.2.2 bouyer mode_name[mode], nm, saved_name) > out_mask_h
93 1.1.2.2 bouyer }
94 1.1.2.2 bouyer printf("#endif\n") > out_mask_h
95 1.1.2.2 bouyer
96 1.1.2.2 bouyer #
97 1.1.2.2 bouyer # mask holder
98 1.1.2.2 bouyer #
99 1.1.2.2 bouyer printf("platid_t platid_mask_%s_%s%s = {{\n",
100 1.1.2.2 bouyer mode_name[mode], nm, saved_name) > out_mask_c
101 1.1.2.2 bouyer if (mode == CPU) {
102 1.1.2.2 bouyer printf("\tPLATID_%s_%s%s,\n",
103 1.1.2.2 bouyer mode_name[mode], nm, saved_name) > out_mask_c
104 1.1.2.2 bouyer printf("\tPLATID_WILD\n") > out_mask_c
105 1.1.2.2 bouyer }
106 1.1.2.2 bouyer if (mode == MACH) {
107 1.1.2.2 bouyer if (saved_cpu != "") {
108 1.1.2.2 bouyer printf("\tPLATID_CPU_%s,\n", saved_cpu) > out_mask_c
109 1.1.2.2 bouyer } else {
110 1.1.2.2 bouyer printf("\tPLATID_WILD,\n") > out_mask_c
111 1.1.2.2 bouyer }
112 1.1.2.2 bouyer printf("\tPLATID_%s_%s%s\n",
113 1.1.2.2 bouyer mode_name[mode], nm, saved_name) > out_mask_c
114 1.1.2.2 bouyer
115 1.1.2.2 bouyer }
116 1.1.2.2 bouyer printf("}};\n") > out_mask_c
117 1.1.2.2 bouyer
118 1.1.2.2 bouyer }
119 1.1.2.2 bouyer
120 1.1.2.2 bouyer function flushname() {
121 1.1.2.2 bouyer if ( saved_name != "" ) {
122 1.1.2.2 bouyer defname()
123 1.1.2.2 bouyer }
124 1.1.2.2 bouyer }
125 1.1.2.2 bouyer
126 1.1.2.2 bouyer BEGIN {
127 1.1.2.2 bouyer CPU = 1
128 1.1.2.2 bouyer MACH = 2
129 1.1.2.2 bouyer
130 1.1.2.2 bouyer nest = 0
131 1.1.2.2 bouyer nm = ""
132 1.1.2.2 bouyer saved_name = ""
133 1.1.2.2 bouyer mode = NA
134 1.1.2.2 bouyer change_cpu = 0
135 1.1.2.2 bouyer saved_cpu = ""
136 1.1.2.2 bouyer
137 1.1.2.2 bouyer mode_name[CPU] = "CPU"
138 1.1.2.2 bouyer mode_name[MACH] = "MACH"
139 1.1.2.2 bouyer
140 1.1.2.2 bouyer shifts[CPU, 0] = "PLATID_CPU_ARCH_SHIFT"
141 1.1.2.2 bouyer shifts[CPU, 1] = "PLATID_CPU_SERIES_SHIFT"
142 1.1.2.2 bouyer shifts[CPU, 2] = "PLATID_CPU_MODEL_SHIFT"
143 1.1.2.2 bouyer shifts[CPU, 3] = "PLATID_CPU_SUBMODEL_SHIFT"
144 1.1.2.2 bouyer
145 1.1.2.2 bouyer shifts[MACH, 0] = "PLATID_VENDOR_SHIFT"
146 1.1.2.2 bouyer shifts[MACH, 1] = "PLATID_SERIES_SHIFT"
147 1.1.2.2 bouyer shifts[MACH, 2] = "PLATID_MODEL_SHIFT"
148 1.1.2.2 bouyer shifts[MACH, 3] = "PLATID_SUBMODEL_SHIFT"
149 1.1.2.2 bouyer
150 1.1.2.2 bouyer enumerator[CPU] = 0
151 1.1.2.2 bouyer enumerator[MACH] = 0
152 1.1.2.2 bouyer
153 1.1.2.2 bouyer if (stderr == "") {
154 1.1.2.2 bouyer stderr = "/dev/stderr"
155 1.1.2.2 bouyer }
156 1.1.2.2 bouyer if (out_h == "") {
157 1.1.2.2 bouyer out_h = "platid_generated.h"
158 1.1.2.2 bouyer }
159 1.1.2.2 bouyer if (out_mask_h == "") {
160 1.1.2.2 bouyer out_mask_h = "platid_mask.h"
161 1.1.2.2 bouyer }
162 1.1.2.2 bouyer if (out_mask_c == "") {
163 1.1.2.2 bouyer out_mask_c = "platid_mask.c"
164 1.1.2.2 bouyer }
165 1.1.2.2 bouyer
166 1.1.2.2 bouyer printf("files: %s %s %s\n", out_h, out_mask_h, out_mask_c) > stderr
167 1.1.2.2 bouyer
168 1.1.2.2 bouyer gen_header(out_h)
169 1.1.2.2 bouyer gen_header(out_mask_h)
170 1.1.2.2 bouyer gen_header(out_mask_c)
171 1.1.2.2 bouyer printf("#include <machine/platid.h>\n") > out_mask_c
172 1.1.2.2 bouyer }
173 1.1.2.2 bouyer
174 1.1.2.2 bouyer /^[ \t]*$/ {
175 1.1.2.2 bouyer next
176 1.1.2.2 bouyer }
177 1.1.2.2 bouyer /\/\*/ {
178 1.1.2.2 bouyer commentout = 1
179 1.1.2.2 bouyer next
180 1.1.2.2 bouyer }
181 1.1.2.2 bouyer /\*\// {
182 1.1.2.2 bouyer commentout = 0
183 1.1.2.2 bouyer next
184 1.1.2.2 bouyer }
185 1.1.2.2 bouyer /:/{
186 1.1.2.2 bouyer if (commentout) {
187 1.1.2.2 bouyer next
188 1.1.2.2 bouyer }
189 1.1.2.2 bouyer if (nest != 0) {
190 1.1.2.2 bouyer error()
191 1.1.2.2 bouyer }
192 1.1.2.2 bouyer if (saved_name == "CPU") {
193 1.1.2.2 bouyer mode = CPU
194 1.1.2.2 bouyer } else
195 1.1.2.2 bouyer if (saved_name == "MACHINE") {
196 1.1.2.2 bouyer mode = MACH
197 1.1.2.2 bouyer } else {
198 1.1.2.2 bouyer error()
199 1.1.2.2 bouyer }
200 1.1.2.2 bouyer saved_name = ""
201 1.1.2.2 bouyer next
202 1.1.2.2 bouyer }
203 1.1.2.2 bouyer /=/{
204 1.1.2.2 bouyer if (commentout) {
205 1.1.2.2 bouyer next
206 1.1.2.2 bouyer }
207 1.1.2.2 bouyer if (saved_name == "CPU") {
208 1.1.2.2 bouyer change_cpu = 1
209 1.1.2.2 bouyer } else {
210 1.1.2.2 bouyer error()
211 1.1.2.2 bouyer }
212 1.1.2.2 bouyer saved_name = ""
213 1.1.2.2 bouyer next
214 1.1.2.2 bouyer }
215 1.1.2.2 bouyer /\?/{
216 1.1.2.2 bouyer if (commentout) {
217 1.1.2.2 bouyer next
218 1.1.2.2 bouyer }
219 1.1.2.2 bouyer if (change_cpu) {
220 1.1.2.2 bouyer saved_cpu = ""
221 1.1.2.2 bouyer change_cpu = 0
222 1.1.2.2 bouyer } else {
223 1.1.2.2 bouyer error()
224 1.1.2.2 bouyer }
225 1.1.2.2 bouyer next
226 1.1.2.2 bouyer }
227 1.1.2.2 bouyer /{/{
228 1.1.2.2 bouyer if (commentout) {
229 1.1.2.2 bouyer next
230 1.1.2.2 bouyer }
231 1.1.2.2 bouyer flushname()
232 1.1.2.2 bouyer
233 1.1.2.2 bouyer nms[nest] = nm
234 1.1.2.2 bouyer enums[nest] = enumerator[mode]
235 1.1.2.2 bouyer names[nest] = saved_name
236 1.1.2.2 bouyer cpus[nest] = saved_cpu
237 1.1.2.2 bouyer
238 1.1.2.2 bouyer if (nest == 2) {
239 1.1.2.2 bouyer } else
240 1.1.2.2 bouyer if (nest == 0) {
241 1.1.2.2 bouyer nm = sprintf("%s_", saved_name)
242 1.1.2.2 bouyer } else {
243 1.1.2.2 bouyer nm = sprintf("%s%s_", nm, saved_name)
244 1.1.2.2 bouyer }
245 1.1.2.2 bouyer nest++
246 1.1.2.2 bouyer
247 1.1.2.2 bouyer mode_check()
248 1.1.2.2 bouyer enumerator[mode] = 0
249 1.1.2.2 bouyer saved_name = ""
250 1.1.2.2 bouyer
251 1.1.2.2 bouyer next
252 1.1.2.2 bouyer }
253 1.1.2.2 bouyer /}/{
254 1.1.2.2 bouyer if (commentout) {
255 1.1.2.2 bouyer next
256 1.1.2.2 bouyer }
257 1.1.2.2 bouyer flushname()
258 1.1.2.2 bouyer saved_name = ""
259 1.1.2.2 bouyer --nest
260 1.1.2.2 bouyer nm = nms[nest]
261 1.1.2.2 bouyer enumerator[mode] = enums[nest]
262 1.1.2.2 bouyer saved_cpu = cpus[nest]
263 1.1.2.2 bouyer next
264 1.1.2.2 bouyer }
265 1.1.2.2 bouyer /[a-zA-Z0-9]*/{
266 1.1.2.2 bouyer if (commentout) {
267 1.1.2.2 bouyer next
268 1.1.2.2 bouyer }
269 1.1.2.2 bouyer if (change_cpu) {
270 1.1.2.2 bouyer saved_cpu = $1
271 1.1.2.2 bouyer change_cpu = 0
272 1.1.2.2 bouyer next
273 1.1.2.2 bouyer }
274 1.1.2.2 bouyer
275 1.1.2.2 bouyer flushname()
276 1.1.2.2 bouyer saved_name = toupper($1)
277 1.1.2.2 bouyer next
278 1.1.2.2 bouyer }
279 1.1.2.2 bouyer {
280 1.1.2.2 bouyer printf("SYNTAX ERROR: %s\n", $0) > stderr
281 1.1.2.2 bouyer }
282