Annotation of driverkit/gendisk/gendisk.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
                      3:  *
                      4:  * @APPLE_LICENSE_HEADER_START@
                      5:  * 
                      6:  * Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
                      7:  * Reserved.  This file contains Original Code and/or Modifications of
                      8:  * Original Code as defined in and that are subject to the Apple Public
                      9:  * Source License Version 1.1 (the "License").  You may not use this file
                     10:  * except in compliance with the License.  Please obtain a copy of the
                     11:  * License at http://www.apple.com/publicsource and read it before using
                     12:  * this file.
                     13:  * 
                     14:  * The Original Code and all software distributed under the License are
                     15:  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
                     16:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
                     17:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
                     18:  * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT.  Please see the
                     19:  * License for the specific language governing rights and limitations
                     20:  * under the License.
                     21:  * 
                     22:  * @APPLE_LICENSE_HEADER_END@
                     23:  */
                     24: /* Copyright (c) 1992 by NeXT Computer, Inc.
                     25:  *
                     26:  *     File:   gendisk.c - Generate offsets for disk-resident structs.
                     27:  *
                     28:  * HISTORY
                     29:  * 28-Mar-92  Doug Mitchell at NeXT
                     30:  *     Created.
                     31:  *
                     32:  * NeXT disks are native to the m68k architecture. When writing or reading
                     33:  * structs to or from disks on other architectures, m68k alignment and 
                     34:  * byte ordering must be preserved. This program generates raw byte offsets
                     35:  * from an m68k point of view for the following types:
                     36:  *
                     37:  *     disk_label_t
                     38:  *     disktab_t
                     39:  *     partition_t
                     40:  *     
                     41:  * This program must run on an m68k machine.
                     42:  */
                     43: 
                     44: #import <stdio.h>
                     45: #import <ctype.h>
                     46: #import <libc.h>
                     47: #import <bsd/dev/disk.h>
                     48: 
                     49: #ifndef        MACRO_BEGIN
                     50: # define               MACRO_BEGIN     do {
                     51: #endif MACRO_BEGIN
                     52: 
                     53: #ifndef        MACRO_END
                     54: # define               MACRO_END       } while (0)
                     55: #endif MACRO_END
                     56: 
                     57: #ifndef        MACRO_RETURN
                     58: # define               MACRO_RETURN    if (1) return
                     59: #endif MACRO_RETURN
                     60: 
                     61: #define        NAME_LEN        30
                     62: 
                     63: #define        PRINT_OFFSET(ptr_type, field)                                   \
                     64: MACRO_BEGIN                                                            \
                     65:        print_define(#ptr_type, #field);                                \
                     66:        printf("%#010x\n", (& (((ptr_type)0)->field)));                 \
                     67: MACRO_END
                     68: 
                     69: #define        PRINT_BIT_FIELD(reg_type, field)                                \
                     70: MACRO_BEGIN                                                            \
                     71:        reg_type __reg;                                                 \
                     72:        __reg.field = (typeof (__reg.field)) -1;                        \
                     73:        print_define(#reg_type, #field);                                \
                     74:        printf("%#010x\n", CONTENTS(__reg));                            \
                     75: MACRO_END
                     76: 
                     77: #define        PRINT_FIELD_INFO(reg_type, field)                               \
                     78: MACRO_BEGIN                                                            \
                     79:        reg_type __reg;                                                 \
                     80:        CONTENTS(__reg) = 0;                                            \
                     81:        __reg.field = -1;                                               \
                     82:        print_define(#reg_type, #field "_OFF");                         \
                     83:        printf("%d\n", bit_num(#reg_type, #field, CONTENTS(__reg)));    \
                     84:        print_define(#reg_type, #field "_WIDTH");                       \
                     85:        printf("%d\n", field_width(#reg_type, #field, CONTENTS(__reg)));\
                     86: MACRO_END
                     87: 
                     88: #define        PRINT_ENUM(item)                                                \
                     89: MACRO_BEGIN                                                            \
                     90:        print_define("", #item);                                        \
                     91:        printf("%#010x\n", item);                                       \
                     92: MACRO_END
                     93: 
                     94: #define        PRINT_DEFINE(macro)                                             \
                     95: MACRO_BEGIN                                                            \
                     96:        print_define("", #macro);                                       \
                     97:        printf("%s\n", STRINGIFY(macro));                               \
                     98: MACRO_END
                     99: 
                    100: #define        PRINT_CONSTANT(macro)                                           \
                    101: MACRO_BEGIN                                                            \
                    102:        print_define("", #macro);                                       \
                    103:        printf("%#010x\n", macro);                                      \
                    104: MACRO_END
                    105: 
                    106: #define        PRINT_REGADDR(macro)                                            \
                    107: MACRO_BEGIN                                                            \
                    108:        print_define("", #macro);                                       \
                    109:        printf("%#010x\n", &macro);                                     \
                    110: MACRO_END
                    111: 
                    112: #define        PRINT_REG_PAIR(struct_ptr, name0, name1)                        \
                    113: MACRO_BEGIN                                                            \
                    114:        print_define(#struct_ptr, #name0 "_" #name1);                   \
                    115:        printf("%#010x\n", (& (((struct_ptr)0)->name0##_##name1)));     \
                    116: MACRO_END
                    117: 
                    118: #define        PRINT_BIT_POS(reg_type, field)                                  \
                    119: MACRO_BEGIN                                                            \
                    120:        reg_type __reg;                                                 \
                    121:        CONTENTS(__reg) = 0;                                            \
                    122:        __reg.field = 1;                                                \
                    123:        print_define(#reg_type, #field "_BIT");                         \
                    124:        printf("%d\n", bit_num(#reg_type, #field, CONTENTS(__reg)));    \
                    125: MACRO_END
                    126: 
                    127: #define        PRINT_L2_SIZE(type)                                             \
                    128: MACRO_BEGIN                                                            \
                    129:        print_define("L2_SIZE", #type);                                 \
                    130:        printf("%d\n", log2(sizeof(type), #type));                      \
                    131: MACRO_END
                    132: 
                    133: #define        PRINT_L2_CONSTANT(macro)                                        \
                    134: MACRO_BEGIN                                                            \
                    135:        print_define("L2", #macro);                                     \
                    136:        printf("%d\n", log2(macro, #macro));                            \
                    137: MACRO_END
                    138: 
                    139: #define        PRINT_SIZEOF(type)                                              \
                    140: MACRO_BEGIN                                                            \
                    141:        print_define("SIZEOF", #type);                                  \
                    142:        printf("%d\n", sizeof(type), #type);                            \
                    143: MACRO_END
                    144: 
                    145: 
                    146: char *progname;
                    147: 
                    148: unsigned bit_num(char *reg_type, char *field, unsigned bits)
                    149: {
                    150:        unsigned bit;
                    151:        unsigned mask;
                    152:        
                    153:        for (bit = 0, mask = 0x1;
                    154:          (mask & bits) == 0 && mask;
                    155:          mask <<= 1, bit += 1)
                    156:                continue;
                    157:        if (mask)
                    158:                return bit;
                    159:        fprintf(stderr, "%s: Bad BIT_POS for %s.%s\n", progname,
                    160:          reg_type, field);
                    161:        exit(1);
                    162:        return 0;
                    163: }
                    164: 
                    165: unsigned field_width(char *reg_type, char *field, unsigned bits)
                    166: {
                    167:        unsigned width;
                    168: 
                    169:        while (bits && (bits & 0x1) == 0)
                    170:                bits >>= 1;
                    171:        for (width = 0; (bits & 0x1) == 1; bits >>= 1, width += 1)
                    172:                continue;
                    173:        if (bits == 0 && width)
                    174:                return width;
                    175:        fprintf(stderr, "%s: Bad BIT_FIELD for %s.%s\n", progname,
                    176:          reg_type, field);
                    177:        exit(1);
                    178:        return 0;
                    179: }
                    180: 
                    181: unsigned log2(unsigned val, char *type)
                    182: {
                    183:        unsigned l2 = 0;
                    184: 
                    185:        if (val == 0) {
                    186:                fprintf(stderr, "log2: sizeof(%s) is zero!\n", type);
                    187:                exit(1);
                    188:        }
                    189:        while ((val & 0x1) == 0) {
                    190:                l2 += 1;
                    191:                val >>= 1;
                    192:        }
                    193:        if (val != 0x1) {
                    194:                fprintf(stderr, "log2: sizeof(%s) is not power of two!\n",
                    195:                  type);
                    196:                exit(1);
                    197:        }
                    198:        return l2;
                    199: }
                    200: 
                    201: const char *skip_white(const char *cp)
                    202: {
                    203:        while (*cp && isspace(*cp))
                    204:                cp += 1;
                    205:        return cp;
                    206: }
                    207: 
                    208: const char *strip_prefix(const char *cp, const char *prefix)
                    209: {
                    210:        int len;
                    211: 
                    212:        cp = skip_white(cp);
                    213:        len = strlen(prefix);
                    214:        if (strncmp(cp, prefix, len) && isspace(*(cp+len)))
                    215:                cp += len;
                    216:        return cp;
                    217: }
                    218: 
                    219: void print_define(char *type_name, char *field)
                    220: {
                    221:        const char *cp;
                    222:        int col = 0;
                    223:        
                    224:        printf("#define\t");
                    225:        if (type_name != NULL && *type_name != '\0') {
                    226:                cp = strip_prefix(type_name, "struct");
                    227:                cp = strip_prefix(cp, "enum");
                    228:                cp = skip_white(cp);
                    229:                for (; *cp; cp++) {
                    230:                        if (isspace(*cp))
                    231:                                break;
                    232:                        if (*cp == '*')
                    233:                                break;
                    234:                        if (strncmp(cp, "_t", 2) == 0 && !isalnum(cp[2]))
                    235:                                break;
                    236:                        putchar(isalpha(*cp) ? toupper(*cp) : *cp);
                    237:                        col += 1;
                    238:                                
                    239:                }
                    240:                putchar('_');
                    241:                col += 1;
                    242:        }
                    243:        for (cp = field; *cp; cp++) {
                    244:                if (*cp == '.')
                    245:                        putchar('_');
                    246:                else
                    247:                        putchar(isalpha(*cp) ? toupper(*cp) : *cp);
                    248:                col += 1;
                    249:        }
                    250:        do {
                    251:                putchar(' ');
                    252:                col += 1;
                    253:        } while (col < NAME_LEN);
                    254: }
                    255: 
                    256: typedef enum {
                    257:        MAJOR, MINOR
                    258: } cmt_level_t;
                    259: 
                    260: void comment(cmt_level_t level, const char *cmt)
                    261: {
                    262:        switch (level) {
                    263:        case MAJOR:
                    264:                printf("\n\n");
                    265:                printf("//\n");
                    266:                printf("// %s\n", cmt);
                    267:                printf("//\n");
                    268:                break;
                    269:        case MINOR:
                    270:                printf("\n");
                    271:                printf("// %s\n", cmt);
                    272:                printf("\n");
                    273:                break;
                    274:        default:
                    275:                fprintf(stderr, "%s: Bad comment level\n", progname);
                    276:                exit(1);
                    277:        }
                    278: }
                    279: 
                    280: int main(int argc, char **argv)
                    281: {
                    282:        progname = argv[0];
                    283:        
                    284:        printf("// diskstruct.h -- generated by gendisk.c\n");
                    285:        printf("// DON'T EDIT THIS -- change gendisk.c\n");
                    286:        
                    287:        comment(MAJOR, "Structure Offsets");
                    288:        
                    289:        comment(MINOR, "disk_label_t offsets");
                    290:        PRINT_OFFSET(disk_label_t *, dl_version);
                    291:        PRINT_OFFSET(disk_label_t *, dl_label_blkno);
                    292:        PRINT_OFFSET(disk_label_t *, dl_size);
                    293:        PRINT_OFFSET(disk_label_t *, dl_label);
                    294:        PRINT_OFFSET(disk_label_t *, dl_flags);
                    295:        PRINT_OFFSET(disk_label_t *, dl_tag);
                    296:        PRINT_OFFSET(disk_label_t *, dl_dt);
                    297:        PRINT_OFFSET(disk_label_t *, dl_un);
                    298:        PRINT_OFFSET(disk_label_t *, dl_checksum);
                    299:        PRINT_SIZEOF(disk_label_t);
                    300:        PRINT_SIZEOF(dl_un_t);
                    301:        
                    302:        comment(MINOR, "disktab_t offsets");
                    303:        PRINT_OFFSET(disktab_t *, d_name);
                    304:        PRINT_OFFSET(disktab_t *, d_type);
                    305:        PRINT_OFFSET(disktab_t *, d_secsize);
                    306:        PRINT_OFFSET(disktab_t *, d_ntracks);
                    307:        PRINT_OFFSET(disktab_t *, d_nsectors);
                    308:        PRINT_OFFSET(disktab_t *, d_ncylinders);
                    309:        PRINT_OFFSET(disktab_t *, d_rpm);
                    310:        PRINT_OFFSET(disktab_t *, d_front);
                    311:        PRINT_OFFSET(disktab_t *, d_back);
                    312:        PRINT_OFFSET(disktab_t *, d_ngroups);
                    313:        PRINT_OFFSET(disktab_t *, d_ag_size);
                    314:        PRINT_OFFSET(disktab_t *, d_ag_alts);
                    315:        PRINT_OFFSET(disktab_t *, d_ag_off);
                    316:        PRINT_OFFSET(disktab_t *, d_boot0_blkno);
                    317:        PRINT_OFFSET(disktab_t *, d_bootfile);
                    318:        PRINT_OFFSET(disktab_t *, d_hostname);
                    319:        PRINT_OFFSET(disktab_t *, d_rootpartition);
                    320:        PRINT_OFFSET(disktab_t *, d_rwpartition);
                    321:        PRINT_OFFSET(disktab_t *, d_partitions);
                    322:        PRINT_SIZEOF(disktab_t);
                    323:        
                    324:        comment(MINOR, "partition_t offsets");
                    325:        PRINT_OFFSET(partition_t *, p_base);
                    326:        PRINT_OFFSET(partition_t *, p_size);
                    327:        PRINT_OFFSET(partition_t *, p_bsize);
                    328:        PRINT_OFFSET(partition_t *, p_fsize);
                    329:        PRINT_OFFSET(partition_t *, p_opt);
                    330:        PRINT_OFFSET(partition_t *, p_cpg);
                    331:        PRINT_OFFSET(partition_t *, p_density);
                    332:        PRINT_OFFSET(partition_t *, p_minfree);
                    333:        PRINT_OFFSET(partition_t *, p_newfs);
                    334:        PRINT_OFFSET(partition_t *, p_mountpt);
                    335:        PRINT_OFFSET(partition_t *, p_automnt);
                    336:        PRINT_OFFSET(partition_t *, p_type);
                    337:        PRINT_SIZEOF(partition_t);
                    338:        
                    339:        return 0;
                    340: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.