Annotation of qemu/hw/sd.c, revision 1.1.1.6

1.1       root        1: /*
                      2:  * SD Memory Card emulation as defined in the "SD Memory Card Physical
                      3:  * layer specification, Version 1.10."
                      4:  *
                      5:  * Copyright (c) 2006 Andrzej Zaborowski  <[email protected]>
                      6:  * Copyright (c) 2007 CodeSourcery
                      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:  *
                     12:  * 1. Redistributions of source code must retain the above copyright
                     13:  *    notice, this list of conditions and the following disclaimer.
                     14:  * 2. Redistributions in binary form must reproduce the above copyright
                     15:  *    notice, this list of conditions and the following disclaimer in
                     16:  *    the documentation and/or other materials provided with the
                     17:  *    distribution.
                     18:  *
                     19:  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS''
                     20:  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
                     21:  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
                     22:  * PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR
                     23:  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
                     24:  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
                     25:  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
                     26:  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
                     27:  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
                     28:  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
                     29:  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
                     30:  */
                     31: 
                     32: #include "hw.h"
                     33: #include "block.h"
1.1.1.6 ! root       34: #include "block_int.h"
1.1       root       35: #include "sd.h"
                     36: 
                     37: //#define DEBUG_SD 1
                     38: 
                     39: #ifdef DEBUG_SD
