Rev 2227 | Rev 2745 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2227 | Rev 2465 | ||
---|---|---|---|
Line 1... | Line 1... | ||
1 | /* |
1 | /* |
2 | * Copyright (c) 2003-2004 Jakub Jermar |
2 | * Copyright (c) 2007 Michal Kebrt |
3 | * All rights reserved. |
3 | * All rights reserved. |
4 | * |
4 | * |
5 | * Redistribution and use in source and binary forms, with or without |
5 | * Redistribution and use in source and binary forms, with or without |
6 | * modification, are permitted provided that the following conditions |
6 | * modification, are permitted provided that the following conditions |
7 | * are met: |
7 | * are met: |
Line 28... | Line 28... | ||
28 | 28 | ||
29 | /** @addtogroup arm32 |
29 | /** @addtogroup arm32 |
30 | * @{ |
30 | * @{ |
31 | */ |
31 | */ |
32 | /** @file |
32 | /** @file |
- | 33 | * @brief ARM32 architecture specific functions. |
|
33 | */ |
34 | */ |
34 | 35 | ||
35 | - | ||
36 | #include <arch.h> |
36 | #include <arch.h> |
- | 37 | #include <arch/boot.h> |
|
- | 38 | #include <config.h> |
|
- | 39 | #include <arch/console.h> |
|
- | 40 | #include <ddi/device.h> |
|
- | 41 | #include <genarch/fb/fb.h> |
|
- | 42 | #include <genarch/fb/visuals.h> |
|
- | 43 | #include <ddi/irq.h> |
|
- | 44 | #include <arch/debug/print.h> |
|
- | 45 | #include <print.h> |
|
- | 46 | #include <config.h> |
|
- | 47 | #include <interrupt.h> |
|
- | 48 | #include <arch/regutils.h> |
|
- | 49 | #include <arch/machine.h> |
|
- | 50 | #include <userspace.h> |
|
- | 51 | ||
- | 52 | /** Information about loaded tasks. */ |
|
- | 53 | bootinfo_t bootinfo; |
|
37 | 54 | ||
- | 55 | /** Performs arm32 specific initialization before main_bsp() is called. */ |
|
38 | void arch_pre_main(void) |
56 | void arch_pre_main(void) |
39 | { |
57 | { |
40 | /* TODO */ |
58 | int i; |
- | 59 | ||
- | 60 | init.cnt = bootinfo.cnt; |
|
- | 61 | ||
- | 62 | for (i = 0; i < bootinfo.cnt; ++i) { |
|
- | 63 | init.tasks[i].addr = bootinfo.tasks[i].addr; |
|
- | 64 | init.tasks[i].size = bootinfo.tasks[i].size; |
|
- | 65 | } |
|
- | 66 | ||
41 | } |
67 | } |
42 | 68 | ||
- | 69 | /** Performs arm32 specific initialization before mm is initialized. */ |
|
43 | void arch_pre_mm_init(void) |
70 | void arch_pre_mm_init(void) |
44 | { |
71 | { |
45 | /* TODO */ |
72 | /* It is not assumed by default */ |
- | 73 | interrupts_disable(); |
|
46 | } |
74 | } |
47 | 75 | ||
- | 76 | /** Performs arm32 specific initialization afterr mm is initialized. */ |
|
48 | void arch_post_mm_init(void) |
77 | void arch_post_mm_init(void) |
49 | { |
78 | { |
- | 79 | machine_hw_map_init(); |
|
- | 80 | ||
- | 81 | /* Initialize exception dispatch table */ |
|
- | 82 | exception_init(); |
|
- | 83 | ||
- | 84 | interrupt_init(); |
|
- | 85 | ||
- | 86 | console_init(device_assign_devno()); |
|
- | 87 | ||
50 | /* TODO */ |
88 | #ifdef CONFIG_FB |
- | 89 | fb_init(machine_get_fb_address(), 640, 480, 1920, VISUAL_RGB_8_8_8); |
|
- | 90 | #endif |
|
51 | } |
91 | } |
52 | 92 | ||
- | 93 | /** Performs arm32 specific tasks needed after cpu is initialized. |
|
- | 94 | * |
|
- | 95 | * Currently the function is empty. |
|
- | 96 | */ |
|
53 | void arch_post_cpu_init(void) |
97 | void arch_post_cpu_init(void) |
54 | { |
98 | { |
55 | /* TODO */ |
- | |
56 | } |
99 | } |
57 | 100 | ||
- | 101 | ||
- | 102 | /** Performs arm32 specific tasks needed before the multiprocessing is |
|
- | 103 | * initialized. |
|
- | 104 | * |
|
- | 105 | * Currently the function is empty because SMP is not supported. |
|
- | 106 | */ |
|
58 | void arch_pre_smp_init(void) |
107 | void arch_pre_smp_init(void) |
59 | { |
108 | { |
60 | /* TODO */ |
- | |
61 | } |
109 | } |
62 | 110 | ||
- | 111 | ||
- | 112 | /** Performs arm32 specific tasks needed after the multiprocessing is |
|
- | 113 | * initialized. |
|
- | 114 | * |
|
- | 115 | * Currently the function is empty because SMP is not supported. |
|
- | 116 | */ |
|
63 | void arch_post_smp_init(void) |
117 | void arch_post_smp_init(void) |
64 | { |
118 | { |
65 | /* TODO */ |
- | |
66 | } |
119 | } |
67 | 120 | ||
- | 121 | ||
68 | /** Perform arm32 specific tasks needed before the new task is run. */ |
122 | /** Performs arm32 specific tasks needed before the new task is run. */ |
69 | void before_task_runs_arch(void) |
123 | void before_task_runs_arch(void) |
70 | { |
124 | { |
71 | /* TODO */ |
125 | tlb_invalidate_all(); |
72 | } |
126 | } |
73 | 127 | ||
- | 128 | ||
74 | /** Perform arm32 specific tasks needed before the new thread is scheduled. */ |
129 | /** Performs arm32 specific tasks needed before the new thread is scheduled. |
- | 130 | * |
|
- | 131 | * It sets supervisor_sp. |
|
- | 132 | */ |
|
75 | void before_thread_runs_arch(void) |
133 | void before_thread_runs_arch(void) |
76 | { |
134 | { |
77 | /* TODO */ |
135 | uint8_t *stck; |
- | 136 | ||
- | 137 | stck = &THREAD->kstack[THREAD_STACK_SIZE - SP_DELTA]; |
|
- | 138 | supervisor_sp = (uintptr_t) stck; |
|
78 | } |
139 | } |
79 | 140 | ||
- | 141 | /** Performs arm32 specific tasks before a thread stops running. |
|
- | 142 | * |
|
- | 143 | * Currently the function is empty. |
|
- | 144 | */ |
|
80 | void after_thread_ran_arch(void) |
145 | void after_thread_ran_arch(void) |
81 | { |
146 | { |
82 | /* TODO */ |
- | |
83 | } |
147 | } |
84 | 148 | ||
- | 149 | /** Halts CPU. */ |
|
- | 150 | void cpu_halt(void) |
|
- | 151 | { |
|
- | 152 | machine_cpu_halt(); |
|
- | 153 | } |
|
- | 154 | ||
- | 155 | /** Reboot. */ |
|
85 | void arch_reboot(void) |
156 | void arch_reboot() |
86 | { |
157 | { |
- | 158 | /* not implemented */ |
|
87 | // TODO |
159 | for (;;) |
88 | while (1); |
160 | ; |
89 | } |
161 | } |
90 | 162 | ||
91 | /** @} |
163 | /** @} |
92 | */ |
164 | */ |