source: mainline/kernel/arch/arm32/src/arm32.c@ b888d5f

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since b888d5f 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: 5.2 KB
Line 
1/*
2 * Copyright (c) 2007 Michal Kebrt
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 arm32
30 * @{
31 */
32/** @file
33 * @brief ARM32 architecture specific functions.
34 */
35
36#include <arch.h>
37#include <config.h>
38#include <arch/console.h>
39#include <genarch/fb/fb.h>
40#include <genarch/fb/visuals.h>
41#include <genarch/drivers/dsrln/dsrlnin.h>
42#include <genarch/drivers/dsrln/dsrlnout.h>
43#include <genarch/srln/srln.h>
44#include <sysinfo/sysinfo.h>
45#include <ddi/irq.h>
46#include <arch/drivers/gxemul.h>
47#include <print.h>
48#include <config.h>
49#include <interrupt.h>
50#include <arch/regutils.h>
51#include <userspace.h>
52#include <macros.h>
53#include <string.h>
54
55/** Performs arm32-specific initialization before main_bsp() is called. */
56void arch_pre_main(void *entry __attribute__((unused)), bootinfo_t *bootinfo)
57{
58 unsigned int i;
59
60 init.cnt = bootinfo->cnt;
61
62 for (i = 0; i < min3(bootinfo->cnt, TASKMAP_MAX_RECORDS, CONFIG_INIT_TASKS); ++i) {
63 init.tasks[i].addr = bootinfo->tasks[i].addr;
64 init.tasks[i].size = bootinfo->tasks[i].size;
65 strncpy(init.tasks[i].name, bootinfo->tasks[i].name,
66 CONFIG_TASK_NAME_BUFLEN);
67 }
68}
69
70/** Performs arm32 specific initialization before mm is initialized. */
71void arch_pre_mm_init(void)
72{
73 /* It is not assumed by default */
74 interrupts_disable();
75}
76
77/** Performs arm32 specific initialization afterr mm is initialized. */
78void arch_post_mm_init(void)
79{
80 gxemul_init();
81
82 /* Initialize exception dispatch table */
83 exception_init();
84 interrupt_init();
85
86#ifdef CONFIG_FB
87 fb_properties_t prop = {
88 .addr = GXEMUL_FB_ADDRESS,
89 .offset = 0,
90 .x = 640,
91 .y = 480,
92 .scan = 1920,
93 .visual = VISUAL_BGR_8_8_8,
94 };
95 fb_init(&prop);
96#else
97#ifdef CONFIG_ARM_PRN
98 dsrlnout_init((ioport8_t *) gxemul_kbd);
99#endif /* CONFIG_ARM_PRN */
100#endif /* CONFIG_FB */
101}
102
103/** Performs arm32 specific tasks needed after cpu is initialized.
104 *
105 * Currently the function is empty.
106 */
107void arch_post_cpu_init(void)
108{
109}
110
111
112/** Performs arm32 specific tasks needed before the multiprocessing is
113 * initialized.
114 *
115 * Currently the function is empty because SMP is not supported.
116 */
117void arch_pre_smp_init(void)
118{
119}
120
121
122/** Performs arm32 specific tasks needed after the multiprocessing is
123 * initialized.
124 *
125 * Currently the function is empty because SMP is not supported.
126 */
127void arch_post_smp_init(void)
128{
129#ifdef CONFIG_ARM_KBD
130 /*
131 * Initialize the msim/GXemul keyboard port. Then initialize the serial line
132 * module and connect it to the msim/GXemul keyboard. Enable keyboard interrupts.
133 */
134 indev_t *kbrdin = dsrlnin_init((dsrlnin_t *) gxemul_kbd, GXEMUL_KBD_IRQ);
135 if (kbrdin)
136 srln_init(kbrdin);
137
138 /*
139 * This is the necessary evil until the userspace driver is entirely
140 * self-sufficient.
141 */
142 sysinfo_set_item_val("kbd", NULL, true);
143 sysinfo_set_item_val("kbd.inr", NULL, GXEMUL_KBD_IRQ);
144 sysinfo_set_item_val("kbd.address.virtual", NULL, (unative_t) gxemul_kbd);
145#endif
146}
147
148
149/** Performs arm32 specific tasks needed before the new task is run. */
150void before_task_runs_arch(void)
151{
152 tlb_invalidate_all();
153}
154
155
156/** Performs arm32 specific tasks needed before the new thread is scheduled.
157 *
158 * It sets supervisor_sp.
159 */
160void before_thread_runs_arch(void)
161{
162 uint8_t *stck;
163
164 stck = &THREAD->kstack[THREAD_STACK_SIZE - SP_DELTA];
165 supervisor_sp = (uintptr_t) stck;
166}
167
168/** Performs arm32 specific tasks before a thread stops running.
169 *
170 * Currently the function is empty.
171 */
172void after_thread_ran_arch(void)
173{
174}
175
176/** Halts CPU. */
177void cpu_halt(void)
178{
179 *((char *) (gxemul_kbd + GXEMUL_HALT_OFFSET))
180 = 0;
181}
182
183/** Reboot. */
184void arch_reboot()
185{
186 /* not implemented */
187 while (1);
188}
189
190/** Construct function pointer
191 *
192 * @param fptr function pointer structure
193 * @param addr function address
194 * @param caller calling function address
195 *
196 * @return address of the function pointer
197 *
198 */
199void *arch_construct_function(fncptr_t *fptr, void *addr, void *caller)
200{
201 return addr;
202}
203
204/** @}
205 */
Note: See TracBrowser for help on using the repository browser.