Changeset deca67b in mainline for kernel/arch/ia32/src/ia32.c


Ignore:
Timestamp:
2009-03-03T12:56:20Z (16 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
add04f7
Parents:
2f57690
Message:

rename ia32_cboot() to arch_pre_main() and move it to ia32.c (to be in line with other platforms)

File:
1 edited

Legend:

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

    r2f57690 rdeca67b  
    11/*
    22 * Copyright (c) 2001-2004 Jakub Jermar
     3 * Copyright (c) 2009 Jiri Svoboda
     4 * Copyright (c) 2009 Martin Decky
    35 * All rights reserved.
    46 *
     
    6466#include <ddi/device.h>
    6567#include <sysinfo/sysinfo.h>
     68#include <arch/boot/boot.h>
     69#include <string.h>
     70#include <macros.h>
    6671
    6772#ifdef CONFIG_SMP
    6873#include <arch/smp/apic.h>
    6974#endif
     75
     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 */
     83static 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.
     114 *
     115 * @param signature Should contain the multiboot signature.
     116 * @param mi        Pointer to the multiboot information structure.
     117 */
     118void 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;
     176       
     177#ifdef CONFIG_SMP
     178        /* Copy AP bootstrap routines below 1 MB. */
     179        memcpy((void *) AP_BOOT_OFFSET, (void *) BOOT_OFFSET,
     180            (size_t) &_hardcoded_unmapped_size);
     181#endif
     182}
    70183
    71184void arch_pre_mm_init(void)
Note: See TracChangeset for help on using the changeset viewer.