Annotation of Net2/arch/amiga/stand/loadbsd/loadbsd.c, revision 1.1

1.1     ! root        1: #include <sys/types.h>
        !             2: #include <a.out.h>
        !             3: #include <stdio.h>
        !             4: 
        !             5: #include <exec/types.h>
        !             6: #include <exec/execbase.h>
        !             7: #include <exec/memory.h>
        !             8: #include <libraries/configregs.h>
        !             9: #include <libraries/expansionbase.h>
        !            10: 
        !            11: #include <inline/exec.h>
        !            12: #include <inline/expansion.h>
        !            13: 
        !            14: struct ExpansionBase *ExpansionBase;
        !            15: 
        !            16: #undef __LDPGSZ
        !            17: #define __LDPGSZ 8192
        !            18: 
        !            19: void get_mem_config (void **fastmem_start, u_long *fastmem_size, u_long *chipmem_size);
        !            20: 
        !            21: int 
        !            22: main (int argc, char *argv[])
        !            23: {
        !            24:   struct exec e;
        !            25:   int fd;
        !            26: 
        !            27:   if (argc >= 2)
        !            28:     {
        !            29:       if ((fd = open (argv[1], 0)) >= 0)
        !            30:         {
        !            31:           if (read (fd, &e, sizeof (e)) == sizeof (e))
        !            32:             {
        !            33:               if (e.a_magic == NMAGIC)
        !            34:                 {
        !            35:                   u_char *kernel;
        !            36:                  int text_size;
        !            37:                  struct ConfigDev *cd;
        !            38:                  int num_cd;
        !            39:                  
        !            40:                  ExpansionBase= (struct ExpansionBase *) OpenLibrary ("expansion.library", 0);
        !            41:                  if (! ExpansionBase)  /* not supposed to fail... */
        !            42:                    abort();
        !            43:                  for (cd = 0, num_cd = 0; cd = FindConfigDev (cd, -1, -1); num_cd++) ;
        !            44: 
        !            45:                  text_size = (e.a_text + __LDPGSZ - 1) & (-__LDPGSZ);
        !            46:                  kernel = (u_char *) malloc (text_size + e.a_data + e.a_bss 
        !            47:                                              + num_cd*sizeof(*cd) + 4);
        !            48: 
        !            49:                   if (kernel)
        !            50:                     {
        !            51:                      if (read (fd, kernel, e.a_text) == e.a_text 
        !            52:                          && read (fd, kernel + text_size, e.a_data) == e.a_data)
        !            53:                        {
        !            54:                          int *knum_cd;
        !            55:                          struct ConfigDev *kcd;
        !            56:                          void *fastmem_start;
        !            57:                          u_long fastmem_size, chipmem_size;
        !            58:                          
        !            59:                          get_mem_config (&fastmem_start, &fastmem_size, &chipmem_size);
        !            60:                          
        !            61:                          if (argc == 3 && !strcmp (argv[2], "-k"))
        !            62:                            {
        !            63:                              fastmem_start += 4*1024*1024;
        !            64:                              fastmem_size  -= 4*1024*1024;
        !            65:                            }
        !            66:                          
        !            67:                          printf ("Using %dM FASTMEM at 0x%x, %dM CHIPMEM\n",
        !            68:                                  fastmem_size>>20, fastmem_start, chipmem_size>>20);
        !            69:                          /* give them a chance to read the information... */
        !            70:                          sleep(2);
        !            71: 
        !            72:                          bzero (kernel + text_size + e.a_data, e.a_bss);
        !            73:                          knum_cd = (int *) (kernel + text_size + e.a_data + e.a_bss);
        !            74:                          *knum_cd = num_cd;
        !            75:                          if (num_cd)
        !            76:                            for (kcd = (struct ConfigDev *) (knum_cd+1);
        !            77:                                 cd = FindConfigDev (cd, -1, -1);
        !            78:                                 *kcd++ = *cd) ;
        !            79:                          startit (kernel, 
        !            80:                                   text_size + e.a_data + e.a_bss + num_cd*sizeof(*cd) + 4,
        !            81:                                   e.a_entry, fastmem_start,
        !            82:                                   fastmem_size, chipmem_size);
        !            83:                        }
        !            84:                      else
        !            85:                        fprintf (stderr, "Executable corrupt!\n");
        !            86:                     }
        !            87:                   else
        !            88:                    fprintf (stderr, "Out of memory! (%d)\n", text_size + e.a_data + e.a_bss 
        !            89:                                   + num_cd*sizeof(*cd) + 4);
        !            90:                 }
        !            91:              else
        !            92:                fprintf (stderr, "Unsupported executable: %o\n", e.a_magic);
        !            93:             }
        !            94:           else
        !            95:            fprintf (stderr, "Can't read header of %s\n", argv[1]);
        !            96: 
        !            97:          close (fd);
        !            98:         }
        !            99:       else
        !           100:        perror ("open");
        !           101:     }
        !           102:   else
        !           103:     fprintf (stderr, "%0 some-vmunix\n", argv[0]);
        !           104: }
        !           105: 
        !           106: 
        !           107: void
        !           108: get_mem_config (void **fastmem_start, u_long *fastmem_size, u_long *chipmem_size)
        !           109: {
        !           110:   extern struct ExecBase *SysBase;  
        !           111:   struct MemHeader *mh, *nmh;
        !           112:   
        !           113:   *fastmem_size = 0;
        !           114:   *chipmem_size = 0;
        !           115:   
        !           116:   /* walk thru the exec memory list */
        !           117:   Forbid ();
        !           118:   for (mh  = (struct MemHeader *) SysBase->MemList.lh_Head;
        !           119:        nmh = (struct MemHeader *) mh->mh_Node.ln_Succ;
        !           120:        mh  = nmh)
        !           121:     {
        !           122:       if (mh->mh_Attributes & MEMF_CHIP)
        !           123:         {
        !           124:          /* there should hardly be more than one entry for chip mem, but
        !           125:             handle it the same nevertheless */
        !           126:          if ((u_int)mh->mh_Upper - (u_int)mh->mh_Lower > *chipmem_size)
        !           127:            {
        !           128:              *chipmem_size = (u_int)mh->mh_Upper - (u_int)mh->mh_Lower;
        !           129:              /* round to multiple of 512K */
        !           130:              *chipmem_size = (*chipmem_size + 512*1024 - 1) & -(512*1024);
        !           131:              
        !           132:              /* chipmem always starts at 0, so don't remember start
        !           133:                 address */
        !           134:            }
        !           135:         }
        !           136:       else
        !           137:        {
        !           138:          if ((u_int)mh->mh_Upper - (u_int)mh->mh_Lower > *fastmem_size)
        !           139:            {
        !           140:              u_int start = (u_int) mh->mh_Lower;
        !           141:              u_int end = (u_int) mh->mh_Upper;
        !           142:              
        !           143:              /* some heuristics.. */
        !           144:              start &= -__LDPGSZ;
        !           145:              /* get the mem back stolen by incore kickstart on A3000 with
        !           146:                 V36 bootrom. */
        !           147:              if (end == 0x07f80000)
        !           148:                end = 0x08000000;
        !           149: 
        !           150:              *fastmem_size = end - start;
        !           151:              *fastmem_start = (void *)start;
        !           152:            }
        !           153:        }
        !           154:     }
        !           155:   Permit();
        !           156: }
        !           157: 
        !           158: 
        !           159: 
        !           160: 
        !           161: asm ("
        !           162:        .set    ABSEXECBASE,4
        !           163: 
        !           164:        .text
        !           165:        .globl  _startit
        !           166: 
        !           167: _startit:
        !           168:        movel   sp,a3
        !           169:        movel   4:w,a6
        !           170:        lea     pc@(start_super-.+2),a5
        !           171:        jmp     a6@(-0x1e)              | supervisor-call
        !           172: 
        !           173: start_super:
        !           174:        movew   #0x2700,sr
        !           175: 
        !           176:        | the BSD kernel wants values into the following registers:
        !           177:        | a0:  fastmem-start
        !           178:        | d0:  fastmem-size
        !           179:        | d1:  chipmem-size
        !           180: 
        !           181:        movel   a3@(4),a1               | loaded kernel
        !           182:        movel   a3@(8),d2               | length of loaded kernel
        !           183:        movel   a3@(12),a2              | entry point
        !           184:        movel   a3@(16),a0              | fastmem-start
        !           185:        movel   a3@(20),d0              | fastmem-size
        !           186:        movel   a3@(24),d1              | chipmem-size
        !           187:        subl    a4,a4                   | target, load to 0
        !           188: 
        !           189:        lea     pc@(zero-.+2),a3
        !           190:        pmove   a3@,tc                  | Turn off MMU
        !           191:        lea     pc@(nullrp-.+2),a3
        !           192:        pmove   a3@,crp                 | Turn off MMU some more
        !           193:        pmove   a3@,srp                 | Really, really, turn off MMU
        !           194: 
        !           195: | Turn off 68030 TT registers
        !           196: 
        !           197:        btst    #2,(ABSEXECBASE)@(0x129) | AFB_68030,SysBase->AttnFlags
        !           198:        beq     nott                    | Skip TT registers if not 68030
        !           199:        lea     pc@(zero-.+2),a3
        !           200:        .word 0xf013,0x0800             | pmove a3@,tt0 (gas only knows about 68851 ops..)
        !           201:        .word 0xf013,0x0c00             | pmove a3@,tt1 (gas only knows about 68851 ops..)
        !           202: 
        !           203: nott:
        !           204: 
        !           205:        movew   #(1<<9),0xdff096        | disable DMA
        !           206: 
        !           207: L0:
        !           208:        moveb   a1@+,a4@+
        !           209:        subl    #1,d2
        !           210:        bcc     L0
        !           211: 
        !           212: 
        !           213:        jmp     a2@
        !           214: 
        !           215: 
        !           216: | A do-nothing MMU root pointer (includes the following long as well)
        !           217: 
        !           218: nullrp:        .long   0x7fff0001
        !           219: zero:  .long   0
        !           220: 
        !           221: 
        !           222: ");
        !           223: 

unix.superglobalmegacorp.com

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