linux/arch/um/kernel/initrd.c
<<
>>
Prefs
   1/*
   2 * Copyright (C) 2000 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
   3 * Licensed under the GPL
   4 */
   5
   6#include <linux/init.h>
   7#include <linux/bootmem.h>
   8#include <linux/initrd.h>
   9#include <asm/types.h>
  10#include <init.h>
  11#include <os.h>
  12
  13/* Changed by uml_initrd_setup, which is a setup */
  14static char *initrd __initdata = NULL;
  15static int load_initrd(char *filename, void *buf, int size);
  16
  17static int __init read_initrd(void)
  18{
  19        void *area;
  20        long long size;
  21        int err;
  22
  23        if (initrd == NULL)
  24                return 0;
  25
  26        err = os_file_size(initrd, &size);
  27        if (err)
  28                return 0;
  29
  30        /*
  31         * This is necessary because alloc_bootmem craps out if you
  32         * ask for no memory.
  33         */
  34        if (size == 0) {
  35                printk(KERN_ERR "\"%s\" is a zero-size initrd\n", initrd);
  36                return 0;
  37        }
  38
  39        area = alloc_bootmem(size);
  40        if (area == NULL)
  41                return 0;
  42
  43        if (load_initrd(initrd, area, size) == -1)
  44                return 0;
  45
  46        initrd_start = (unsigned long) area;
  47        initrd_end = initrd_start + size;
  48        return 0;
  49}
  50
  51__uml_postsetup(read_initrd);
  52
  53static int __init uml_initrd_setup(char *line, int *add)
  54{
  55        initrd = line;
  56        return 0;
  57}
  58
  59__uml_setup("initrd=", uml_initrd_setup,
  60"initrd=<initrd image>\n"
  61"    This is used to boot UML from an initrd image.  The argument is the\n"
  62"    name of the file containing the image.\n\n"
  63);
  64
  65static int load_initrd(char *filename, void *buf, int size)
  66{
  67        int fd, n;
  68
  69        fd = os_open_file(filename, of_read(OPENFLAGS()), 0);
  70        if (fd < 0) {
  71                printk(KERN_ERR "Opening '%s' failed - err = %d\n", filename,
  72                       -fd);
  73                return -1;
  74        }
  75        n = os_read_file(fd, buf, size);
  76        if (n != size) {
  77                printk(KERN_ERR "Read of %d bytes from '%s' failed, "
  78                       "err = %d\n", size,
  79                       filename, -n);
  80                return -1;
  81        }
  82
  83        os_close_file(fd);
  84        return 0;
  85}
  86