URI:
       tboot.c - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       tboot.c (5625B)
       ---
            1 #include <u.h>
            2 #include <libc.h>
            3 #include <bio.h>
            4 #include <libsec.h>
            5 
            6 #include "iso9660.h"
            7 
            8 /* FreeBSD 4.5 installation CD for reference
            9 g% cdsector 17 | xd -b
           10 1+0 records in
           11 1+0 records out
           12 0000000  00         - volume descriptor type (0)
           13          43 44 30 30 31     - "CD001"
           14          01     - volume descriptor version (1)
           15          45 4c 20 54 4f 52 49 54 4f
           16 0000010  20 53 50 45 43 49 46 49 43 41 54 49 4f 4e 00 00
           17 0000020  00 00 00 00 00 00 00 - 7-39 boot system identifier
           18 "EL TORITO SPECIFICATION"
           19 
           20                               00 00 00 00 00 00 00 00 00
           21 0000030  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
           22 0000040  00 00 00 00 00 00 00 - 39-71 boot identifier
           23 
           24 boot system use:
           25 
           26 absolute pointer to the boot catalog??
           27 
           28                               4d 0c 00 00 00 00 00 00 00
           29 0000050  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
           30 0000580  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
           31 0000590  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
           32 00005a0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
           33 g% cdsector 3149 | xd -b        # 0x0c4d
           34 1+0 records in
           35 1+0 records out
           36 0000000  01         - header (1)
           37             00  - platform id (0 = 0x86)
           38                00 00 - reserved 0
           39                      00 00 00 00 00 00 00 00 00 00 00 00
           40 0000010  00 00 00 00 00 00 00 00 00 00 00 00 - id string
           41                                              aa 55 - checksum
           42                                                     55 aa - magic
           43 
           44 0000020  88    - 88 = bootable
           45             03   - 3 = 2.88MB diskette
           46                00 00 - load segment 0 means default 0x7C0
           47                      00  - system type (byte 5 of boot image)
           48                         00 - unused (0)
           49                            01 00 - 512-byte sector count for initial load
           50                                  4e 0c 00 00 - ptr to virtual disk
           51                                              00 00 00 00
           52 0000030  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
           53 0000040  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
           54 0000050  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
           55 0000060  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
           56 g% cdsector `{h2d 0c4e} | xd -b
           57 1+0 records in
           58 1+0 records out
           59 0000000  eb 3c 00 00 00 00 00 00 00 00 00 00 02 00 00 00
           60 0000010  00 00 00 00 00 00 00 00 12 00 02 00 00 00 00 00
           61 0000020  00 00 00 00 00 16 1f 66 6a 00 51 50 06 53
           62                                           31 c0
           63 
           64 FREEBSD
           65 0000000  eb 3c 00 00 00 00 00 00 00 00 00 00 02 00 00 00
           66 0000010  00 00 00 00 00 00 00 00 12 00 02 00 00 00 00 00
           67 0000020  00 00 00 00 00 16 1f 66 6a 00 51 50 06 53
           68                                           31 c0
           69 
           70 DOS 5
           71 0000000  eb 3c 90 4d 53 44 4f 53 35 2e 30 00 02 01 01 00
           72 0000010  02 e0 00 40 0b f0 09 00 12 00 02 00 00 00 00 00
           73 0000020  00 00 00 00 00 00 29 6a 2c e0 16 4e 4f 20 4e 41
           74 0000030  4d 45 20 20 20 20 46 41 54 31 32 20 20 20 fa 33
           75 0000040  c0 8e d0 bc 00 7c 16 07 bb 78 00 36 c5 37 1e 56
           76 0000050  16 53 bf 3e 7c b9 0b 00 fc f3 a4 06 1f c6 45 fe
           77 0000060  0f 8b 0e 18 7c 88 4d f9 89 47 02 c7 07 3e 7c fb
           78 0000070  cd 13 72 79 33 c0 39 06 13 7c 74 08 8b 0e 13 7c
           79 0000080  89 0e 20 7c a0 10 7c f7 26 16 7c 03 06 1c 7c 13
           80 0000090  16 1e 7c 03 06 0e 7c 83 d2 00 a3 50 7c 89 16 52
           81 00000a0  7c a3 49 7c 89 16 4b 7c b8 20 00 f7 26 11 7c 8b
           82 
           83 NDISK
           84 0000000  eb 3c 90 50 6c 61 6e 39 2e 30 30 00 02 01 01 00
           85 0000010  02 e0 00 40 0b f0 09 00 12 00 02 00 00 00 00 00
           86 0000020  40 0b 00 00 00 00 29 13 00 00 00 43 59 4c 49 4e
           87 0000030  44 52 49 43 41 4c 46 41 54 31 32 20 20 20 fa 31
           88 0000040  c0 8e d0 8e d8 8e c0 bc ec 7b 89 e5 88 56 12 fb
           89 0000050  be ea 7d bf 90 7d ff d7 bf 82 7d ff d7 8b 06 27
           90 0000060  7c 8b 16 29 7c bb 00 7e bf 2c 7d ff d7 bb 10 00
           91 
           92 PBSDISK
           93 0000000  eb 3c 90 50 6c 61 6e 39 2e 30 30 00 02 01 01 00
           94 0000010  02 e0 00 40 0b f0 09 00 12 00 02 00 00 00 00 00
           95 0000020  40 0b 00 00 00 00 29 13 00 00 00 43 59 4c 49 4e
           96 0000030  44 52 49 43 41 4c 46 41 54 31 32 20 20 20 fa 31
           97 0000040  c0 8e d0 8e d8 8e c0 bc f8 7b 89 e5 88 56 00 fb
           98 0000050  be f8 7d bf 00 7d ff d7 bf df 7c ff d7 8b 06 27
           99 0000060  7c 8b 16 29 7c bb 00 7e bf 89 7c ff d7 bf fb 7c
          100 */
          101 
          102 void
          103 Cputbootvol(Cdimg *cd)
          104 {
          105         Cputc(cd, 0x00);
          106         Cputs(cd, "CD001", 5);
          107         Cputc(cd, 0x01);
          108         Cputs(cd, "EL TORITO SPECIFICATION", 2+1+6+1+13);
          109         Crepeat(cd, 0, 2+16+16+7);
          110         cd->bootcatptr = Cwoffset(cd);
          111         Cpadblock(cd);
          112 }
          113 
          114 void
          115 Cupdatebootvol(Cdimg *cd)
          116 {
          117         ulong o;
          118 
          119         o = Cwoffset(cd);
          120         Cwseek(cd, cd->bootcatptr);
          121         Cputnl(cd, cd->bootcatblock, 4);
          122         Cwseek(cd, o);
          123 }
          124 
          125 void
          126 Cputbootcat(Cdimg *cd)
          127 {
          128         cd->bootcatblock = Cwoffset(cd) / Blocksize;
          129         Cputc(cd, 0x01);
          130         Cputc(cd, 0x00);
          131         Cputc(cd, 0x00);
          132         Cputc(cd, 0x00);
          133         Crepeat(cd, 0, 12+12);
          134 
          135         /*
          136          * either the checksum doesn't include the header word
          137          * or it just doesn't matter.
          138          */
          139         Cputc(cd, 0xAA);
          140         Cputc(cd, 0x55);
          141         Cputc(cd, 0x55);
          142         Cputc(cd, 0xAA);
          143 
          144         cd->bootimageptr = Cwoffset(cd);
          145         Cpadblock(cd);
          146 }
          147 
          148 void
          149 Cupdatebootcat(Cdimg *cd)
          150 {
          151         ulong o;
          152 
          153         if(cd->bootdirec == nil)
          154                 return;
          155 
          156         o = Cwoffset(cd);
          157         Cwseek(cd, cd->bootimageptr);
          158         Cputc(cd, 0x88);
          159         switch(cd->bootdirec->length){
          160         default:
          161                 fprint(2, "warning: boot image is not 1.44MB or 2.88MB; pretending 1.44MB\n");
          162         case 1440*1024:
          163                 Cputc(cd, 0x02);        /* 1.44MB disk */
          164                 break;
          165         case 2880*1024:
          166                 Cputc(cd, 0x03);        /* 2.88MB disk */
          167                 break;
          168         }
          169         Cputnl(cd, 0, 2);        /* load segment */
          170         Cputc(cd, 0);        /* system type */
          171         Cputc(cd, 0);        /* unused */
          172         Cputnl(cd, 1, 2);        /* 512-byte sector count for load */
          173         Cputnl(cd, cd->bootdirec->block, 4);        /* ptr to disk image */
          174         Cwseek(cd, o);
          175 }
          176 
          177 void
          178 findbootimage(Cdimg *cd, Direc *root)
          179 {
          180         Direc *d;
          181 
          182         d = walkdirec(root, cd->bootimage);
          183         if(d == nil){
          184                 fprint(2, "warning: did not encounter boot image\n");
          185                 return;
          186         }
          187 
          188         cd->bootdirec = d;
          189 }