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