source: mainline/kernel/arch/ia32/src/boot/cboot.c@ 2f57690

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 2f57690 was 2f57690, checked in by Martin Decky <martin@…>, 17 years ago

cstyle

  • Property mode set to 100644
File size: 4.2 KB
Line 
1/*
2 * Copyright (c) 2009 Jiri Svoboda
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29/** @addtogroup ia32
30 * @{
31 */
32/** @file
33 */
34
35#include <main/main.h>
36#include <arch/boot/boot.h>
37#include <arch/boot/cboot.h>
38#include <arch/boot/memmap.h>
39#include <config.h>
40#include <memstr.h>
41#include <string.h>
42#include <macros.h>
43
44/* This is a symbol so the type is only dummy. Obtain the value using &. */
45extern int _hardcoded_unmapped_size;
46
47/** Extract command name from the multiboot module command line.
48 *
49 * @param buf Destination buffer (will always null-terminate).
50 * @param n Size of destination buffer.
51 * @param cmd_line Input string (the command line).
52 *
53 */
54static void extract_command(char *buf, size_t n, const char *cmd_line)
55{
56 const char *start, *end, *cp;
57 size_t max_len;
58
59 /* Find the first space. */
60 end = strchr(cmd_line, ' ');
61 if (end == NULL)
62 end = cmd_line + strlen(cmd_line);
63
64 /*
65 * Find last occurence of '/' before 'end'. If found, place start at
66 * next character. Otherwise, place start at beginning of buffer.
67 */
68 cp = end;
69 start = buf;
70 while (cp != start) {
71 if (*cp == '/') {
72 start = cp + 1;
73 break;
74 }
75 --cp;
76 }
77
78 /* Copy the command and null-terminate the string. */
79 max_len = min(n - 1, (size_t) (end - start));
80 strncpy(buf, start, max_len + 1);
81 buf[max_len] = '\0';
82}
83
84/** C part of ia32 boot sequence.
85 *
86 * @param signature Should contain the multiboot signature.
87 * @param mi Pointer to the multiboot information structure.
88 */
89void ia32_cboot(uint32_t signature, const mb_info_t *mi)
90{
91 uint32_t flags;
92 mb_mod_t *mods;
93 uint32_t i;
94
95 if (signature == MULTIBOOT_LOADER_MAGIC)
96 flags = mi->flags;
97 else {
98 /* No multiboot info available. */
99 flags = 0;
100 }
101
102 /* Copy module information. */
103
104 if ((flags & MBINFO_FLAGS_MODS) != 0) {
105 init.cnt = mi->mods_count;
106 mods = mi->mods_addr;
107
108 for (i = 0; i < init.cnt; i++) {
109 init.tasks[i].addr = mods[i].start + 0x80000000;
110 init.tasks[i].size = mods[i].end - mods[i].start;
111
112 /* Copy command line, if available. */
113 if (mods[i].string) {
114 extract_command(init.tasks[i].name,
115 CONFIG_TASK_NAME_BUFLEN,
116 mods[i].string);
117 } else
118 init.tasks[i].name[0] = '\0';
119 }
120 } else
121 init.cnt = 0;
122
123 /* Copy memory map. */
124
125 int32_t mmap_length;
126 mb_mmap_t *mme;
127 uint32_t size;
128
129 if ((flags & MBINFO_FLAGS_MMAP) != 0) {
130 mmap_length = mi->mmap_length;
131 mme = mi->mmap_addr;
132 e820counter = 0;
133
134 i = 0;
135 while (mmap_length > 0) {
136 e820table[i++] = mme->mm_info;
137
138 /* Compute address of next structure. */
139 size = sizeof(mme->size) + mme->size;
140 mme = ((void *) mme) + size;
141 mmap_length -= size;
142 }
143
144 e820counter = i;
145 } else
146 e820counter = 0;
147
148#ifdef CONFIG_SMP
149 /* Copy AP bootstrap routines below 1 MB. */
150 memcpy((void *) AP_BOOT_OFFSET, (void *) BOOT_OFFSET,
151 (size_t) &_hardcoded_unmapped_size);
152#endif
153
154 main_bsp();
155}
156
157/** @}
158 */
Note: See TracBrowser for help on using the repository browser.