2005-05-21 00:59:10 +04:00
/*
2008-02-05 09:31:08 +03:00
* Copyright ( C ) 2000 - 2007 Jeff Dike ( jdike @ { addtoit , linux . intel } . com )
2005-05-21 00:59:10 +04:00
* Licensed under the GPL
*/
2012-10-08 06:27:32 +04:00
# include <linux/init.h>
# include <linux/bootmem.h>
# include <linux/initrd.h>
# include <asm/types.h>
# include <init.h>
# include <os.h>
2005-05-21 00:59:10 +04:00
/* Changed by uml_initrd_setup, which is a setup */
static char * initrd __initdata = NULL ;
2011-08-18 23:06:59 +04:00
static int load_initrd ( char * filename , void * buf , int size ) ;
2005-05-21 00:59:10 +04:00
static int __init read_initrd ( void )
{
void * area ;
long long size ;
int err ;
2008-02-05 09:31:08 +03:00
if ( initrd = = NULL )
2007-05-07 01:51:41 +04:00
return 0 ;
2005-05-21 00:59:10 +04:00
err = os_file_size ( initrd , & size ) ;
2008-02-05 09:31:08 +03:00
if ( err )
2007-05-07 01:51:41 +04:00
return 0 ;
2008-02-05 09:31:08 +03:00
/*
* This is necessary because alloc_bootmem craps out if you
* ask for no memory .
*/
if ( size = = 0 ) {
2008-02-24 02:23:23 +03:00
printk ( KERN_ERR " \" %s \" is a zero-size initrd \n " , initrd ) ;
2008-02-05 09:31:08 +03:00
return 0 ;
}
2005-05-21 00:59:10 +04:00
area = alloc_bootmem ( size ) ;
2008-02-05 09:31:08 +03:00
if ( area = = NULL )
2007-05-07 01:51:41 +04:00
return 0 ;
2008-02-05 09:31:08 +03:00
if ( load_initrd ( initrd , area , size ) = = - 1 )
2007-05-07 01:51:41 +04:00
return 0 ;
2005-05-21 00:59:10 +04:00
initrd_start = ( unsigned long ) area ;
initrd_end = initrd_start + size ;
return 0 ;
}
__uml_postsetup ( read_initrd ) ;
static int __init uml_initrd_setup ( char * line , int * add )
{
initrd = line ;
return 0 ;
}
__uml_setup ( " initrd= " , uml_initrd_setup ,
" initrd=<initrd image> \n "
" This is used to boot UML from an initrd image. The argument is the \n "
" name of the file containing the image. \n \n "
) ;
2011-08-18 23:06:59 +04:00
static int load_initrd ( char * filename , void * buf , int size )
2005-05-21 00:59:10 +04:00
{
int fd , n ;
fd = os_open_file ( filename , of_read ( OPENFLAGS ( ) ) , 0 ) ;
2008-02-05 09:31:08 +03:00
if ( fd < 0 ) {
printk ( KERN_ERR " Opening '%s' failed - err = %d \n " , filename ,
- fd ) ;
2007-05-07 01:51:41 +04:00
return - 1 ;
2005-05-21 00:59:10 +04:00
}
2007-05-07 01:51:43 +04:00
n = os_read_file ( fd , buf , size ) ;
2008-02-05 09:31:08 +03:00
if ( n ! = size ) {
printk ( KERN_ERR " Read of %d bytes from '%s' failed, "
" err = %d \n " , size ,
2005-05-21 00:59:10 +04:00
filename , - n ) ;
2007-05-07 01:51:41 +04:00
return - 1 ;
2005-05-21 00:59:10 +04:00
}
os_close_file ( fd ) ;
2007-05-07 01:51:41 +04:00
return 0 ;
2005-05-21 00:59:10 +04:00
}