1.1.1.3   root       40: #define DPRINTF(fmt, ...) \
                     41: do { fprintf(stderr, "SD: " fmt , ## __VA_ARGS__); } while (0)
1.1       root       42: #else
1.1.1.3   root       43: #define DPRINTF(fmt, ...) do {} while(0)
1.1       root       44: #endif
                     45: 
                     46: typedef enum {
                     47:     sd_r0 = 0,    /* no response */
                     48:     sd_r1,        /* normal response command */
                     49:     sd_r2_i,      /* CID register */
                     50:     sd_r2_s,      /* CSD register */
                     51:     sd_r3,        /* OCR register */
                     52:     sd_r6 = 6,    /* Published RCA response */
                     53:     sd_r7,        /* Operating voltage */
                     54:     sd_r1b = -1,
                     55: } sd_rsp_type_t;
                     56: 
                     57: struct SDState {
                     58:     enum {
                     59:         sd_inactive,
                     60:         sd_card_identification_mode,
                     61:         sd_data_transfer_mode,
                     62:     } mode;
                     63:     enum {
                     64:         sd_inactive_state = -1,
                     65:         sd_idle_state = 0,
                     66:         sd_ready_state,
                     67:         sd_identification_state,
                     68:         sd_standby_state,
                     69:         sd_transfer_state,
                     70:         sd_sendingdata_state,
                     71:         sd_receivingdata_state,
                     72:         sd_programming_state,
                     73:         sd_disconnect_state,
                     74:     } state;
                     75:     uint32_t ocr;
                     76:     uint8_t scr[8];
                     77:     uint8_t cid[16];
                     78:     uint8_t csd[16];
                     79:     uint16_t rca;
                     80:     uint32_t card_status;
                     81:     uint8_t sd_status[64];
                     82:     uint32_t vhs;
                     83:     int wp_switch;
                     84:     int *wp_groups;
1.1.1.4   root       85:     uint64_t size;
1.1       root       86:     int blk_len;
                     87:     uint32_t erase_start;
                     88:     uint32_t erase_end;
                     89:     uint8_t pwd[16];
                     90:     int pwd_len;
                     91:     int function_group[6];
                     92: 
                     93:     int spi;
                     94:     int current_cmd;
                     95:     int blk_written;
1.1.1.4   root       96:     uint64_t data_start;
1.1       root       97:     uint32_t data_offset;
                     98:     uint8_t data[512];
                     99:     qemu_irq readonly_cb;
                    100:     qemu_irq inserted_cb;
                    101:     BlockDriverState *bdrv;
                    102:     uint8_t *buf;
1.1.1.2   root      103: 
                    104:     int enable;
1.1       root      105: };
                    106: 
                    107: static void sd_set_status(SDState *sd)
                    108: {
                    109:     switch (sd->state) {
                    110:     case sd_inactive_state:
                    111:         sd->mode = sd_inactive;
                    112:         break;
                    113: 
                    114:     case sd_idle_state:
                    115:     case sd_ready_state:
                    116:     case sd_identification_state:
                    117:         sd->mode = sd_card_identification_mode;
                    118:         break;
                    119: 
                    120:     case sd_standby_state:
                    121:     case sd_transfer_state:
                    122:     case sd_sendingdata_state:
                    123:     case sd_receivingdata_state:
                    124:     case sd_programming_state:
                    125:     case sd_disconnect_state:
                    126:         sd->mode = sd_data_transfer_mode;
                    127:         break;
                    128:     }
                    129: 
                    130:     sd->card_status &= ~CURRENT_STATE;
                    131:     sd->card_status |= sd->state << 9;
                    132: }
                    133: 
                    134: static const sd_cmd_type_t sd_cmd_type[64] = {
                    135:     sd_bc,   sd_none, sd_bcr,  sd_bcr,  sd_none, sd_none, sd_none, sd_ac,
                    136:     sd_bcr,  sd_ac,   sd_ac,   sd_adtc, sd_ac,   sd_ac,   sd_none, sd_ac,
                    137:     sd_ac,   sd_adtc, sd_adtc, sd_none, sd_none, sd_none, sd_none, sd_none,
                    138:     sd_adtc, sd_adtc, sd_adtc, sd_adtc, sd_ac,   sd_ac,   sd_adtc, sd_none,
                    139:     sd_ac,   sd_ac,   sd_none, sd_none, sd_none, sd_none, sd_ac,   sd_none,
                    140:     sd_none, sd_none, sd_bc,   sd_none, sd_none, sd_none, sd_none, sd_none,
                    141:     sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_ac,
                    142:     sd_adtc, sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_none,
                    143: };
                    144: 
                    145: static const sd_cmd_type_t sd_acmd_type[64] = {
                    146:     sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_ac,   sd_none,
                    147:     sd_none, sd_none, sd_none, sd_none, sd_none, sd_adtc, sd_none, sd_none,
                    148:     sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_adtc, sd_ac,
                    149:     sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_none,
                    150:     sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_none,
                    151:     sd_none, sd_bcr,  sd_ac,   sd_none, sd_none, sd_none, sd_none, sd_none,
                    152:     sd_none, sd_none, sd_none, sd_adtc, sd_none, sd_none, sd_none, sd_none,
                    153:     sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_none, sd_none,
                    154: };
                    155: 
                    156: static const int sd_cmd_class[64] = {
                    157:     0,  0,  0,  0,  0,  9, 10,  0,  0,  0,  0,  1,  0,  0,  0,  0,
                    158:     2,  2,  2,  2,  3,  3,  3,  3,  4,  4,  4,  4,  6,  6,  6,  6,
                    159:     5,  5, 10, 10, 10, 10,  5,  9,  9,  9,  7,  7,  7,  7,  7,  7,
                    160:     7,  7, 10,  7,  9,  9,  9,  8,  8, 10,  8,  8,  8,  8,  8,  8,
                    161: };
                    162: 
                    163: static uint8_t sd_crc7(void *message, size_t width)
                    164: {
                    165:     int i, bit;
                    166:     uint8_t shift_reg = 0x00;
                    167:     uint8_t *msg = (uint8_t *) message;
                    168: 
                    169:     for (i = 0; i < width; i ++, msg ++)
                    170:         for (bit = 7; bit >= 0; bit --) {
                    171:             shift_reg <<= 1;
                    172:             if ((shift_reg >> 7) ^ ((*msg >> bit) & 1))
                    173:                 shift_reg ^= 0x89;
                    174:         }
                    175: 
                    176:     return shift_reg;
                    177: }
                    178: 
                    179: static uint16_t sd_crc16(void *message, size_t width)
                    180: {
                    181:     int i, bit;
                    182:     uint16_t shift_reg = 0x0000;
                    183:     uint16_t *msg = (uint16_t *) message;
                    184:     width <<= 1;
                    185: 
                    186:     for (i = 0; i < width; i ++, msg ++)
                    187:         for (bit = 15; bit >= 0; bit --) {
                    188:             shift_reg <<= 1;
                    189:             if ((shift_reg >> 15) ^ ((*msg >> bit) & 1))
                    190:                 shift_reg ^= 0x1011;
                    191:         }
                    192: 
                    193:     return shift_reg;
                    194: }
                    195: 
                    196: static void sd_set_ocr(SDState *sd)
                    197: {
                    198:     /* All voltages OK, card power-up OK, Standard Capacity SD Memory Card */
1.1.1.3   root      199:     sd->ocr = 0x80ffff00;
1.1       root      200: }
                    201: 
                    202: static void sd_set_scr(SDState *sd)
                    203: {
                    204:     sd->scr[0] = 0x00;         /* SCR Structure */
                    205:     sd->scr[1] = 0x2f;         /* SD Security Support */
                    206:     sd->scr[2] = 0x00;
                    207:     sd->scr[3] = 0x00;
                    208:     sd->scr[4] = 0x00;
                    209:     sd->scr[5] = 0x00;
                    210:     sd->scr[6] = 0x00;
                    211:     sd->scr[7] = 0x00;
                    212: }
                    213: 
                    214: #define MID    0xaa
                    215: #define OID    "XY"
                    216: #define PNM    "QEMU!"
                    217: #define PRV    0x01
                    218: #define MDT_YR 2006
                    219: #define MDT_MON        2
                    220: 
                    221: static void sd_set_cid(SDState *sd)
                    222: {
                    223:     sd->cid[0] = MID;          /* Fake card manufacturer ID (MID) */
                    224:     sd->cid[1] = OID[0];       /* OEM/Application ID (OID) */
                    225:     sd->cid[2] = OID[1];
                    226:     sd->cid[3] = PNM[0];       /* Fake product name (PNM) */
                    227:     sd->cid[4] = PNM[1];
                    228:     sd->cid[5] = PNM[2];
                    229:     sd->cid[6] = PNM[3];
                    230:     sd->cid[7] = PNM[4];
                    231:     sd->cid[8] = PRV;          /* Fake product revision (PRV) */
                    232:     sd->cid[9] = 0xde;         /* Fake serial number (PSN) */
                    233:     sd->cid[10] = 0xad;
                    234:     sd->cid[11] = 0xbe;
                    235:     sd->cid[12] = 0xef;
                    236:     sd->cid[13] = 0x00 |       /* Manufacture date (MDT) */
                    237:         ((MDT_YR - 2000) / 10);
                    238:     sd->cid[14] = ((MDT_YR % 10) << 4) | MDT_MON;
                    239:     sd->cid[15] = (sd_crc7(sd->cid, 15) << 1) | 1;
                    240: }
                    241: 
                    242: #define HWBLOCK_SHIFT  9                       /* 512 bytes */
                    243: #define SECTOR_SHIFT   5                       /* 16 kilobytes */
                    244: #define WPGROUP_SHIFT  7                       /* 2 megs */
                    245: #define CMULT_SHIFT    9                       /* 512 times HWBLOCK_SIZE */
                    246: #define WPGROUP_SIZE   (1 << (HWBLOCK_SHIFT + SECTOR_SHIFT + WPGROUP_SHIFT))
                    247: 
                    248: static const uint8_t sd_csd_rw_mask[16] = {
                    249:     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                    250:     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xfe,
                    251: };
                    252: 
1.1.1.4   root      253: static void sd_set_csd(SDState *sd, uint64_t size)
1.1       root      254: {
                    255:     uint32_t csize = (size >> (CMULT_SHIFT + HWBLOCK_SHIFT)) - 1;
                    256:     uint32_t sectsize = (1 << (SECTOR_SHIFT + 1)) - 1;
                    257:     uint32_t wpsize = (1 << (WPGROUP_SHIFT + 1)) - 1;
                    258: 
1.1.1.4   root      259:     if (size <= 0x40000000) {  /* Standard Capacity SD */
                    260:         sd->csd[0] = 0x00;     /* CSD structure */
                    261:         sd->csd[1] = 0x26;     /* Data read access-time-1 */
                    262:         sd->csd[2] = 0x00;     /* Data read access-time-2 */
                    263:         sd->csd[3] = 0x5a;     /* Max. data transfer rate */
                    264:         sd->csd[4] = 0x5f;     /* Card Command Classes */
                    265:         sd->csd[5] = 0x50 |    /* Max. read data block length */
                    266:             HWBLOCK_SHIFT;
                    267:         sd->csd[6] = 0xe0 |    /* Partial block for read allowed */
                    268:             ((csize >> 10) & 0x03);
                    269:         sd->csd[7] = 0x00 |    /* Device size */
                    270:             ((csize >> 2) & 0xff);
                    271:         sd->csd[8] = 0x3f |    /* Max. read current */
                    272:             ((csize << 6) & 0xc0);
                    273:         sd->csd[9] = 0xfc |    /* Max. write current */
                    274:             ((CMULT_SHIFT - 2) >> 1);
                    275:         sd->csd[10] = 0x40 |   /* Erase sector size */
                    276:             (((CMULT_SHIFT - 2) << 7) & 0x80) | (sectsize >> 1);
                    277:         sd->csd[11] = 0x00 |   /* Write protect group size */
                    278:             ((sectsize << 7) & 0x80) | wpsize;
                    279:         sd->csd[12] = 0x90 |   /* Write speed factor */
                    280:             (HWBLOCK_SHIFT >> 2);
                    281:         sd->csd[13] = 0x20 |   /* Max. write data block length */
                    282:             ((HWBLOCK_SHIFT << 6) & 0xc0);
                    283:         sd->csd[14] = 0x00;    /* File format group */
                    284:         sd->csd[15] = (sd_crc7(sd->csd, 15) << 1) | 1;
                    285:     } else {                   /* SDHC */
                    286:         size /= 512 * 1024;
                    287:         size -= 1;
                    288:         sd->csd[0] = 0x40;
                    289:         sd->csd[1] = 0x0e;
                    290:         sd->csd[2] = 0x00;
                    291:         sd->csd[3] = 0x32;
                    292:         sd->csd[4] = 0x5b;
                    293:         sd->csd[5] = 0x59;
                    294:         sd->csd[6] = 0x00;
                    295:         sd->csd[7] = (size >> 16) & 0xff;
                    296:         sd->csd[8] = (size >> 8) & 0xff;
                    297:         sd->csd[9] = (size & 0xff);
                    298:         sd->csd[10] = 0x7f;
                    299:         sd->csd[11] = 0x80;
                    300:         sd->csd[12] = 0x0a;
                    301:         sd->csd[13] = 0x40;
                    302:         sd->csd[14] = 0x00;
                    303:         sd->csd[15] = 0x00;
                    304:         sd->ocr |= 1 << 30;    /* High Capacity SD Memort Card */
                    305:     }
1.1       root      306: }
                    307: 
                    308: static void sd_set_rca(SDState *sd)
                    309: {
                    310:     sd->rca += 0x4567;
                    311: }
                    312: 
                    313: #define CARD_STATUS_A  0x02004100
                    314: #define CARD_STATUS_B  0x00c01e00
                    315: #define CARD_STATUS_C  0xfd39a028
                    316: 
                    317: static void sd_set_cardstatus(SDState *sd)
                    318: {
                    319:     sd->card_status = 0x00000100;
                    320: }
                    321: 
                    322: static void sd_set_sdstatus(SDState *sd)
                    323: {
                    324:     memset(sd->sd_status, 0, 64);
                    325: }
                    326: 
1.1.1.3   root      327: static int sd_req_crc_validate(SDRequest *req)
1.1       root      328: {
                    329:     uint8_t buffer[5];
                    330:     buffer[0] = 0x40 | req->cmd;
                    331:     buffer[1] = (req->arg >> 24) & 0xff;
                    332:     buffer[2] = (req->arg >> 16) & 0xff;
                    333:     buffer[3] = (req->arg >> 8) & 0xff;
                    334:     buffer[4] = (req->arg >> 0) & 0xff;
                    335:     return 0;
                    336:     return sd_crc7(buffer, 5) != req->crc;     /* TODO */
                    337: }
                    338: 
                    339: static void sd_response_r1_make(SDState *sd,
                    340:                                 uint8_t *response, uint32_t last_status)
                    341: {
                    342:     uint32_t mask = CARD_STATUS_B ^ ILLEGAL_COMMAND;
                    343:     uint32_t status;
                    344: 
                    345:     status = (sd->card_status & ~mask) | (last_status & mask);
                    346:     sd->card_status &= ~CARD_STATUS_C | APP_CMD;
                    347: 
                    348:     response[0] = (status >> 24) & 0xff;
                    349:     response[1] = (status >> 16) & 0xff;
                    350:     response[2] = (status >> 8) & 0xff;
                    351:     response[3] = (status >> 0) & 0xff;
                    352: }
                    353: 
                    354: static void sd_response_r3_make(SDState *sd, uint8_t *response)
                    355: {
                    356:     response[0] = (sd->ocr >> 24) & 0xff;
                    357:     response[1] = (sd->ocr >> 16) & 0xff;
                    358:     response[2] = (sd->ocr >> 8) & 0xff;
                    359:     response[3] = (sd->ocr >> 0) & 0xff;
                    360: }
                    361: 
                    362: static void sd_response_r6_make(SDState *sd, uint8_t *response)
                    363: {
                    364:     uint16_t arg;
                    365:     uint16_t status;
                    366: 
                    367:     arg = sd->rca;
                    368:     status = ((sd->card_status >> 8) & 0xc000) |
                    369:              ((sd->card_status >> 6) & 0x2000) |
                    370:               (sd->card_status & 0x1fff);
                    371: 
                    372:     response[0] = (arg >> 8) & 0xff;
                    373:     response[1] = arg & 0xff;
                    374:     response[2] = (status >> 8) & 0xff;
                    375:     response[3] = status & 0xff;
                    376: }
                    377: 
                    378: static void sd_response_r7_make(SDState *sd, uint8_t *response)
                    379: {
                    380:     response[0] = (sd->vhs >> 24) & 0xff;
                    381:     response[1] = (sd->vhs >> 16) & 0xff;
                    382:     response[2] = (sd->vhs >>  8) & 0xff;
                    383:     response[3] = (sd->vhs >>  0) & 0xff;
                    384: }
                    385: 
                    386: static void sd_reset(SDState *sd, BlockDriverState *bdrv)
                    387: {
1.1.1.4   root      388:     uint64_t size;
1.1       root      389:     uint64_t sect;
                    390: 
1.1.1.3   root      391:     if (bdrv) {
                    392:         bdrv_get_geometry(bdrv, &sect);
                    393:     } else {
                    394:         sect = 0;
                    395:     }
1.1       root      396:     sect <<= 9;
                    397: 
1.1.1.4   root      398:     size = sect + 1;
1.1       root      399: 
                    400:     sect = (size >> (HWBLOCK_SHIFT + SECTOR_SHIFT + WPGROUP_SHIFT)) + 1;
                    401: 
                    402:     sd->state = sd_idle_state;
                    403:     sd->rca = 0x0000;
                    404:     sd_set_ocr(sd);
                    405:     sd_set_scr(sd);
                    406:     sd_set_cid(sd);
                    407:     sd_set_csd(sd, size);
                    408:     sd_set_cardstatus(sd);
                    409:     sd_set_sdstatus(sd);
                    410: 
                    411:     sd->bdrv = bdrv;
                    412: 
                    413:     if (sd->wp_groups)
                    414:         qemu_free(sd->wp_groups);
1.1.1.3   root      415:     sd->wp_switch = bdrv ? bdrv_is_read_only(bdrv) : 0;
1.1       root      416:     sd->wp_groups = (int *) qemu_mallocz(sizeof(int) * sect);
                    417:     memset(sd->function_group, 0, sizeof(int) * 6);
                    418:     sd->erase_start = 0;
                    419:     sd->erase_end = 0;
                    420:     sd->size = size;
                    421:     sd->blk_len = 0x200;
                    422:     sd->pwd_len = 0;
                    423: }
                    424: 
1.1.1.6 ! root      425: static void sd_cardchange(void *opaque, int reason)
1.1       root      426: {
                    427:     SDState *sd = opaque;
1.1.1.6 ! root      428: 
        !           429:     if (!(reason & CHANGE_MEDIA)) {
        !           430:         return;
        !           431:     }
        !           432: 
1.1       root      433:     qemu_set_irq(sd->inserted_cb, bdrv_is_inserted(sd->bdrv));
                    434:     if (bdrv_is_inserted(sd->bdrv)) {
                    435:         sd_reset(sd, sd->bdrv);
                    436:         qemu_set_irq(sd->readonly_cb, sd->wp_switch);
                    437:     }
                    438: }
                    439: 
                    440: /* We do not model the chip select pin, so allow the board to select
                    441:    whether card should be in SSI or MMC/SD mode.  It is also up to the
                    442:    board to ensure that ssi transfers only occur when the chip select
                    443:    is asserted.  */
                    444: SDState *sd_init(BlockDriverState *bs, int is_spi)
                    445: {
                    446:     SDState *sd;
                    447: 
                    448:     sd = (SDState *) qemu_mallocz(sizeof(SDState));
1.1.1.6 ! root      449:     sd->buf = qemu_blockalign(bs, 512);
1.1       root      450:     sd->spi = is_spi;
1.1.1.2   root      451:     sd->enable = 1;
1.1       root      452:     sd_reset(sd, bs);
1.1.1.3   root      453:     if (sd->bdrv) {
                    454:         bdrv_set_change_cb(sd->bdrv, sd_cardchange, sd);
                    455:     }
1.1       root      456:     return sd;
                    457: }
                    458: 
                    459: void sd_set_cb(SDState *sd, qemu_irq readonly, qemu_irq insert)
                    460: {
                    461:     sd->readonly_cb = readonly;
                    462:     sd->inserted_cb = insert;
                    463:     qemu_set_irq(readonly, bdrv_is_read_only(sd->bdrv));
                    464:     qemu_set_irq(insert, bdrv_is_inserted(sd->bdrv));
                    465: }
                    466: 
                    467: static void sd_erase(SDState *sd)
                    468: {
                    469:     int i, start, end;
                    470:     if (!sd->erase_start || !sd->erase_end) {
                    471:         sd->card_status |= ERASE_SEQ_ERROR;
                    472:         return;
                    473:     }
                    474: 
                    475:     start = sd->erase_start >>
                    476:             (HWBLOCK_SHIFT + SECTOR_SHIFT + WPGROUP_SHIFT);
                    477:     end = sd->erase_end >>
                    478:             (HWBLOCK_SHIFT + SECTOR_SHIFT + WPGROUP_SHIFT);
                    479:     sd->erase_start = 0;
                    480:     sd->erase_end = 0;
                    481:     sd->csd[14] |= 0x40;
                    482: 
                    483:     for (i = start; i <= end; i ++)
                    484:         if (sd->wp_groups[i])
                    485:             sd->card_status |= WP_ERASE_SKIP;
                    486: }
                    487: 
1.1.1.4   root      488: static uint32_t sd_wpbits(SDState *sd, uint64_t addr)
1.1       root      489: {
                    490:     uint32_t i, wpnum;
                    491:     uint32_t ret = 0;
                    492: 
                    493:     wpnum = addr >> (HWBLOCK_SHIFT + SECTOR_SHIFT + WPGROUP_SHIFT);
                    494: 
                    495:     for (i = 0; i < 32; i ++, wpnum ++, addr += WPGROUP_SIZE)
                    496:         if (addr < sd->size && sd->wp_groups[wpnum])
                    497:             ret |= (1 << i);
                    498: 
                    499:     return ret;
                    500: }
                    501: 
                    502: static void sd_function_switch(SDState *sd, uint32_t arg)
                    503: {
                    504:     int i, mode, new_func, crc;
                    505:     mode = !!(arg & 0x80000000);
                    506: 
                    507:     sd->data[0] = 0x00;                /* Maximum current consumption */
                    508:     sd->data[1] = 0x01;
                    509:     sd->data[2] = 0x80;                /* Supported group 6 functions */
                    510:     sd->data[3] = 0x01;
                    511:     sd->data[4] = 0x80;                /* Supported group 5 functions */
                    512:     sd->data[5] = 0x01;
                    513:     sd->data[6] = 0x80;                /* Supported group 4 functions */
                    514:     sd->data[7] = 0x01;
                    515:     sd->data[8] = 0x80;                /* Supported group 3 functions */
                    516:     sd->data[9] = 0x01;
                    517:     sd->data[10] = 0x80;       /* Supported group 2 functions */
                    518:     sd->data[11] = 0x43;
                    519:     sd->data[12] = 0x80;       /* Supported group 1 functions */
                    520:     sd->data[13] = 0x03;
                    521:     for (i = 0; i < 6; i ++) {
                    522:         new_func = (arg >> (i * 4)) & 0x0f;
                    523:         if (mode && new_func != 0x0f)
                    524:             sd->function_group[i] = new_func;
                    525:         sd->data[14 + (i >> 1)] = new_func << ((i * 4) & 4);
                    526:     }
                    527:     memset(&sd->data[17], 0, 47);
                    528:     crc = sd_crc16(sd->data, 64);
                    529:     sd->data[65] = crc >> 8;
                    530:     sd->data[66] = crc & 0xff;
                    531: }
                    532: 
                    533: static inline int sd_wp_addr(SDState *sd, uint32_t addr)
                    534: {
                    535:     return sd->wp_groups[addr >>
                    536:             (HWBLOCK_SHIFT + SECTOR_SHIFT + WPGROUP_SHIFT)];
                    537: }
                    538: 
                    539: static void sd_lock_command(SDState *sd)
                    540: {
                    541:     int erase, lock, clr_pwd, set_pwd, pwd_len;
                    542:     erase = !!(sd->data[0] & 0x08);
                    543:     lock = sd->data[0] & 0x04;
                    544:     clr_pwd = sd->data[0] & 0x02;
                    545:     set_pwd = sd->data[0] & 0x01;
                    546: 
                    547:     if (sd->blk_len > 1)
                    548:         pwd_len = sd->data[1];
                    549:     else
                    550:         pwd_len = 0;
                    551: 
                    552:     if (erase) {
                    553:         if (!(sd->card_status & CARD_IS_LOCKED) || sd->blk_len > 1 ||
                    554:                         set_pwd || clr_pwd || lock || sd->wp_switch ||
                    555:                         (sd->csd[14] & 0x20)) {
                    556:             sd->card_status |= LOCK_UNLOCK_FAILED;
                    557:             return;
                    558:         }
                    559:         memset(sd->wp_groups, 0, sizeof(int) * (sd->size >>
                    560:                         (HWBLOCK_SHIFT + SECTOR_SHIFT + WPGROUP_SHIFT)));
                    561:         sd->csd[14] &= ~0x10;
                    562:         sd->card_status &= ~CARD_IS_LOCKED;
                    563:         sd->pwd_len = 0;
                    564:         /* Erasing the entire card here! */
1.1.1.2   root      565:         fprintf(stderr, "SD: Card force-erased by CMD42\n");
1.1       root      566:         return;
                    567:     }
                    568: 
                    569:     if (sd->blk_len < 2 + pwd_len ||
                    570:                     pwd_len <= sd->pwd_len ||
                    571:                     pwd_len > sd->pwd_len + 16) {
                    572:         sd->card_status |= LOCK_UNLOCK_FAILED;
                    573:         return;
                    574:     }
                    575: 
                    576:     if (sd->pwd_len && memcmp(sd->pwd, sd->data + 2, sd->pwd_len)) {
                    577:         sd->card_status |= LOCK_UNLOCK_FAILED;
                    578:         return;
                    579:     }
                    580: 
                    581:     pwd_len -= sd->pwd_len;
                    582:     if ((pwd_len && !set_pwd) ||
                    583:                     (clr_pwd && (set_pwd || lock)) ||
                    584:                     (lock && !sd->pwd_len && !set_pwd) ||
                    585:                     (!set_pwd && !clr_pwd &&
                    586:                      (((sd->card_status & CARD_IS_LOCKED) && lock) ||
                    587:                       (!(sd->card_status & CARD_IS_LOCKED) && !lock)))) {
                    588:         sd->card_status |= LOCK_UNLOCK_FAILED;
                    589:         return;
                    590:     }
                    591: 
                    592:     if (set_pwd) {
                    593:         memcpy(sd->pwd, sd->data + 2 + sd->pwd_len, pwd_len);
                    594:         sd->pwd_len = pwd_len;
                    595:     }
                    596: 
                    597:     if (clr_pwd) {
                    598:         sd->pwd_len = 0;
                    599:     }
                    600: 
                    601:     if (lock)
                    602:         sd->card_status |= CARD_IS_LOCKED;
                    603:     else
                    604:         sd->card_status &= ~CARD_IS_LOCKED;
                    605: }
                    606: 
                    607: static sd_rsp_type_t sd_normal_command(SDState *sd,
1.1.1.3   root      608:                                        SDRequest req)
1.1       root      609: {
                    610:     uint32_t rca = 0x0000;
1.1.1.4   root      611:     uint64_t addr = (sd->ocr & (1 << 30)) ? (uint64_t) req.arg << 9 : req.arg;
1.1       root      612: 
                    613:     if (sd_cmd_type[req.cmd] == sd_ac || sd_cmd_type[req.cmd] == sd_adtc)
                    614:         rca = req.arg >> 16;
                    615: 
                    616:     DPRINTF("CMD%d 0x%08x state %d\n", req.cmd, req.arg, sd->state);
                    617:     switch (req.cmd) {
                    618:     /* Basic commands (Class 0 and Class 1) */
                    619:     case 0:    /* CMD0:   GO_IDLE_STATE */
                    620:         switch (sd->state) {
                    621:         case sd_inactive_state:
                    622:             return sd->spi ? sd_r1 : sd_r0;
                    623: 
                    624:         default:
                    625:             sd->state = sd_idle_state;
                    626:             sd_reset(sd, sd->bdrv);
                    627:             return sd->spi ? sd_r1 : sd_r0;
                    628:         }
                    629:         break;
                    630: 
                    631:     case 1:    /* CMD1:   SEND_OP_CMD */
                    632:         if (!sd->spi)
                    633:             goto bad_cmd;
                    634: 
                    635:         sd->state = sd_transfer_state;
                    636:         return sd_r1;
                    637: 
                    638:     case 2:    /* CMD2:   ALL_SEND_CID */
                    639:         if (sd->spi)
                    640:             goto bad_cmd;
                    641:         switch (sd->state) {
                    642:         case sd_ready_state:
                    643:             sd->state = sd_identification_state;
                    644:             return sd_r2_i;
                    645: 
                    646:         default:
                    647:             break;
                    648:         }
                    649:         break;
                    650: 
                    651:     case 3:    /* CMD3:   SEND_RELATIVE_ADDR */
                    652:         if (sd->spi)
                    653:             goto bad_cmd;
                    654:         switch (sd->state) {
                    655:         case sd_identification_state:
                    656:         case sd_standby_state:
                    657:             sd->state = sd_standby_state;
                    658:             sd_set_rca(sd);
                    659:             return sd_r6;
                    660: 
                    661:         default:
                    662:             break;
                    663:         }
                    664:         break;
                    665: 
                    666:     case 4:    /* CMD4:   SEND_DSR */
                    667:         if (sd->spi)
                    668:             goto bad_cmd;
                    669:         switch (sd->state) {
                    670:         case sd_standby_state:
                    671:             break;
                    672: 
                    673:         default:
                    674:             break;
                    675:         }
                    676:         break;
                    677: 
1.1.1.5   root      678:     case 5: /* CMD5: reserved for SDIO cards */
                    679:         sd->card_status |= ILLEGAL_COMMAND;
                    680:         return sd_r0;
                    681: 
1.1       root      682:     case 6:    /* CMD6:   SWITCH_FUNCTION */
                    683:         if (sd->spi)
                    684:             goto bad_cmd;
                    685:         switch (sd->mode) {
                    686:         case sd_data_transfer_mode:
                    687:             sd_function_switch(sd, req.arg);
                    688:             sd->state = sd_sendingdata_state;
                    689:             sd->data_start = 0;
                    690:             sd->data_offset = 0;
                    691:             return sd_r1;
                    692: 
                    693:         default:
                    694:             break;
                    695:         }
                    696:         break;
                    697: 
                    698:     case 7:    /* CMD7:   SELECT/DESELECT_CARD */
                    699:         if (sd->spi)
                    700:             goto bad_cmd;
                    701:         switch (sd->state) {
                    702:         case sd_standby_state:
                    703:             if (sd->rca != rca)
                    704:                 return sd_r0;
                    705: 
                    706:             sd->state = sd_transfer_state;
                    707:             return sd_r1b;
                    708: 
                    709:         case sd_transfer_state:
                    710:         case sd_sendingdata_state:
                    711:             if (sd->rca == rca)
                    712:                 break;
                    713: 
                    714:             sd->state = sd_standby_state;
                    715:             return sd_r1b;
                    716: 
                    717:         case sd_disconnect_state:
                    718:             if (sd->rca != rca)
                    719:                 return sd_r0;
                    720: 
                    721:             sd->state = sd_programming_state;
                    722:             return sd_r1b;
                    723: 
                    724:         case sd_programming_state:
                    725:             if (sd->rca == rca)
                    726:                 break;
                    727: 
                    728:             sd->state = sd_disconnect_state;
                    729:             return sd_r1b;
                    730: 
                    731:         default:
                    732:             break;
                    733:         }
                    734:         break;
                    735: 
                    736:     case 8:    /* CMD8:   SEND_IF_COND */
                    737:         /* Physical Layer Specification Version 2.00 command */
                    738:         switch (sd->state) {
                    739:         case sd_idle_state:
                    740:             sd->vhs = 0;
                    741: 
                    742:             /* No response if not exactly one VHS bit is set.  */
                    743:             if (!(req.arg >> 8) || (req.arg >> ffs(req.arg & ~0xff)))
                    744:                 return sd->spi ? sd_r7 : sd_r0;
                    745: 
                    746:             /* Accept.  */
                    747:             sd->vhs = req.arg;
                    748:             return sd_r7;
                    749: 
                    750:         default:
                    751:             break;
                    752:         }
                    753:         break;
                    754: 
                    755:     case 9:    /* CMD9:   SEND_CSD */
                    756:         switch (sd->state) {
                    757:         case sd_standby_state:
                    758:             if (sd->rca != rca)
                    759:                 return sd_r0;
                    760: 
                    761:             return sd_r2_s;
                    762: 
                    763:         case sd_transfer_state:
                    764:             if (!sd->spi)
                    765:                 break;
                    766:             sd->state = sd_sendingdata_state;
                    767:             memcpy(sd->data, sd->csd, 16);
1.1.1.4   root      768:             sd->data_start = addr;
1.1       root      769:             sd->data_offset = 0;
                    770:             return sd_r1;
                    771: 
                    772:         default:
                    773:             break;
                    774:         }
                    775:         break;
                    776: 
                    777:     case 10:   /* CMD10:  SEND_CID */
                    778:         switch (sd->state) {
                    779:         case sd_standby_state:
                    780:             if (sd->rca != rca)
                    781:                 return sd_r0;
                    782: 
                    783:             return sd_r2_i;
                    784: 
                    785:         case sd_transfer_state:
                    786:             if (!sd->spi)
                    787:                 break;
                    788:             sd->state = sd_sendingdata_state;
                    789:             memcpy(sd->data, sd->cid, 16);
1.1.1.4   root      790:             sd->data_start = addr;
1.1       root      791:             sd->data_offset = 0;
                    792:             return sd_r1;
                    793: 
                    794:         default:
                    795:             break;
                    796:         }
                    797:         break;
                    798: 
                    799:     case 11:   /* CMD11:  READ_DAT_UNTIL_STOP */
                    800:         if (sd->spi)
                    801:             goto bad_cmd;
                    802:         switch (sd->state) {
                    803:         case sd_transfer_state:
                    804:             sd->state = sd_sendingdata_state;
                    805:             sd->data_start = req.arg;
                    806:             sd->data_offset = 0;
                    807: 
                    808:             if (sd->data_start + sd->blk_len > sd->size)
                    809:                 sd->card_status |= ADDRESS_ERROR;
                    810:             return sd_r0;
                    811: 
                    812:         default:
                    813:             break;
                    814:         }
                    815:         break;
                    816: 
                    817:     case 12:   /* CMD12:  STOP_TRANSMISSION */
                    818:         switch (sd->state) {
                    819:         case sd_sendingdata_state:
                    820:             sd->state = sd_transfer_state;
                    821:             return sd_r1b;
                    822: 
                    823:         case sd_receivingdata_state:
                    824:             sd->state = sd_programming_state;
                    825:             /* Bzzzzzzztt .... Operation complete.  */
                    826:             sd->state = sd_transfer_state;
                    827:             return sd_r1b;
                    828: 
                    829:         default:
                    830:             break;
                    831:         }
                    832:         break;
                    833: 
                    834:     case 13:   /* CMD13:  SEND_STATUS */
                    835:         switch (sd->mode) {
                    836:         case sd_data_transfer_mode:
                    837:             if (sd->rca != rca)
                    838:                 return sd_r0;
                    839: 
                    840:             return sd_r1;
                    841: 
                    842:         default:
                    843:             break;
                    844:         }
                    845:         break;
                    846: 
                    847:     case 15:   /* CMD15:  GO_INACTIVE_STATE */
                    848:         if (sd->spi)
                    849:             goto bad_cmd;
                    850:         switch (sd->mode) {
                    851:         case sd_data_transfer_mode:
                    852:             if (sd->rca != rca)
                    853:                 return sd_r0;
                    854: 
                    855:             sd->state = sd_inactive_state;
                    856:             return sd_r0;
                    857: 
                    858:         default:
                    859:             break;
                    860:         }
                    861:         break;
                    862: 
                    863:     /* Block read commands (Classs 2) */
                    864:     case 16:   /* CMD16:  SET_BLOCKLEN */
                    865:         switch (sd->state) {
                    866:         case sd_transfer_state:
                    867:             if (req.arg > (1 << HWBLOCK_SHIFT))
                    868:                 sd->card_status |= BLOCK_LEN_ERROR;
                    869:             else
                    870:                 sd->blk_len = req.arg;
                    871: 
                    872:             return sd_r1;
                    873: 
                    874:         default:
                    875:             break;
                    876:         }
                    877:         break;
                    878: 
                    879:     case 17:   /* CMD17:  READ_SINGLE_BLOCK */
                    880:         switch (sd->state) {
                    881:         case sd_transfer_state:
                    882:             sd->state = sd_sendingdata_state;
1.1.1.4   root      883:             sd->data_start = addr;
1.1       root      884:             sd->data_offset = 0;
                    885: 
                    886:             if (sd->data_start + sd->blk_len > sd->size)
                    887:                 sd->card_status |= ADDRESS_ERROR;
                    888:             return sd_r1;
                    889: 
                    890:         default:
                    891:             break;
                    892:         }
                    893:         break;
                    894: 
                    895:     case 18:   /* CMD18:  READ_MULTIPLE_BLOCK */
                    896:         switch (sd->state) {
                    897:         case sd_transfer_state:
                    898:             sd->state = sd_sendingdata_state;
1.1.1.4   root      899:             sd->data_start = addr;
1.1       root      900:             sd->data_offset = 0;
                    901: 
                    902:             if (sd->data_start + sd->blk_len > sd->size)
                    903:                 sd->card_status |= ADDRESS_ERROR;
                    904:             return sd_r1;
                    905: 
                    906:         default:
                    907:             break;
                    908:         }
                    909:         break;
                    910: 
                    911:     /* Block write commands (Class 4) */
                    912:     case 24:   /* CMD24:  WRITE_SINGLE_BLOCK */
                    913:         if (sd->spi)
                    914:             goto unimplemented_cmd;
                    915:         switch (sd->state) {
                    916:         case sd_transfer_state:
                    917:             /* Writing in SPI mode not implemented.  */
                    918:             if (sd->spi)
                    919:                 break;
                    920:             sd->state = sd_receivingdata_state;
1.1.1.4   root      921:             sd->data_start = addr;
1.1       root      922:             sd->data_offset = 0;
                    923:             sd->blk_written = 0;
                    924: 
                    925:             if (sd->data_start + sd->blk_len > sd->size)
                    926:                 sd->card_status |= ADDRESS_ERROR;
                    927:             if (sd_wp_addr(sd, sd->data_start))
                    928:                 sd->card_status |= WP_VIOLATION;
                    929:             if (sd->csd[14] & 0x30)
                    930:                 sd->card_status |= WP_VIOLATION;
                    931:             return sd_r1;
                    932: 
                    933:         default:
                    934:             break;
                    935:         }
                    936:         break;
                    937: 
                    938:     case 25:   /* CMD25:  WRITE_MULTIPLE_BLOCK */
                    939:         if (sd->spi)
                    940:             goto unimplemented_cmd;
                    941:         switch (sd->state) {
                    942:         case sd_transfer_state:
                    943:             /* Writing in SPI mode not implemented.  */
                    944:             if (sd->spi)
                    945:                 break;
                    946:             sd->state = sd_receivingdata_state;
1.1.1.4   root      947:             sd->data_start = addr;
1.1       root      948:             sd->data_offset = 0;
                    949:             sd->blk_written = 0;
                    950: 
                    951:             if (sd->data_start + sd->blk_len > sd->size)
                    952:                 sd->card_status |= ADDRESS_ERROR;
                    953:             if (sd_wp_addr(sd, sd->data_start))
                    954:                 sd->card_status |= WP_VIOLATION;
                    955:             if (sd->csd[14] & 0x30)
                    956:                 sd->card_status |= WP_VIOLATION;
                    957:             return sd_r1;
                    958: 
                    959:         default:
                    960:             break;
                    961:         }
                    962:         break;
                    963: 
                    964:     case 26:   /* CMD26:  PROGRAM_CID */
                    965:         if (sd->spi)
                    966:             goto bad_cmd;
                    967:         switch (sd->state) {
                    968:         case sd_transfer_state:
                    969:             sd->state = sd_receivingdata_state;
                    970:             sd->data_start = 0;
                    971:             sd->data_offset = 0;
                    972:             return sd_r1;
                    973: 
                    974:         default:
                    975:             break;
                    976:         }
                    977:         break;
                    978: 
                    979:     case 27:   /* CMD27:  PROGRAM_CSD */
                    980:         if (sd->spi)
                    981:             goto unimplemented_cmd;
                    982:         switch (sd->state) {
                    983:         case sd_transfer_state:
                    984:             sd->state = sd_receivingdata_state;
                    985:             sd->data_start = 0;
                    986:             sd->data_offset = 0;
                    987:             return sd_r1;
                    988: 
                    989:         default:
                    990:             break;
                    991:         }
                    992:         break;
                    993: 
                    994:     /* Write protection (Class 6) */
                    995:     case 28:   /* CMD28:  SET_WRITE_PROT */
                    996:         switch (sd->state) {
                    997:         case sd_transfer_state:
1.1.1.4   root      998:             if (addr >= sd->size) {
1.1       root      999:                 sd->card_status = ADDRESS_ERROR;
                   1000:                 return sd_r1b;
                   1001:             }
                   1002: 
                   1003:             sd->state = sd_programming_state;
1.1.1.4   root     1004:             sd->wp_groups[addr >> (HWBLOCK_SHIFT +
1.1       root     1005:                             SECTOR_SHIFT + WPGROUP_SHIFT)] = 1;
                   1006:             /* Bzzzzzzztt .... Operation complete.  */
                   1007:             sd->state = sd_transfer_state;
                   1008:             return sd_r1b;
                   1009: 
                   1010:         default:
                   1011:             break;
                   1012:         }
                   1013:         break;
                   1014: 
                   1015:     case 29:   /* CMD29:  CLR_WRITE_PROT */
                   1016:         switch (sd->state) {
                   1017:         case sd_transfer_state:
1.1.1.4   root     1018:             if (addr >= sd->size) {
1.1       root     1019:                 sd->card_status = ADDRESS_ERROR;
                   1020:                 return sd_r1b;
                   1021:             }
                   1022: 
                   1023:             sd->state = sd_programming_state;
1.1.1.4   root     1024:             sd->wp_groups[addr >> (HWBLOCK_SHIFT +
1.1       root     1025:                             SECTOR_SHIFT + WPGROUP_SHIFT)] = 0;
                   1026:             /* Bzzzzzzztt .... Operation complete.  */
                   1027:             sd->state = sd_transfer_state;
                   1028:             return sd_r1b;
                   1029: 
                   1030:         default:
                   1031:             break;
                   1032:         }
                   1033:         break;
                   1034: 
                   1035:     case 30:   /* CMD30:  SEND_WRITE_PROT */
                   1036:         switch (sd->state) {
                   1037:         case sd_transfer_state:
                   1038:             sd->state = sd_sendingdata_state;
                   1039:             *(uint32_t *) sd->data = sd_wpbits(sd, req.arg);
1.1.1.4   root     1040:             sd->data_start = addr;
1.1       root     1041:             sd->data_offset = 0;
                   1042:             return sd_r1b;
                   1043: 
                   1044:         default:
                   1045:             break;
                   1046:         }
                   1047:         break;
                   1048: 
                   1049:     /* Erase commands (Class 5) */
                   1050:     case 32:   /* CMD32:  ERASE_WR_BLK_START */
                   1051:         switch (sd->state) {
                   1052:         case sd_transfer_state:
                   1053:             sd->erase_start = req.arg;
                   1054:             return sd_r1;
                   1055: 
                   1056:         default:
                   1057:             break;
                   1058:         }
                   1059:         break;
                   1060: 
                   1061:     case 33:   /* CMD33:  ERASE_WR_BLK_END */
                   1062:         switch (sd->state) {
                   1063:         case sd_transfer_state:
                   1064:             sd->erase_end = req.arg;
                   1065:             return sd_r1;
                   1066: 
                   1067:         default:
                   1068:             break;
                   1069:         }
                   1070:         break;
                   1071: 
                   1072:     case 38:   /* CMD38:  ERASE */
                   1073:         switch (sd->state) {
                   1074:         case sd_transfer_state:
                   1075:             if (sd->csd[14] & 0x30) {
                   1076:                 sd->card_status |= WP_VIOLATION;
                   1077:                 return sd_r1b;
                   1078:             }
                   1079: 
                   1080:             sd->state = sd_programming_state;
                   1081:             sd_erase(sd);
                   1082:             /* Bzzzzzzztt .... Operation complete.  */
                   1083:             sd->state = sd_transfer_state;
                   1084:             return sd_r1b;
                   1085: 
                   1086:         default:
                   1087:             break;
                   1088:         }
                   1089:         break;
                   1090: 
                   1091:     /* Lock card commands (Class 7) */
                   1092:     case 42:   /* CMD42:  LOCK_UNLOCK */
                   1093:         if (sd->spi)
                   1094:             goto unimplemented_cmd;
                   1095:         switch (sd->state) {
                   1096:         case sd_transfer_state:
                   1097:             sd->state = sd_receivingdata_state;
                   1098:             sd->data_start = 0;
                   1099:             sd->data_offset = 0;
                   1100:             return sd_r1;
                   1101: 
                   1102:         default:
                   1103:             break;
                   1104:         }
                   1105:         break;
                   1106: 
                   1107:     /* Application specific commands (Class 8) */
                   1108:     case 55:   /* CMD55:  APP_CMD */
                   1109:         if (sd->rca != rca)
                   1110:             return sd_r0;
                   1111: 
                   1112:         sd->card_status |= APP_CMD;
                   1113:         return sd_r1;
                   1114: 
                   1115:     case 56:   /* CMD56:  GEN_CMD */
1.1.1.2   root     1116:         fprintf(stderr, "SD: GEN_CMD 0x%08x\n", req.arg);
1.1       root     1117: 
                   1118:         switch (sd->state) {
                   1119:         case sd_transfer_state:
                   1120:             sd->data_offset = 0;
                   1121:             if (req.arg & 1)
                   1122:                 sd->state = sd_sendingdata_state;
                   1123:             else
                   1124:                 sd->state = sd_receivingdata_state;
                   1125:             return sd_r1;
                   1126: 
                   1127:         default:
                   1128:             break;
                   1129:         }
                   1130:         break;
                   1131: 
                   1132:     default:
                   1133:     bad_cmd:
                   1134:         sd->card_status |= ILLEGAL_COMMAND;
                   1135: 
1.1.1.2   root     1136:         fprintf(stderr, "SD: Unknown CMD%i\n", req.cmd);
1.1       root     1137:         return sd_r0;
                   1138: 
                   1139:     unimplemented_cmd:
                   1140:         /* Commands that are recognised but not yet implemented in SPI mode.  */
                   1141:         sd->card_status |= ILLEGAL_COMMAND;
1.1.1.2   root     1142:         fprintf(stderr, "SD: CMD%i not implemented in SPI mode\n", req.cmd);
1.1       root     1143:         return sd_r0;
                   1144:     }
                   1145: 
                   1146:     sd->card_status |= ILLEGAL_COMMAND;
1.1.1.2   root     1147:     fprintf(stderr, "SD: CMD%i in a wrong state\n", req.cmd);
1.1       root     1148:     return sd_r0;
                   1149: }
                   1150: 
                   1151: static sd_rsp_type_t sd_app_command(SDState *sd,
1.1.1.5   root     1152:                                     SDRequest req)
                   1153: {
1.1       root     1154:     DPRINTF("ACMD%d 0x%08x\n", req.cmd, req.arg);
                   1155:     switch (req.cmd) {
                   1156:     case 6:    /* ACMD6:  SET_BUS_WIDTH */
                   1157:         switch (sd->state) {
                   1158:         case sd_transfer_state:
                   1159:             sd->sd_status[0] &= 0x3f;
                   1160:             sd->sd_status[0] |= (req.arg & 0x03) << 6;
                   1161:             return sd_r1;
                   1162: 
                   1163:         default:
                   1164:             break;
                   1165:         }
                   1166:         break;
                   1167: 
                   1168:     case 13:   /* ACMD13: SD_STATUS */
                   1169:         switch (sd->state) {
                   1170:         case sd_transfer_state:
                   1171:             sd->data_start = 0;
                   1172:             sd->data_offset = 0;
                   1173:             return sd_r1;
                   1174: 
                   1175:         default:
                   1176:             break;
                   1177:         }
                   1178:         break;
                   1179: 
                   1180:     case 22:   /* ACMD22: SEND_NUM_WR_BLOCKS */
                   1181:         switch (sd->state) {
                   1182:         case sd_transfer_state:
                   1183:             *(uint32_t *) sd->data = sd->blk_written;
                   1184: 
                   1185:             sd->data_start = 0;
                   1186:             sd->data_offset = 0;
                   1187:             return sd_r1;
                   1188: 
                   1189:         default:
                   1190:             break;
                   1191:         }
                   1192:         break;
                   1193: 
                   1194:     case 23:   /* ACMD23: SET_WR_BLK_ERASE_COUNT */
                   1195:         switch (sd->state) {
                   1196:         case sd_transfer_state:
                   1197:             return sd_r1;
                   1198: 
                   1199:         default:
                   1200:             break;
                   1201:         }
                   1202:         break;
                   1203: 
                   1204:     case 41:   /* ACMD41: SD_APP_OP_COND */
                   1205:         if (sd->spi) {
                   1206:             /* SEND_OP_CMD */
                   1207:             sd->state = sd_transfer_state;
                   1208:             return sd_r1;
                   1209:         }
                   1210:         switch (sd->state) {
                   1211:         case sd_idle_state:
                   1212:             /* We accept any voltage.  10000 V is nothing.  */
                   1213:             if (req.arg)
                   1214:                 sd->state = sd_ready_state;
                   1215: 
                   1216:             return sd_r3;
                   1217: 
                   1218:         default:
                   1219:             break;
                   1220:         }
                   1221:         break;
                   1222: 
                   1223:     case 42:   /* ACMD42: SET_CLR_CARD_DETECT */
                   1224:         switch (sd->state) {
                   1225:         case sd_transfer_state:
                   1226:             /* Bringing in the 50KOhm pull-up resistor... Done.  */
                   1227:             return sd_r1;
                   1228: 
                   1229:         default:
                   1230:             break;
                   1231:         }
                   1232:         break;
                   1233: 
                   1234:     case 51:   /* ACMD51: SEND_SCR */
                   1235:         switch (sd->state) {
                   1236:         case sd_transfer_state:
                   1237:             sd->state = sd_sendingdata_state;
                   1238:             sd->data_start = 0;
                   1239:             sd->data_offset = 0;
                   1240:             return sd_r1;
                   1241: 
                   1242:         default:
                   1243:             break;
                   1244:         }
                   1245:         break;
                   1246: 
                   1247:     default:
                   1248:         /* Fall back to standard commands.  */
                   1249:         sd->card_status &= ~APP_CMD;
                   1250:         return sd_normal_command(sd, req);
                   1251:     }
                   1252: 
1.1.1.2   root     1253:     fprintf(stderr, "SD: ACMD%i in a wrong state\n", req.cmd);
1.1       root     1254:     return sd_r0;
                   1255: }
                   1256: 
1.1.1.3   root     1257: int sd_do_command(SDState *sd, SDRequest *req,
1.1       root     1258:                   uint8_t *response) {
                   1259:     uint32_t last_status = sd->card_status;
                   1260:     sd_rsp_type_t rtype;
                   1261:     int rsplen;
                   1262: 
1.1.1.3   root     1263:     if (!sd->bdrv || !bdrv_is_inserted(sd->bdrv) || !sd->enable) {
1.1       root     1264:         return 0;
                   1265:     }
                   1266: 
                   1267:     if (sd_req_crc_validate(req)) {
                   1268:         sd->card_status &= ~COM_CRC_ERROR;
                   1269:         return 0;
                   1270:     }
                   1271: 
                   1272:     sd->card_status &= ~CARD_STATUS_B;
                   1273:     sd_set_status(sd);
                   1274: 
                   1275:     if (last_status & CARD_IS_LOCKED)
                   1276:         if (((last_status & APP_CMD) &&
                   1277:                                  req->cmd == 41) ||
                   1278:                         (!(last_status & APP_CMD) &&
                   1279:                          (sd_cmd_class[req->cmd] == 0 ||
                   1280:                           sd_cmd_class[req->cmd] == 7 ||
                   1281:                           req->cmd == 16 || req->cmd == 55))) {
                   1282:             sd->card_status |= ILLEGAL_COMMAND;
1.1.1.2   root     1283:             fprintf(stderr, "SD: Card is locked\n");
1.1       root     1284:             return 0;
                   1285:         }
                   1286: 
                   1287:     if (last_status & APP_CMD) {
                   1288:         rtype = sd_app_command(sd, *req);
                   1289:         sd->card_status &= ~APP_CMD;
                   1290:     } else
                   1291:         rtype = sd_normal_command(sd, *req);
                   1292: 
                   1293:     sd->current_cmd = req->cmd;
                   1294: 
                   1295:     switch (rtype) {
                   1296:     case sd_r1:
                   1297:     case sd_r1b:
                   1298:         sd_response_r1_make(sd, response, last_status);
                   1299:         rsplen = 4;
                   1300:         break;
                   1301: 
                   1302:     case sd_r2_i:
                   1303:         memcpy(response, sd->cid, sizeof(sd->cid));
                   1304:         rsplen = 16;
                   1305:         break;
                   1306: 
                   1307:     case sd_r2_s:
                   1308:         memcpy(response, sd->csd, sizeof(sd->csd));
                   1309:         rsplen = 16;
                   1310:         break;
                   1311: 
                   1312:     case sd_r3:
                   1313:         sd_response_r3_make(sd, response);
                   1314:         rsplen = 4;
                   1315:         break;
                   1316: 
                   1317:     case sd_r6:
                   1318:         sd_response_r6_make(sd, response);
                   1319:         rsplen = 4;
                   1320:         break;
                   1321: 
                   1322:     case sd_r7:
                   1323:         sd_response_r7_make(sd, response);
                   1324:         rsplen = 4;
                   1325:         break;
                   1326: 
                   1327:     case sd_r0:
                   1328:     default:
                   1329:         rsplen = 0;
                   1330:         break;
                   1331:     }
                   1332: 
                   1333:     if (sd->card_status & ILLEGAL_COMMAND)
                   1334:         rsplen = 0;
                   1335: 
                   1336: #ifdef DEBUG_SD
                   1337:     if (rsplen) {
                   1338:         int i;
                   1339:         DPRINTF("Response:");
                   1340:         for (i = 0; i < rsplen; i++)
                   1341:             printf(" %02x", response[i]);
                   1342:         printf(" state %d\n", sd->state);
                   1343:     } else {
                   1344:         DPRINTF("No response %d\n", sd->state);
                   1345:     }
                   1346: #endif
                   1347: 
                   1348:     return rsplen;
                   1349: }
                   1350: 
1.1.1.4   root     1351: static void sd_blk_read(SDState *sd, uint64_t addr, uint32_t len)
1.1       root     1352: {
1.1.1.4   root     1353:     uint64_t end = addr + len;
1.1       root     1354: 
1.1.1.4   root     1355:     DPRINTF("sd_blk_read: addr = 0x%08llx, len = %d\n",
                   1356:             (unsigned long long) addr, len);
1.1       root     1357:     if (!sd->bdrv || bdrv_read(sd->bdrv, addr >> 9, sd->buf, 1) == -1) {
1.1.1.2   root     1358:         fprintf(stderr, "sd_blk_read: read error on host side\n");
1.1       root     1359:         return;
                   1360:     }
                   1361: 
                   1362:     if (end > (addr & ~511) + 512) {
                   1363:         memcpy(sd->data, sd->buf + (addr & 511), 512 - (addr & 511));
                   1364: 
                   1365:         if (bdrv_read(sd->bdrv, end >> 9, sd->buf, 1) == -1) {
1.1.1.2   root     1366:             fprintf(stderr, "sd_blk_read: read error on host side\n");
1.1       root     1367:             return;
                   1368:         }
                   1369:         memcpy(sd->data + 512 - (addr & 511), sd->buf, end & 511);
                   1370:     } else
                   1371:         memcpy(sd->data, sd->buf + (addr & 511), len);
                   1372: }
                   1373: 
1.1.1.4   root     1374: static void sd_blk_write(SDState *sd, uint64_t addr, uint32_t len)
1.1       root     1375: {
1.1.1.4   root     1376:     uint64_t end = addr + len;
1.1       root     1377: 
                   1378:     if ((addr & 511) || len < 512)
                   1379:         if (!sd->bdrv || bdrv_read(sd->bdrv, addr >> 9, sd->buf, 1) == -1) {
1.1.1.2   root     1380:             fprintf(stderr, "sd_blk_write: read error on host side\n");
1.1       root     1381:             return;
                   1382:         }
                   1383: 
                   1384:     if (end > (addr & ~511) + 512) {
                   1385:         memcpy(sd->buf + (addr & 511), sd->data, 512 - (addr & 511));
                   1386:         if (bdrv_write(sd->bdrv, addr >> 9, sd->buf, 1) == -1) {
1.1.1.2   root     1387:             fprintf(stderr, "sd_blk_write: write error on host side\n");
1.1       root     1388:             return;
                   1389:         }
                   1390: 
                   1391:         if (bdrv_read(sd->bdrv, end >> 9, sd->buf, 1) == -1) {
1.1.1.2   root     1392:             fprintf(stderr, "sd_blk_write: read error on host side\n");
1.1       root     1393:             return;
                   1394:         }
                   1395:         memcpy(sd->buf, sd->data + 512 - (addr & 511), end & 511);
                   1396:         if (bdrv_write(sd->bdrv, end >> 9, sd->buf, 1) == -1)
1.1.1.2   root     1397:             fprintf(stderr, "sd_blk_write: write error on host side\n");
1.1       root     1398:     } else {
                   1399:         memcpy(sd->buf + (addr & 511), sd->data, len);
                   1400:         if (!sd->bdrv || bdrv_write(sd->bdrv, addr >> 9, sd->buf, 1) == -1)
1.1.1.2   root     1401:             fprintf(stderr, "sd_blk_write: write error on host side\n");
1.1       root     1402:     }
                   1403: }
                   1404: 
                   1405: #define BLK_READ_BLOCK(a, len) sd_blk_read(sd, a, len)
                   1406: #define BLK_WRITE_BLOCK(a, len)        sd_blk_write(sd, a, len)
                   1407: #define APP_READ_BLOCK(a, len) memset(sd->data, 0xec, len)
                   1408: #define APP_WRITE_BLOCK(a, len)
                   1409: 
                   1410: void sd_write_data(SDState *sd, uint8_t value)
                   1411: {
                   1412:     int i;
                   1413: 
1.1.1.2   root     1414:     if (!sd->bdrv || !bdrv_is_inserted(sd->bdrv) || !sd->enable)
1.1       root     1415:         return;
                   1416: 
                   1417:     if (sd->state != sd_receivingdata_state) {
1.1.1.2   root     1418:         fprintf(stderr, "sd_write_data: not in Receiving-Data state\n");
1.1       root     1419:         return;
                   1420:     }
                   1421: 
                   1422:     if (sd->card_status & (ADDRESS_ERROR | WP_VIOLATION))
                   1423:         return;
                   1424: 
                   1425:     switch (sd->current_cmd) {
                   1426:     case 24:   /* CMD24:  WRITE_SINGLE_BLOCK */
                   1427:         sd->data[sd->data_offset ++] = value;
                   1428:         if (sd->data_offset >= sd->blk_len) {
                   1429:             /* TODO: Check CRC before committing */
                   1430:             sd->state = sd_programming_state;
                   1431:             BLK_WRITE_BLOCK(sd->data_start, sd->data_offset);
                   1432:             sd->blk_written ++;
                   1433:             sd->csd[14] |= 0x40;
                   1434:             /* Bzzzzzzztt .... Operation complete.  */
                   1435:             sd->state = sd_transfer_state;
                   1436:         }
                   1437:         break;
                   1438: 
                   1439:     case 25:   /* CMD25:  WRITE_MULTIPLE_BLOCK */
                   1440:         sd->data[sd->data_offset ++] = value;
                   1441:         if (sd->data_offset >= sd->blk_len) {
                   1442:             /* TODO: Check CRC before committing */
                   1443:             sd->state = sd_programming_state;
                   1444:             BLK_WRITE_BLOCK(sd->data_start, sd->data_offset);
                   1445:             sd->blk_written ++;
                   1446:             sd->data_start += sd->blk_len;
                   1447:             sd->data_offset = 0;
                   1448:             if (sd->data_start + sd->blk_len > sd->size) {
                   1449:                 sd->card_status |= ADDRESS_ERROR;
                   1450:                 break;
                   1451:             }
                   1452:             if (sd_wp_addr(sd, sd->data_start)) {
                   1453:                 sd->card_status |= WP_VIOLATION;
                   1454:                 break;
                   1455:             }
                   1456:             sd->csd[14] |= 0x40;
                   1457: 
                   1458:             /* Bzzzzzzztt .... Operation complete.  */
                   1459:             sd->state = sd_receivingdata_state;
                   1460:         }
                   1461:         break;
                   1462: 
                   1463:     case 26:   /* CMD26:  PROGRAM_CID */
                   1464:         sd->data[sd->data_offset ++] = value;
                   1465:         if (sd->data_offset >= sizeof(sd->cid)) {
                   1466:             /* TODO: Check CRC before committing */
                   1467:             sd->state = sd_programming_state;
                   1468:             for (i = 0; i < sizeof(sd->cid); i ++)
                   1469:                 if ((sd->cid[i] | 0x00) != sd->data[i])
                   1470:                     sd->card_status |= CID_CSD_OVERWRITE;
                   1471: 
                   1472:             if (!(sd->card_status & CID_CSD_OVERWRITE))
                   1473:                 for (i = 0; i < sizeof(sd->cid); i ++) {
                   1474:                     sd->cid[i] |= 0x00;
                   1475:                     sd->cid[i] &= sd->data[i];
                   1476:                 }
                   1477:             /* Bzzzzzzztt .... Operation complete.  */
                   1478:             sd->state = sd_transfer_state;
                   1479:         }
                   1480:         break;
                   1481: 
                   1482:     case 27:   /* CMD27:  PROGRAM_CSD */
                   1483:         sd->data[sd->data_offset ++] = value;
                   1484:         if (sd->data_offset >= sizeof(sd->csd)) {
                   1485:             /* TODO: Check CRC before committing */
                   1486:             sd->state = sd_programming_state;
                   1487:             for (i = 0; i < sizeof(sd->csd); i ++)
                   1488:                 if ((sd->csd[i] | sd_csd_rw_mask[i]) !=
                   1489:                     (sd->data[i] | sd_csd_rw_mask[i]))
                   1490:                     sd->card_status |= CID_CSD_OVERWRITE;
                   1491: 
                   1492:             /* Copy flag (OTP) & Permanent write protect */
                   1493:             if (sd->csd[14] & ~sd->data[14] & 0x60)
                   1494:                 sd->card_status |= CID_CSD_OVERWRITE;
                   1495: 
                   1496:             if (!(sd->card_status & CID_CSD_OVERWRITE))
                   1497:                 for (i = 0; i < sizeof(sd->csd); i ++) {
                   1498:                     sd->csd[i] |= sd_csd_rw_mask[i];
                   1499:                     sd->csd[i] &= sd->data[i];
                   1500:                 }
                   1501:             /* Bzzzzzzztt .... Operation complete.  */
                   1502:             sd->state = sd_transfer_state;
                   1503:         }
                   1504:         break;
                   1505: 
                   1506:     case 42:   /* CMD42:  LOCK_UNLOCK */
                   1507:         sd->data[sd->data_offset ++] = value;
                   1508:         if (sd->data_offset >= sd->blk_len) {
                   1509:             /* TODO: Check CRC before committing */
                   1510:             sd->state = sd_programming_state;
                   1511:             sd_lock_command(sd);
                   1512:             /* Bzzzzzzztt .... Operation complete.  */
                   1513:             sd->state = sd_transfer_state;
                   1514:         }
                   1515:         break;
                   1516: 
                   1517:     case 56:   /* CMD56:  GEN_CMD */
                   1518:         sd->data[sd->data_offset ++] = value;
                   1519:         if (sd->data_offset >= sd->blk_len) {
                   1520:             APP_WRITE_BLOCK(sd->data_start, sd->data_offset);
                   1521:             sd->state = sd_transfer_state;
                   1522:         }
                   1523:         break;
                   1524: 
                   1525:     default:
1.1.1.2   root     1526:         fprintf(stderr, "sd_write_data: unknown command\n");
1.1       root     1527:         break;
                   1528:     }
                   1529: }
                   1530: 
                   1531: uint8_t sd_read_data(SDState *sd)
                   1532: {
                   1533:     /* TODO: Append CRCs */
                   1534:     uint8_t ret;
1.1.1.4   root     1535:     int io_len;
1.1       root     1536: 
1.1.1.2   root     1537:     if (!sd->bdrv || !bdrv_is_inserted(sd->bdrv) || !sd->enable)
1.1       root     1538:         return 0x00;
                   1539: 
                   1540:     if (sd->state != sd_sendingdata_state) {
1.1.1.2   root     1541:         fprintf(stderr, "sd_read_data: not in Sending-Data state\n");
1.1       root     1542:         return 0x00;
                   1543:     }
                   1544: 
                   1545:     if (sd->card_status & (ADDRESS_ERROR | WP_VIOLATION))
                   1546:         return 0x00;
                   1547: 
1.1.1.4   root     1548:     io_len = (sd->ocr & (1 << 30)) ? 512 : sd->blk_len;
                   1549: 
1.1       root     1550:     switch (sd->current_cmd) {
                   1551:     case 6:    /* CMD6:   SWITCH_FUNCTION */
                   1552:         ret = sd->data[sd->data_offset ++];
                   1553: 
                   1554:         if (sd->data_offset >= 64)
                   1555:             sd->state = sd_transfer_state;
                   1556:         break;
                   1557: 
                   1558:     case 9:    /* CMD9:   SEND_CSD */
                   1559:     case 10:   /* CMD10:  SEND_CID */
                   1560:         ret = sd->data[sd->data_offset ++];
                   1561: 
                   1562:         if (sd->data_offset >= 16)
                   1563:             sd->state = sd_transfer_state;
                   1564:         break;
                   1565: 
                   1566:     case 11:   /* CMD11:  READ_DAT_UNTIL_STOP */
                   1567:         if (sd->data_offset == 0)
1.1.1.4   root     1568:             BLK_READ_BLOCK(sd->data_start, io_len);
1.1       root     1569:         ret = sd->data[sd->data_offset ++];
                   1570: 
1.1.1.4   root     1571:         if (sd->data_offset >= io_len) {
                   1572:             sd->data_start += io_len;
1.1       root     1573:             sd->data_offset = 0;
1.1.1.4   root     1574:             if (sd->data_start + io_len > sd->size) {
1.1       root     1575:                 sd->card_status |= ADDRESS_ERROR;
                   1576:                 break;
                   1577:             }
                   1578:         }
                   1579:         break;
                   1580: 
                   1581:     case 13:   /* ACMD13: SD_STATUS */
                   1582:         ret = sd->sd_status[sd->data_offset ++];
                   1583: 
                   1584:         if (sd->data_offset >= sizeof(sd->sd_status))
                   1585:             sd->state = sd_transfer_state;
                   1586:         break;
                   1587: 
                   1588:     case 17:   /* CMD17:  READ_SINGLE_BLOCK */
                   1589:         if (sd->data_offset == 0)
1.1.1.4   root     1590:             BLK_READ_BLOCK(sd->data_start, io_len);
1.1       root     1591:         ret = sd->data[sd->data_offset ++];
                   1592: 
1.1.1.4   root     1593:         if (sd->data_offset >= io_len)
1.1       root     1594:             sd->state = sd_transfer_state;
                   1595:         break;
                   1596: 
                   1597:     case 18:   /* CMD18:  READ_MULTIPLE_BLOCK */
                   1598:         if (sd->data_offset == 0)
1.1.1.4   root     1599:             BLK_READ_BLOCK(sd->data_start, io_len);
1.1       root     1600:         ret = sd->data[sd->data_offset ++];
                   1601: 
1.1.1.4   root     1602:         if (sd->data_offset >= io_len) {
                   1603:             sd->data_start += io_len;
1.1       root     1604:             sd->data_offset = 0;
1.1.1.4   root     1605:             if (sd->data_start + io_len > sd->size) {
1.1       root     1606:                 sd->card_status |= ADDRESS_ERROR;
                   1607:                 break;
                   1608:             }
                   1609:         }
                   1610:         break;
                   1611: 
                   1612:     case 22:   /* ACMD22: SEND_NUM_WR_BLOCKS */
                   1613:         ret = sd->data[sd->data_offset ++];
                   1614: 
                   1615:         if (sd->data_offset >= 4)
                   1616:             sd->state = sd_transfer_state;
                   1617:         break;
                   1618: 
                   1619:     case 30:   /* CMD30:  SEND_WRITE_PROT */
                   1620:         ret = sd->data[sd->data_offset ++];
                   1621: 
                   1622:         if (sd->data_offset >= 4)
                   1623:             sd->state = sd_transfer_state;
                   1624:         break;
                   1625: 
                   1626:     case 51:   /* ACMD51: SEND_SCR */
                   1627:         ret = sd->scr[sd->data_offset ++];
                   1628: 
                   1629:         if (sd->data_offset >= sizeof(sd->scr))
                   1630:             sd->state = sd_transfer_state;
                   1631:         break;
                   1632: 
                   1633:     case 56:   /* CMD56:  GEN_CMD */
                   1634:         if (sd->data_offset == 0)
                   1635:             APP_READ_BLOCK(sd->data_start, sd->blk_len);
                   1636:         ret = sd->data[sd->data_offset ++];
                   1637: 
                   1638:         if (sd->data_offset >= sd->blk_len)
                   1639:             sd->state = sd_transfer_state;
                   1640:         break;
                   1641: 
                   1642:     default:
1.1.1.2   root     1643:         fprintf(stderr, "sd_read_data: unknown command\n");
1.1       root     1644:         return 0x00;
                   1645:     }
                   1646: 
                   1647:     return ret;
                   1648: }
                   1649: 
                   1650: int sd_data_ready(SDState *sd)
                   1651: {
                   1652:     return sd->state == sd_sendingdata_state;
                   1653: }
1.1.1.2   root     1654: 
                   1655: void sd_enable(SDState *sd, int enable)
                   1656: {
                   1657:     sd->enable = enable;
                   1658: }

unix.superglobalmegacorp.com

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