bootinfo.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:2k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * BK Id: SCCS/s.bootinfo.c 1.5 05/17/01 18:14:20 cort
  3.  */
  4. /*
  5.  *  linux/arch/ppc/amiga/bootinfo.c
  6.  *
  7.  *  Extracted from arch/m68k/kernel/setup.c.
  8.  *  Should be properly generalized and put somewhere else.
  9.  *                              Jesper
  10.  */
  11. #include <linux/types.h>
  12. #include <linux/kernel.h>
  13. #include <linux/string.h>
  14. #include <linux/init.h>
  15. #include <asm/setup.h>
  16. #include <asm/bootinfo.h>
  17. extern char cmd_line[CL_SIZE];
  18. extern int num_memory;
  19. extern int m68k_realnum_memory;
  20. extern struct mem_info memory[NUM_MEMINFO];
  21. extern struct mem_info m68k_memory[NUM_MEMINFO];
  22. extern struct mem_info ramdisk;
  23. extern int amiga_parse_bootinfo(const struct bi_record *);
  24. extern int atari_parse_bootinfo(const struct bi_record *);
  25. extern int mac_parse_bootinfo(const struct bi_record *);
  26. void __init parse_bootinfo(const struct bi_record *record)
  27. {
  28.     while (record->tag != BI_LAST) {
  29. int unknown = 0;
  30. const u_long *data = record->data;
  31. switch (record->tag) {
  32.     case BI_MACHTYPE:
  33.     case BI_CPUTYPE:
  34.     case BI_FPUTYPE:
  35.     case BI_MMUTYPE:
  36. /* Already set up by head.S */
  37. break;
  38.     case BI_MEMCHUNK:
  39. if (num_memory < NUM_MEMINFO) {
  40.     memory[num_memory].addr = data[0];
  41.     memory[num_memory].size = data[1];
  42.     num_memory++;
  43.     /* FIXME: duplicate for m68k drivers. */
  44.     m68k_memory[m68k_realnum_memory].addr = data[0];
  45.     m68k_memory[m68k_realnum_memory].size = data[1];
  46.     m68k_realnum_memory++;
  47. } else
  48.     printk("parse_bootinfo: too many memory chunksn");
  49. break;
  50.     case BI_RAMDISK:
  51. ramdisk.addr = data[0];
  52. ramdisk.size = data[1];
  53. break;
  54.     case BI_COMMAND_LINE:
  55. strncpy(cmd_line, (const char *)data, CL_SIZE);
  56. cmd_line[CL_SIZE-1] = '';
  57. break;
  58.     default:
  59. if (MACH_IS_AMIGA)
  60.     unknown = amiga_parse_bootinfo(record);
  61. else if (MACH_IS_ATARI)
  62.     unknown = atari_parse_bootinfo(record);
  63. else if (MACH_IS_MAC)
  64.     unknown = mac_parse_bootinfo(record);
  65. else
  66.     unknown = 1;
  67. }
  68. if (unknown)
  69.     printk("parse_bootinfo: unknown tag 0x%04x ignoredn",
  70.    record->tag);
  71. record = (struct bi_record *)((u_long)record+record->size);
  72.     }
  73. }