/* Copyright (C) 2012, Aaron Lindsay This file is part of Aedrix. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include #include #include #include #include #include #include #include #include #include extern uint32 early_initcalls_start, early_initcalls_end; extern uint32 initcalls_start, initcalls_end; void init_earlyinitcalls() { void (**initcall)(); for (initcall = (void (**)()) &early_initcalls_start; initcall < (void (**)())&early_initcalls_end; initcall++) (*initcall)(); } void init_initcalls() { void (**initcall)(); for (initcall = (void (**)()) &initcalls_start; initcall < (void (**)())&initcalls_end; initcall++) (*initcall)(); } struct fb console_fb; void print_console_logo() { print(" _ _ _\n"); print(" / \\ ___ __| |_ __(_)_ __\n"); print(" / _ \\ / _ \\/ _` | '__| \\ \\/ /\n"); print(" / ___ \\ __/ (_| | | | |> <\n"); print(" /_/ \\_\\___|\\__,_|_| |_/_/\\_\\\n\n"); print(" Copyright (C) 2012 - Aaron Lindsay\n\n\n"); } void video_console_init(void) { struct fb_dev *fbdev = fb_first_device(); int ret; if (!fbdev) { print("Error: No framebuffer-capable device registered."); return; } ret = fbdev->init(&console_fb, 16); if (ret) { print("Error: Failed to initialize framebuffer device."); return; } if ((console_init(&console_fb))) return; print_register_func(&console_putc); print_console_logo(); print("Initialized video console on %s.\n", fbdev->name); } void serial_console_init() { struct serial_dev *sdev = serial_first_device(); if (!sdev) return; print_register_func_early(sdev->putc); print("Initialized serial console on %s\n", sdev->name); } //Forward declarations of non-initcall initializations that are only needed //once, and only here void serial_init(); void kmalloc_init(); int main(void) { char *lower, *upper; struct atag *atags; //setup MMU mmu_reinit(); /* Initialize the serial subsystem before * init_earlyinitcalls(), because console drivers get * initialized here so as to have an output console as * early as possible, and we don't want those * initializations to fail. */ serial_init(); init_earlyinitcalls(); serial_console_init(); //setup memory subsystems mm_init(); kmalloc_init(); if (atags_first_mem_region(&atags)) { print("Error: atags must contain at least one memory region\n"); return -1; } do { lower = (char *)atags->data.mem.start; upper = lower + atags->data.mem.size - 1; print("atags: physical memory at %x-%x\n", lower, upper); declare_memory_region(lower, upper); } while (!atags_next_mem_region(&atags)); init_initcalls(); video_console_init(); return 0; }