source: mainline/kernel/arch/mips32/src/mips32.c@ 5b8c75a

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

as kernel little brother drivers are not needed anymore, the device numbers do not have to be correlated between kernel and uspace in any way
introduce new syscall sys_device_assign_devno() for generating system-wide unique device numbers for uspace

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