source: mainline/kernel/arch/mips32/src/mips32.c@ e1f0fe9

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

kernel output devices now suport multiple instances (except ski and sgcn, which respect the same interface, but behave as singletons)
if more than one output device gets initialized, the output is cloned to all of them
get rid of arch_grab_console() and arch_release_console() (output devices can implement a generic "redraw" method, input devices respect the "silent" global variable)
related cleanups and modifications

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