source: mainline/kernel/arch/amd64/src/amd64.c@ 84afc7b

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 84afc7b was 84afc7b, checked in by Martin Decky <martin@…>, 16 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.3 KB
RevLine 
[b9e97fb]1/*
[df4ed85]2 * Copyright (c) 2005 Ondrej Palkovsky
[b9e97fb]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
[287920f]29/** @addtogroup amd64
[b45c443]30 * @{
31 */
32/** @file
33 */
34
[b9e97fb]35#include <arch.h>
36
37#include <arch/types.h>
38
39#include <config.h>
40
[281b607]41#include <proc/thread.h>
[5d8d71e]42#include <genarch/multiboot/multiboot.h>
[91825d90]43#include <genarch/drivers/legacy/ia32/io.h>
[f245145]44#include <genarch/drivers/ega/ega.h>
[80d31883]45#include <arch/drivers/vesa.h>
[411b6a6]46#include <genarch/drivers/i8042/i8042.h>
47#include <genarch/kbrd/kbrd.h>
[80d31883]48#include <arch/drivers/i8254.h>
49#include <arch/drivers/i8259.h>
[5d8d71e]50#include <arch/boot/boot.h>
[b9e97fb]51
[26678e5]52#ifdef CONFIG_SMP
53#include <arch/smp/apic.h>
54#endif
55
[b9e97fb]56#include <arch/bios/bios.h>
[89344d85]57#include <arch/cpu.h>
58#include <print.h>
59#include <arch/cpuid.h>
[e16e036a]60#include <genarch/acpi/acpi.h>
[3396f59]61#include <panic.h>
[fcfac420]62#include <interrupt.h>
[dd4d6b0]63#include <arch/syscall.h>
[4e49572]64#include <arch/debugger.h>
[281b607]65#include <syscall/syscall.h>
[41d33ac]66#include <console/console.h>
[8607db8]67#include <ddi/irq.h>
[4c7257b]68#include <sysinfo/sysinfo.h>
[281b607]69
[49a39c2]70/** Disable I/O on non-privileged levels
71 *
72 * Clean IOPL(12,13) and NT(14) flags in EFLAGS register
73 */
74static void clean_IOPL_NT_flags(void)
75{
[f24d300]76 asm volatile (
[4cc2ddd]77 "pushfq\n"
78 "pop %%rax\n"
79 "and $~(0x7000), %%rax\n"
80 "pushq %%rax\n"
81 "popfq\n"
[f24d300]82 ::: "%rax"
[49a39c2]83 );
84}
85
86/** Disable alignment check
87 *
88 * Clean AM(18) flag in CR0 register
89 */
90static void clean_AM_flag(void)
91{
[f24d300]92 asm volatile (
[4cc2ddd]93 "mov %%cr0, %%rax\n"
94 "and $~(0x40000), %%rax\n"
95 "mov %%rax, %%cr0\n"
[f24d300]96 ::: "%rax"
[49a39c2]97 );
98}
99
[5d8d71e]100/** Perform amd64-specific initialization before main_bsp() is called.
101 *
102 * @param signature Should contain the multiboot signature.
103 * @param mi Pointer to the multiboot information structure.
104 */
105void arch_pre_main(uint32_t signature, const multiboot_info_t *mi)
106{
107 /* Parse multiboot information obtained from the bootloader. */
108 multiboot_info_parse(signature, mi);
109
110#ifdef CONFIG_SMP
111 /* Copy AP bootstrap routines below 1 MB. */
112 memcpy((void *) AP_BOOT_OFFSET, (void *) BOOT_OFFSET,
113 (size_t) &_hardcoded_unmapped_size);
114#endif
115}
116
[b9e97fb]117void arch_pre_mm_init(void)
118{
[4fb6bf36]119 /* Enable no-execute pages */
[89344d85]120 set_efer_flag(AMD_NXE_FLAG);
[3396f59]121 /* Enable FPU */
122 cpu_setup_fpu();
[dd4d6b0]123
[49a39c2]124 /* Initialize segmentation */
[b9e97fb]125 pm_init();
[4fb6bf36]126
127 /* Disable I/O on nonprivileged levels
128 * clear the NT (nested-thread) flag
[49a39c2]129 */
130 clean_IOPL_NT_flags();
131 /* Disable alignment check */
132 clean_AM_flag();
133
[b9e97fb]134 if (config.cpu_active == 1) {
[8607db8]135 interrupt_init();
[b9e97fb]136 bios_init();
[8607db8]137
138 /* PIC */
139 i8259_init();
[b9e97fb]140 }
141}
142
[4cc2ddd]143
[b9e97fb]144void arch_post_mm_init(void)
145{
146 if (config.cpu_active == 1) {
[8607db8]147 /* Initialize IRQ routing */
148 irq_init(IRQ_COUNT, IRQ_COUNT);
149
150 /* hard clock */
151 i8254_init();
[ec944b1]152
[de07bcf]153#ifdef CONFIG_FB
[381465e]154 if (vesa_present())
155 vesa_init();
156 else
[de07bcf]157#endif
[ec944b1]158#ifdef CONFIG_EGA
159 ega_init(EGA_BASE, EGA_VIDEORAM); /* video */
160#else
161 {}
162#endif
[8607db8]163
[4e49572]164 /* Enable debugger */
165 debugger_init();
[381465e]166 /* Merge all memory zones to 1 big zone */
167 zone_merge_all();
[b9e97fb]168 }
[4cc2ddd]169
[dd4d6b0]170 /* Setup fast SYSCALL/SYSRET */
171 syscall_setup_cpu();
[b9e97fb]172}
[7df54df]173
[26678e5]174void arch_post_cpu_init()
175{
176#ifdef CONFIG_SMP
177 if (config.cpu_active > 1) {
178 l_apic_init();
179 l_apic_debug();
180 }
181#endif
182}
183
[7453929]184void arch_pre_smp_init(void)
[7df54df]185{
186 if (config.cpu_active == 1) {
[0b5f9fa]187#ifdef CONFIG_SMP
[7df54df]188 acpi_init();
[0b5f9fa]189#endif /* CONFIG_SMP */
[7df54df]190 }
191}
192
[7453929]193void arch_post_smp_init(void)
194{
[4df7d3a]195#ifdef CONFIG_PC_KBD
196 /*
197 * Initialize the i8042 controller. Then initialize the keyboard
198 * module and connect it to i8042. Enable keyboard interrupts.
199 */
[84afc7b]200 indev_t *kbrdin = i8042_init((i8042_t *) I8042_BASE, IRQ_KBD);
[4df7d3a]201 if (kbrdin) {
202 kbrd_init(kbrdin);
203 trap_virtual_enable_irqs(1 << IRQ_KBD);
204 }
205
[4c7257b]206 /*
207 * This is the necessary evil until the userspace driver is entirely
208 * self-sufficient.
209 */
210 sysinfo_set_item_val("kbd", NULL, true);
211 sysinfo_set_item_val("kbd.inr", NULL, IRQ_KBD);
[ff685c9]212 sysinfo_set_item_val("kbd.address.physical", NULL,
213 (uintptr_t) I8042_BASE);
214 sysinfo_set_item_val("kbd.address.kernel", NULL,
215 (uintptr_t) I8042_BASE);
[4df7d3a]216#endif
[7453929]217}
218
[7df54df]219void calibrate_delay_loop(void)
220{
221 i8254_calibrate_delay_loop();
[8607db8]222 if (config.cpu_active == 1) {
223 /*
224 * This has to be done only on UP.
225 * On SMP, i8254 is not used for time keeping and its interrupt pin remains masked.
226 */
227 i8254_normal_operation();
228 }
[7df54df]229}
[281b607]230
[e1be3b6]231/** Set thread-local-storage pointer
[281b607]232 *
233 * TLS pointer is set in FS register. Unfortunately the 64-bit
234 * part can be set only in CPL0 mode.
235 *
[e1be3b6]236 * The specs say, that on %fs:0 there is stored contents of %fs register,
[281b607]237 * we need not to go to CPL0 to read it.
238 */
[7f1c620]239unative_t sys_tls_set(unative_t addr)
[281b607]240{
[a6d4ceb]241 THREAD->arch.tls = addr;
[281b607]242 write_msr(AMD_MSR_FS, addr);
243 return 0;
244}
[41d33ac]245
246/** Acquire console back for kernel
247 *
248 */
249void arch_grab_console(void)
250{
[f58321c4]251#ifdef CONFIG_FB
[4df7d3a]252 if (vesa_present())
253 vesa_redraw();
254 else
255#endif
256#ifdef CONFIG_EGA
257 ega_redraw();
[f58321c4]258#else
[4df7d3a]259 {}
[f58321c4]260#endif
[41d33ac]261}
[8fe5980]262
[41d33ac]263/** Return console to userspace
264 *
265 */
266void arch_release_console(void)
267{
268}
[b45c443]269
[6da1013f]270/** Construct function pointer
271 *
272 * @param fptr function pointer structure
273 * @param addr function address
274 * @param caller calling function address
275 *
276 * @return address of the function pointer
277 *
278 */
279void *arch_construct_function(fncptr_t *fptr, void *addr, void *caller)
280{
281 return addr;
282}
283
[287920f]284/** @}
[b45c443]285 */
Note: See TracBrowser for help on using the repository browser.