/* * Copyright 2010 Stefan Lankes, Chair for Operating Systems, * RWTH Aachen University * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * This file is part of MetalSVM. */ #include #include #include #include #ifdef CONFIG_VGA #include #endif static unsigned int kmsg_counter = 0; static unsigned char kmessages[KMSG_SIZE]; static spinlock_t kio_lock = SPINLOCK_INIT; int koutput_init(void) { #ifdef CONFIG_VGA vga_init(); #endif memset(kmessages, 0, sizeof(unsigned char)*KMSG_SIZE); return 0; } int kputchar(int c) { int ret = 1; spinlock_lock(&kio_lock); kmessages[kmsg_counter++ % KMSG_SIZE] = c; #ifdef CONFIG_VGA ret = vga_putchar(c); #endif spinlock_unlock(&kio_lock); return ret; } int kputs(const char *str) { int i; spinlock_lock(&kio_lock); for(i=0; str[i] != '\0'; i++) kmessages[kmsg_counter++ % KMSG_SIZE] = str[i]; #ifdef CONFIG_VGA i = vga_puts(str); #endif spinlock_unlock(&kio_lock); return i; }