2 * Copyright (c) 2005 Jakub Jermar
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
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.
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.
36 #include <arch/ski/ski.h>
37 #include <arch/drivers/it.h>
38 #include <arch/interrupt.h>
39 #include <arch/barrier.h>
41 #include <arch/register.h>
42 #include <arch/types.h>
43 #include <arch/context.h>
44 #include <arch/stack.h>
45 #include <arch/mm/page.h>
48 #include <userspace.h>
49 #include <console/console.h>
50 #include <proc/uarg.h>
51 #include <syscall/syscall.h>
53 #include <arch/simics/ega.h>
55 void arch_pre_main(void)
57 /* Setup usermode init tasks. */
59 init
.tasks
[0].addr
= INIT0_ADDRESS
;
60 init
.tasks
[0].size
= INIT0_SIZE
;
61 init
.tasks
[1].addr
= INIT0_ADDRESS
+ 0x400000;
62 init
.tasks
[1].size
= INIT0_SIZE
;
63 init
.tasks
[2].addr
= INIT0_ADDRESS
+ 0x800000;
64 init
.tasks
[2].size
= INIT0_SIZE
;
65 init
.tasks
[3].addr
= INIT0_ADDRESS
+ 0xc00000;
66 init
.tasks
[3].size
= INIT0_SIZE
;
67 init
.tasks
[4].addr
= INIT0_ADDRESS
+ 0x1000000;
68 init
.tasks
[4].size
= INIT0_SIZE
;
69 init
.tasks
[5].addr
= INIT0_ADDRESS
+ 0x1400000;
70 init
.tasks
[5].size
= INIT0_SIZE
;
71 init
.tasks
[6].addr
= INIT0_ADDRESS
+ 0x1800000;
72 init
.tasks
[6].size
= INIT0_SIZE
;
73 init
.tasks
[7].addr
= INIT0_ADDRESS
+ 0x1c00000;
74 init
.tasks
[7].size
= INIT0_SIZE
;
77 void arch_pre_mm_init(void)
79 /* Set Interruption Vector Address (i.e. location of interruption vector table). */
80 iva_write((uintptr_t) &ivt
);
87 void arch_post_mm_init(void)
89 irq_init(INR_COUNT
, INR_COUNT
);
98 void arch_post_cpu_init(void)
102 void arch_pre_smp_init(void)
106 void arch_post_smp_init(void)
109 if (config
.cpu_active
== 1) {
111 * Create thread that polls keyboard.
115 t
= thread_create(kkbdpoll
, NULL
, TASK
, 0, "kkbdpoll", true);
117 panic("cannot create kkbdpoll\n");
123 /** Enter userspace and never return. */
124 void userspace(uspace_arg_t
*kernel_uarg
)
129 psr
.value
= psr_read();
131 psr
.i
= true; /* start with interrupts enabled */
133 psr
.ri
= 0; /* start with instruction #0 */
134 psr
.bn
= 1; /* start in bank 0 */
136 __asm__
volatile ("mov %0 = ar.rsc\n" : "=r" (rsc
.value
));
140 rsc
.mode
= 3; /* eager mode */
142 switch_to_userspace((uintptr_t) kernel_uarg
->uspace_entry
,
143 ((uintptr_t) kernel_uarg
->uspace_stack
)+PAGE_SIZE
-ALIGN_UP(STACK_ITEM_SIZE
, STACK_ALIGNMENT
),
144 ((uintptr_t) kernel_uarg
->uspace_stack
)+PAGE_SIZE
,
145 (uintptr_t) kernel_uarg
->uspace_uarg
,
146 psr
.value
, rsc
.value
);
153 /** Set thread-local-storage pointer.
155 * We use r13 (a.k.a. tp) for this purpose.
157 unative_t
sys_tls_set(unative_t addr
)
162 /** Acquire console back for kernel
165 void arch_grab_console(void)
171 /** Return console to userspace
174 void arch_release_console(void)