switch-coreboot/include/console.h
Carl-Daniel Hailfinger 1b5c399508 Move stage1 global variable management from asm to C. The stage0 asm
code now unconditionally pushes an empty pointer to the stack which is a
placeholder for the pointer to global variable storage. That pointer and
the global variable storage are initialized in global_vars_init().

Creating global variables is now a piece of cake. You don't even have to
touch any asm code, just add them to struct global_vars.

Build tested on all targets, boot tested on Qemu.

NOTES:
- The code is not yet MP safe, but that's due to v3 not being MP safe in
general (and the comments contradict the code regarding MP features).
- K8 code now works by accident.

Signed-off-by: Carl-Daniel Hailfinger <c-d.hailfinger.devel.2006@gmx.net>
Acked-by: Segher Boessenkool <segher@kernel.crashing.org>


git-svn-id: svn://coreboot.org/repository/coreboot-v3@785 f3766cd6-281f-0410-b1cd-43a5c92072e9
2008-08-18 16:54:12 +00:00

83 lines
2.9 KiB
C

/*
* 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 St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef CONSOLE_H
#define CONSOLE_H
#include <types.h>
#include <shared.h> /* We share symbols from stage 0 */
#include <post_code.h>
#define BIOS_ALWAYS 0 /* log no matter what; not necessarily an error */
#define BIOS_EMERG 0 /* system is unusable */
#define BIOS_ALERT 1 /* action must be taken immediately */
#define BIOS_CRIT 2 /* critical conditions */
#define BIOS_ERR 3 /* error conditions */
#define BIOS_WARNING 4 /* warning conditions */
#define BIOS_NOTICE 5 /* normal but significant condition */
#define BIOS_INFO 6 /* informational */
#define BIOS_DEBUG 7 /* debug-level messages */
#define BIOS_SPEW 8 /* Way too many details */
void console_init(void);
void console_tx_byte(unsigned char byte, void *arg);
void console_tx_flush(void);
unsigned char console_rx_byte(void);
int console_tst_byte(void);
#ifdef CONFIG_CONSOLE_BUFFER
void printk_buffer_init(void);
void printk_buffer_move(void *newaddr, int newsize);
#endif
struct console_driver {
void (*init)(void);
void (*tx_byte)(unsigned char byte, void *arg);
void (*tx_flush)(void);
unsigned char (*rx_byte)(void);
int (*tst_byte)(void);
};
#ifdef CONFIG_CONSOLE_BUFFER
struct printk_buffer {
int len;
int readoffset;
int writeoffset;
char buffer[];
};
#endif
/*
* struct global_vars is managed entirely from C code. Keep in mind that there
* is NO buffer at the end of the struct, so having zero-sized arrays at the
* end or similar stuff for which the compiler can't determine the final size
* will corrupt memory. If you don't try to be clever, everything will be fine.
*/
struct global_vars {
#ifdef CONFIG_CONSOLE_BUFFER
struct printk_buffer *printk_buffer;
#endif
};
int printk(int msg_level, const char *fmt, ...) __attribute__((format (printf, 2, 3)));
EXPORT_SYMBOL(printk);
void banner(int msg_level, const char *msg);
EXPORT_SYMBOL(banner);
void dump_mem_range(int msg_level, unsigned char *buf, int size);
EXPORT_SYMBOL(dump_mem_range);
void die(const char *msg);
EXPORT_SYMBOL(die);
#endif /* CONSOLE_H */