Changeset 5d8d71e in mainline for kernel/arch/ia32/src/ia32.c


Ignore:
Timestamp:
2009-03-03T21:17:45Z (15 years ago)
Author:
Jiri Svoboda <jirik.svoboda@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
06f96234
Parents:
c22e964
Message:

Move multiboot parsing to genarch/*/multiboot and adapt it for use with both ia32 and amd64. Multiboot info parsing now supported on amd64, too.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/ia32/src/ia32.c

    rc22e964 r5d8d71e  
    4141#include <arch/pm.h>
    4242
     43#include <genarch/multiboot/multiboot.h>
    4344#include <genarch/drivers/legacy/ia32/io.h>
    4445#include <genarch/drivers/ega/ega.h>
     
    6768#include <sysinfo/sysinfo.h>
    6869#include <arch/boot/boot.h>
    69 #include <string.h>
    70 #include <macros.h>
    7170
    7271#ifdef CONFIG_SMP
     
    7473#endif
    7574
    76 /** Extract command name from the multiboot module command line.
    77  *
    78  * @param buf      Destination buffer (will always null-terminate).
    79  * @param n        Size of destination buffer.
    80  * @param cmd_line Input string (the command line).
    81  *
    82  */
    83 static void extract_command(char *buf, size_t n, const char *cmd_line)
    84 {
    85         const char *start, *end, *cp;
    86         size_t max_len;
    87        
    88         /* Find the first space. */
    89         end = strchr(cmd_line, ' ');
    90         if (end == NULL)
    91                 end = cmd_line + strlen(cmd_line);
    92        
    93         /*
    94          * Find last occurence of '/' before 'end'. If found, place start at
    95          * next character. Otherwise, place start at beginning of buffer.
    96          */
    97         cp = end;
    98         start = buf;
    99         while (cp != start) {
    100                 if (*cp == '/') {
    101                         start = cp + 1;
    102                         break;
    103                 }
    104                 --cp;
    105         }
    106        
    107         /* Copy the command and null-terminate the string. */
    108         max_len = min(n - 1, (size_t) (end - start));
    109         strncpy(buf, start, max_len + 1);
    110         buf[max_len] = '\0';
    111 }
    112 
    113 /** C part of ia32 boot sequence.
     75/** Perform ia32-specific initialization before main_bsp() is called.
    11476 *
    11577 * @param signature Should contain the multiboot signature.
    11678 * @param mi        Pointer to the multiboot information structure.
    11779 */
    118 void arch_pre_main(uint32_t signature, const mb_info_t *mi)
    119 {
    120         uint32_t flags;
    121         mb_mod_t *mods;
    122         uint32_t i;
    123        
    124         if (signature == MULTIBOOT_LOADER_MAGIC)
    125                 flags = mi->flags;
    126         else {
    127                 /* No multiboot info available. */
    128                 flags = 0;
    129         }
    130        
    131         /* Copy module information. */
    132        
    133         if ((flags & MBINFO_FLAGS_MODS) != 0) {
    134                 init.cnt = mi->mods_count;
    135                 mods = mi->mods_addr;
    136                
    137                 for (i = 0; i < init.cnt; i++) {
    138                         init.tasks[i].addr = mods[i].start + 0x80000000;
    139                         init.tasks[i].size = mods[i].end - mods[i].start;
    140                        
    141                         /* Copy command line, if available. */
    142                         if (mods[i].string) {
    143                                 extract_command(init.tasks[i].name,
    144                                     CONFIG_TASK_NAME_BUFLEN,
    145                                     mods[i].string);
    146                         } else
    147                                 init.tasks[i].name[0] = '\0';
    148                 }
    149         } else
    150                 init.cnt = 0;
    151        
    152         /* Copy memory map. */
    153        
    154         int32_t mmap_length;
    155         mb_mmap_t *mme;
    156         uint32_t size;
    157        
    158         if ((flags & MBINFO_FLAGS_MMAP) != 0) {
    159                 mmap_length = mi->mmap_length;
    160                 mme = mi->mmap_addr;
    161                 e820counter = 0;
    162                
    163                 i = 0;
    164                 while (mmap_length > 0) {
    165                         e820table[i++] = mme->mm_info;
    166                        
    167                         /* Compute address of next structure. */
    168                         size = sizeof(mme->size) + mme->size;
    169                         mme = ((void *) mme) + size;
    170                         mmap_length -= size;
    171                 }
    172                
    173                 e820counter = i;
    174         } else
    175                 e820counter = 0;
     80void arch_pre_main(uint32_t signature, const multiboot_info_t *mi)
     81{
     82        /* Parse multiboot information obtained from the bootloader. */
     83        multiboot_info_parse(signature, mi);   
    17684       
    17785#ifdef CONFIG_SMP
Note: See TracChangeset for help on using the changeset viewer.