The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/powerpc/ofw/ofw_initrd.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*-
    2  * Copyright (C) 2018 Breno Leitao
    3  *
    4  * Redistribution and use in source and binary forms, with or without
    5  * modification, are permitted provided that the following conditions
    6  * are met:
    7  * 1. Redistributions of source code must retain the above copyright
    8  *    notice, this list of conditions and the following disclaimer.
    9  * 2. Redistributions in binary form must reproduce the above copyright
   10  *    notice, this list of conditions and the following disclaimer in the
   11  *    documentation and/or other materials provided with the distribution.
   12  *
   13  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
   14  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   15  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
   16  * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   17  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
   18  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
   19  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
   20  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
   21  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
   22  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   23  */
   24 
   25 #include <sys/cdefs.h>
   26 __FBSDID("$FreeBSD$");
   27 
   28 #include <sys/param.h>
   29 #include <sys/kernel.h>
   30 #include <sys/systm.h>
   31 #include <sys/module.h>
   32 #include <sys/types.h>
   33 #include <sys/proc.h>
   34 
   35 #include <vm/vm.h>
   36 #include <vm/pmap.h>
   37 
   38 #include <machine/bus.h>
   39 #include <machine/elf.h>
   40 #include <machine/param.h>
   41 
   42 #include <dev/ofw/openfirm.h>
   43 #include <dev/ofw/ofw_bus.h>
   44 #include <dev/ofw/ofw_bus_subr.h>
   45 
   46 #include "opt_md.h"
   47 
   48 extern u_char *mfs_root;
   49 extern int mfs_root_size;
   50 
   51 static void ofw_initrd_probe_and_attach(void *junk);
   52 
   53 SYSINIT(ofw_initrd_probe_and_attach, SI_SUB_KMEM, SI_ORDER_ANY,
   54     ofw_initrd_probe_and_attach, NULL);
   55 
   56 static void
   57 ofw_initrd_probe_and_attach(void *junk)
   58 {
   59         phandle_t chosen;
   60         vm_paddr_t start, end;
   61         pcell_t cell[2];
   62         ssize_t size;
   63         u_char *taste;
   64         Elf_Ehdr ehdr;
   65 
   66         if (!hw_direct_map)
   67                 return;
   68 
   69         chosen = OF_finddevice("/chosen");
   70         if (chosen <= 0)
   71                 return;
   72 
   73         if (!OF_hasprop(chosen, "linux,initrd-start") ||
   74             !OF_hasprop(chosen, "linux,initrd-end"))
   75                 return;
   76 
   77         size = OF_getencprop(chosen, "linux,initrd-start", cell, sizeof(cell));
   78         if (size == 4)
   79                 start = cell[0];
   80         else if (size == 8)
   81                 start = (uint64_t)cell[0] << 32 | cell[1];
   82         else {
   83                 printf("ofw_initrd: Wrong linux,initrd-start size\n");
   84                 return;
   85         }
   86 
   87         size = OF_getencprop(chosen, "linux,initrd-end", cell, sizeof(cell));
   88         if (size == 4)
   89                 end = cell[0];
   90         else if (size == 8)
   91                 end = (uint64_t)cell[0] << 32 | cell[1];
   92         else{
   93                 printf("ofw_initrd: Wrong linux,initrd-end size\n");
   94                 return;
   95         }
   96 
   97         if (end - start > 0) {
   98                 taste = (u_char*) PHYS_TO_DMAP(start);
   99                 memcpy(&ehdr, taste, sizeof(ehdr));
  100 
  101                 if (IS_ELF(ehdr)) {
  102                         printf("ofw_initrd: initrd is kernel image!\n");
  103                         return;
  104                 }
  105 
  106                 mfs_root = taste;
  107                 mfs_root_size = end - start;
  108                 printf("ofw_initrd: initrd loaded at 0x%08lx-0x%08lx\n",
  109                         start, end);
  110         }
  111 }

Cache object: ef739f75f9ef3505645cdc98e7d80184


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.