source: mainline/kernel/arch/mips32/src/mips32.c@ 9eec7bc

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

add support for variable uspace stack size
create individual address space areas for stacks of additional threads (instead of allocating the stack from heap)
avoid memory leaks in program_create()

  • Property mode set to 100644
File size: 6.9 KB
Line 
1/*
2 * Copyright (c) 2003-2004 Jakub Jermar
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 mips32
30 * @{
31 */
32/** @file
33 */
34
35#include <arch.h>
36#include <typedefs.h>
37#include <errno.h>
38#include <interrupt.h>
39#include <macros.h>
40#include <str.h>
41#include <memstr.h>
42#include <userspace.h>
43#include <console/console.h>
44#include <syscall/syscall.h>
45#include <sysinfo/sysinfo.h>
46#include <arch/debug.h>
47#include <arch/debugger.h>
48#include <arch/drivers/msim.h>
49#include <genarch/fb/fb.h>
50#include <genarch/drivers/dsrln/dsrlnin.h>
51#include <genarch/drivers/dsrln/dsrlnout.h>
52#include <genarch/srln/srln.h>
53
54/* Size of the code jumping to the exception handler code
55 * - J+NOP
56 */
57#define EXCEPTION_JUMP_SIZE 8
58
59#define TLB_EXC ((char *) 0x80000000)
60#define NORM_EXC ((char *) 0x80000180)
61#define CACHE_EXC ((char *) 0x80000100)
62
63
64/* Why the linker moves the variable 64K away in assembler
65 * when not in .text section?
66 */
67
68/* Stack pointer saved when entering user mode */
69uintptr_t supervisor_sp __attribute__ ((section (".text")));
70
71size_t cpu_count = 0;
72
73/** Performs mips32-specific initialization before main_bsp() is called. */
74void arch_pre_main(void *entry __attribute__((unused)), bootinfo_t *bootinfo)
75{
76 init.cnt = min3(bootinfo->cnt, TASKMAP_MAX_RECORDS, CONFIG_INIT_TASKS);
77
78 size_t i;
79 for (i = 0; i < init.cnt; i++) {
80 init.tasks[i].paddr = KA2PA(bootinfo->tasks[i].addr);
81 init.tasks[i].size = bootinfo->tasks[i].size;
82 str_cpy(init.tasks[i].name, CONFIG_TASK_NAME_BUFLEN,
83 bootinfo->tasks[i].name);
84 }
85
86 for (i = 0; i < CPUMAP_MAX_RECORDS; i++) {
87 if ((bootinfo->cpumap & (1 << i)) != 0)
88 cpu_count++;
89 }
90}
91
92void arch_pre_mm_init(void)
93{
94 /* It is not assumed by default */
95 interrupts_disable();
96
97 /* Initialize dispatch table */
98 exception_init();
99
100 /* Copy the exception vectors to the right places */
101 memcpy(TLB_EXC, (char *) tlb_refill_entry, EXCEPTION_JUMP_SIZE);
102 smc_coherence_block(TLB_EXC, EXCEPTION_JUMP_SIZE);
103 memcpy(NORM_EXC, (char *) exception_entry, EXCEPTION_JUMP_SIZE);
104 smc_coherence_block(NORM_EXC, EXCEPTION_JUMP_SIZE);
105 memcpy(CACHE_EXC, (char *) cache_error_entry, EXCEPTION_JUMP_SIZE);
106 smc_coherence_block(CACHE_EXC, EXCEPTION_JUMP_SIZE);
107
108 /*
109 * Switch to BEV normal level so that exception vectors point to the
110 * kernel. Clear the error level.
111 */
112 cp0_status_write(cp0_status_read() &
113 ~(cp0_status_bev_bootstrap_bit | cp0_status_erl_error_bit));
114
115 /*
116 * Mask all interrupts
117 */
118 cp0_mask_all_int();
119
120 debugger_init();
121}
122
123void arch_post_mm_init(void)
124{
125 interrupt_init();
126
127#ifdef CONFIG_FB
128 /* GXemul framebuffer */
129 fb_properties_t gxemul_prop = {
130 .addr = 0x12000000,
131 .offset = 0,
132 .x = 640,
133 .y = 480,
134 .scan = 1920,
135 .visual = VISUAL_RGB_8_8_8,
136 };
137
138 outdev_t *fbdev = fb_init(&gxemul_prop);
139 if (fbdev)
140 stdout_wire(fbdev);
141#endif
142
143#ifdef CONFIG_MIPS_PRN
144 outdev_t *dsrlndev = dsrlnout_init((ioport8_t *) MSIM_KBD_ADDRESS);
145 if (dsrlndev)
146 stdout_wire(dsrlndev);
147#endif
148}
149
150void arch_post_cpu_init(void)
151{
152}
153
154void arch_pre_smp_init(void)
155{
156}
157
158void arch_post_smp_init(void)
159{
160 static const char *platform;
161
162 /* Set platform name. */
163#ifdef MACHINE_msim
164 platform = "msim";
165#endif
166#ifdef MACHINE_bgxemul
167 platform = "gxemul";
168#endif
169#ifdef MACHINE_lgxemul
170 platform = "gxemul";
171#endif
172 sysinfo_set_item_data("platform", NULL, (void *) platform,
173 str_size(platform));
174
175#ifdef CONFIG_MIPS_KBD
176 /*
177 * Initialize the msim/GXemul keyboard port. Then initialize the serial line
178 * module and connect it to the msim/GXemul keyboard. Enable keyboard interrupts.
179 */
180 dsrlnin_instance_t *dsrlnin_instance
181 = dsrlnin_init((dsrlnin_t *) MSIM_KBD_ADDRESS, MSIM_KBD_IRQ);
182 if (dsrlnin_instance) {
183 srln_instance_t *srln_instance = srln_init();
184 if (srln_instance) {
185 indev_t *sink = stdin_wire();
186 indev_t *srln = srln_wire(srln_instance, sink);
187 dsrlnin_wire(dsrlnin_instance, srln);
188 cp0_unmask_int(MSIM_KBD_IRQ);
189 }
190 }
191
192 /*
193 * This is the necessary evil until the userspace driver is entirely
194 * self-sufficient.
195 */
196 sysinfo_set_item_val("kbd", NULL, true);
197 sysinfo_set_item_val("kbd.inr", NULL, MSIM_KBD_IRQ);
198 sysinfo_set_item_val("kbd.address.physical", NULL,
199 PA2KA(MSIM_KBD_ADDRESS));
200#endif
201}
202
203void calibrate_delay_loop(void)
204{
205}
206
207void userspace(uspace_arg_t *kernel_uarg)
208{
209 /* EXL = 1, UM = 1, IE = 1 */
210 cp0_status_write(cp0_status_read() | (cp0_status_exl_exception_bit |
211 cp0_status_um_bit | cp0_status_ie_enabled_bit));
212 cp0_epc_write((uintptr_t) kernel_uarg->uspace_entry);
213 userspace_asm(((uintptr_t) kernel_uarg->uspace_stack +
214 kernel_uarg->uspace_stack_size),
215 (uintptr_t) kernel_uarg->uspace_uarg,
216 (uintptr_t) kernel_uarg->uspace_entry);
217
218 while (1);
219}
220
221/** Perform mips32 specific tasks needed before the new task is run. */
222void before_task_runs_arch(void)
223{
224}
225
226/** Perform mips32 specific tasks needed before the new thread is scheduled. */
227void before_thread_runs_arch(void)
228{
229 supervisor_sp =
230 (uintptr_t) &THREAD->kstack[STACK_SIZE - SP_DELTA];
231}
232
233void after_thread_ran_arch(void)
234{
235}
236
237/** Set thread-local-storage pointer
238 *
239 * We have it currently in K1, it is
240 * possible to have it separately in the future.
241 */
242sysarg_t sys_tls_set(uintptr_t addr)
243{
244 return EOK;
245}
246
247void arch_reboot(void)
248{
249 ___halt();
250 while (1);
251}
252
253/** Construct function pointer
254 *
255 * @param fptr function pointer structure
256 * @param addr function address
257 * @param caller calling function address
258 *
259 * @return address of the function pointer
260 *
261 */
262void *arch_construct_function(fncptr_t *fptr, void *addr, void *caller)
263{
264 return addr;
265}
266
267void irq_initialize_arch(irq_t *irq)
268{
269 (void) irq;
270}
271
272/** @}
273 */
Note: See TracBrowser for help on using the repository browser.