X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Ftypes.h;h=c0c6d26ca24358d3405fb97050ce24c09b2a9f20;hb=refs%2Fheads%2Fcoreboot;hp=b2100c1450c5ad44ee7b3b34e7877db210ed5319;hpb=dad41d9f217cef9dc6c404d409f6c27b0454b73f;p=seabios.git diff --git a/src/types.h b/src/types.h index b2100c1..c0c6d26 100644 --- a/src/types.h +++ b/src/types.h @@ -1,6 +1,6 @@ // Basic type definitions for X86 cpus. // -// Copyright (C) 2008,2009 Kevin O'Connor +// Copyright (C) 2008-2010 Kevin O'Connor // // This file may be distributed under the terms of the GNU LGPLv3 license. #ifndef __TYPES_H @@ -34,8 +34,9 @@ union u64_u32_u { #define UNIQSEC __FILE__ "." __stringify(__LINE__) #define __noreturn __attribute__((noreturn)) -extern void __force_link_error__only_in_32bit_flat() __noreturn; -extern void __force_link_error__only_in_16bit() __noreturn; +extern void __force_link_error__only_in_32bit_flat(void) __noreturn; +extern void __force_link_error__only_in_32bit_segmented(void) __noreturn; +extern void __force_link_error__only_in_16bit(void) __noreturn; #define __ASM(code) asm(".section .text.asm." UNIQSEC "\n\t" code) @@ -43,9 +44,11 @@ extern void __force_link_error__only_in_16bit() __noreturn; // Notes a function as externally visible in the 16bit code chunk. # define VISIBLE16 __VISIBLE // Notes a function as externally visible in the 32bit flat code chunk. -# define VISIBLE32FLAT +# define VISIBLE32FLAT __section(".discard.func32flat." UNIQSEC) noinline +// Notes a 32bit flat function that will only be called during init. +# define VISIBLE32INIT VISIBLE32FLAT // Notes a function as externally visible in the 32bit segmented code chunk. -# define VISIBLE32SEG +# define VISIBLE32SEG __section(".discard.func32seg." UNIQSEC) noinline // Designate a variable as (only) visible to 16bit code. # define VAR16 __section(".data16." UNIQSEC) // Designate a variable as visible to 16bit, 32bit, and assembler code. @@ -63,11 +66,13 @@ extern void __force_link_error__only_in_16bit() __noreturn; // Designate top-level assembler as 32bit flat only. # define ASM32FLAT(code) // Compile time check for a given mode. -#define ASSERT16() do { } while (0) -#define ASSERT32FLAT() __force_link_error__only_in_32bit_flat() +# define ASSERT16() do { } while (0) +# define ASSERT32SEG() __force_link_error__only_in_32bit_segmented() +# define ASSERT32FLAT() __force_link_error__only_in_32bit_flat() #elif MODESEGMENT == 1 -# define VISIBLE16 -# define VISIBLE32FLAT +# define VISIBLE16 __section(".discard.func16." UNIQSEC) noinline +# define VISIBLE32FLAT __section(".discard.func32flat." UNIQSEC) noinline +# define VISIBLE32INIT VISIBLE32FLAT # define VISIBLE32SEG __VISIBLE # define VAR16 __section(".discard.var16." UNIQSEC) # define VAR16VISIBLE VAR16 __VISIBLE __weak @@ -77,22 +82,25 @@ extern void __force_link_error__only_in_16bit() __noreturn; # define VAR32FLATVISIBLE __section(".discard.var32flat." UNIQSEC) __VISIBLE __weak # define ASM16(code) # define ASM32FLAT(code) -#define ASSERT16() __force_link_error__only_in_16bit() -#define ASSERT32FLAT() __force_link_error__only_in_32bit_flat() +# define ASSERT16() __force_link_error__only_in_16bit() +# define ASSERT32SEG() do { } while (0) +# define ASSERT32FLAT() __force_link_error__only_in_32bit_flat() #else -# define VISIBLE16 -# define VISIBLE32FLAT __VISIBLE -# define VISIBLE32SEG +# define VISIBLE16 __section(".discard.func16." UNIQSEC) noinline +# define VISIBLE32FLAT __section(".text.runtime." UNIQSEC) __VISIBLE +# define VISIBLE32INIT __section(".text.init." UNIQSEC) __VISIBLE +# define VISIBLE32SEG __section(".discard.func32seg." UNIQSEC) noinline # define VAR16 __section(".discard.var16." UNIQSEC) # define VAR16VISIBLE VAR16 __VISIBLE __weak # define VAR16EXPORT VAR16VISIBLE # define VAR16FIXED(addr) VAR16VISIBLE # define VAR32SEG __section(".discard.var32seg." UNIQSEC) -# define VAR32FLATVISIBLE __VISIBLE +# define VAR32FLATVISIBLE __section(".data.runtime." UNIQSEC) __VISIBLE # define ASM16(code) # define ASM32FLAT(code) __ASM(code) -#define ASSERT16() __force_link_error__only_in_16bit() -#define ASSERT32FLAT() do { } while (0) +# define ASSERT16() __force_link_error__only_in_16bit() +# define ASSERT32SEG() __force_link_error__only_in_32bit_segmented() +# define ASSERT32FLAT() do { } while (0) #endif #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) @@ -110,6 +118,9 @@ extern void __force_link_error__only_in_16bit() __noreturn; const typeof( ((type *)0)->member ) *__mptr = (ptr); \ (type *)( (char *)__mptr - offsetof(type,member) );}) +#define likely(x) __builtin_expect(!!(x), 1) +#define unlikely(x) __builtin_expect(!!(x), 0) + #define NULL ((void*)0) #define __weak __attribute__((weak)) @@ -122,6 +133,7 @@ extern void __force_link_error__only_in_16bit() __noreturn; #define noinline __attribute__((noinline)) #define __always_inline inline __attribute__((always_inline)) +#define __malloc __attribute__((__malloc__)) #define __attribute_const __attribute__((__const__)) #define __stringify_1(x) #x