/[grub]/grub2/loader/powerpc/ieee1275/linux.c
ViewVC logotype

Diff of /grub2/loader/powerpc/ieee1275/linux.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.4 by hollisb, Fri Oct 29 02:45:14 2004 UTC revision 1.5 by marco_g, Mon Jan 31 21:44:35 2005 UTC
# Line 50  grub_linux_boot (void) Line 50  grub_linux_boot (void)
50    grub_ieee1275_phandle_t chosen;    grub_ieee1275_phandle_t chosen;
51    grub_size_t actual;    grub_size_t actual;
52        
   struct bi_rec  
   {  
     unsigned long tag;  
     unsigned long size;  
     unsigned long data[0];  
   };  
     
53    grub_ieee1275_finddevice ("/chosen", &chosen);    grub_ieee1275_finddevice ("/chosen", &chosen);
54        
55    /* Set the command line arguments.  */    /* Set the command line arguments.  */
# Line 79  grub_linux_release_mem (void) Line 72  grub_linux_release_mem (void)
72    if (linux_addr && grub_ieee1275_release (linux_addr, linux_size))    if (linux_addr && grub_ieee1275_release (linux_addr, linux_size))
73      return grub_error (GRUB_ERR_OUT_OF_MEMORY, "Can not release memory");      return grub_error (GRUB_ERR_OUT_OF_MEMORY, "Can not release memory");
74        
75      if (initrd_addr && grub_ieee1275_release (initrd_addr, initrd_size))
76        return grub_error (GRUB_ERR_OUT_OF_MEMORY, "Can not release memory");
77      
78    linux_addr = 0;    linux_addr = 0;
79      initrd_addr = 0;
80      
81    return GRUB_ERR_NONE;    return GRUB_ERR_NONE;
82  }  }
83    
# Line 97  grub_linux_unload (void) Line 95  grub_linux_unload (void)
95  }  }
96    
97  void  void
98  grub_load_linux (int argc, char *argv[])  grub_rescue_cmd_linux (int argc, char *argv[])
99  {  {
100    grub_file_t file = 0;    grub_file_t file = 0;
101    Elf32_Ehdr ehdr;    Elf32_Ehdr ehdr;
102    Elf32_Phdr *phdrs = 0;    Elf32_Phdr *phdrs = 0;
103    int i;      int i;  
104    int offset = 0;    int offset = 0;
105    static grub_addr_t entry;    grub_addr_t entry;
106      int found_addr = 0;
107    int size;    int size;
108        
109    grub_dl_ref (my_mod);    grub_dl_ref (my_mod);
# Line 188  grub_load_linux (int argc, char *argv[]) Line 187  grub_load_linux (int argc, char *argv[])
187    /* Reserve memory for the kernel.  */    /* Reserve memory for the kernel.  */
188    linux_size += 0x100000;    linux_size += 0x100000;
189        
190    if (grub_claimmap (entry, linux_size) == -1)    /* For some vmlinux kernels the address set above won't work.  Just
191         try some other addresses just like yaboot does.  */
192      for (linux_addr = entry; linux_addr < entry + 200 * 0x100000; linux_addr += 0x100000)
193        {
194          found_addr = grub_claimmap (linux_addr, linux_size);
195          if (found_addr != -1)
196            break;
197        }
198    
199      if (found_addr == -1)
200      {      {
201        grub_error (GRUB_ERR_OUT_OF_MEMORY, "Can not claim memory");        grub_error (GRUB_ERR_OUT_OF_MEMORY, "Can not claim memory");
202        goto fail;        goto fail;
203      }      }
204    linux_addr = entry;    entry = linux_addr;
205      
206    /* Load every loadable segment in memory.  */    /* Load every loadable segment in memory.  */
207    for (i = 0; i < ehdr.e_phnum; i++)    for (i = 0; i < ehdr.e_phnum; i++)
208      {      {
# Line 257  grub_load_linux (int argc, char *argv[]) Line 265  grub_load_linux (int argc, char *argv[])
265    return;    return;
266  }  }
267    
268    void
269  GRUB_MOD_INIT  grub_rescue_cmd_initrd (int argc, char *argv[])
270  {  {
271    grub_rescue_register_command ("linux", grub_load_linux,    grub_file_t file = 0;
272                                  "load a linux kernel");    grub_ssize_t size;
273    my_mod = mod;    grub_addr_t addr;
274  }    
275      if (argc == 0)
276        {
277          grub_error (GRUB_ERR_BAD_ARGUMENT, "no initrd specified");
278          goto fail;
279        }
280      
281      if (!loaded)
282        {
283          grub_error (GRUB_ERR_BAD_ARGUMENT, "You need to load the kernel first.");
284          goto fail;
285        }
286    
287  GRUB_MOD_FINI    file = grub_file_open (argv[0]);
288  {    if (! file)
289    grub_rescue_unregister_command ("linux");      goto fail;
290      
291      addr = linux_addr + linux_size;
292      size = grub_file_size (file);
293      
294      if (grub_claimmap (addr, size) == -1)
295        {
296          grub_error (GRUB_ERR_OUT_OF_MEMORY, "Can not claim memory");
297          goto fail;
298        }
299      
300      if (grub_file_read (file, (void *) addr, size) != size)
301        {
302          grub_ieee1275_release (addr, size);
303          grub_error (GRUB_ERR_FILE_READ_ERROR, "Couldn't read file");
304          goto fail;
305        }
306      
307      initrd_addr = addr;
308      initrd_size = size;
309      
310     fail:
311      if (file)
312        grub_file_close (file);
313  }  }
314    
315  void  
316  grub_linux_init (void)  
317    GRUB_MOD_INIT
318  {  {
319    grub_rescue_register_command ("linux", grub_load_linux,    grub_rescue_register_command ("linux", grub_rescue_cmd_linux,
320                                  "load a linux kernel");                                  "load a linux kernel");
321      grub_rescue_register_command ("initrd", grub_rescue_cmd_initrd,
322                                    "load an initrd");
323      my_mod = mod;
324  }  }
325    
326  void  GRUB_MOD_FINI
 grub_linux_fini (void)  
327  {  {
328    grub_rescue_unregister_command ("linux");    grub_rescue_unregister_command ("linux");
329      grub_rescue_unregister_command ("initrd");
330  }  }

Legend:
Removed from v.1.4  
changed lines
  Added in v.1.5

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26