diff options
author | Kevin O'Connor <kevin@koconnor.net> | 2009-12-26 23:32:57 -0500 |
---|---|---|
committer | Kevin O'Connor <kevin@koconnor.net> | 2009-12-26 23:32:57 -0500 |
commit | 52a300f1c1ec2d9733d41ecd3ecaf78be48097b8 (patch) | |
tree | aae0fd6884fd93440080f65144d3f7eab327e1b5 /src | |
parent | fe2c3eece930e6d6e9f88e5d4d4ba4ccbe29f9fa (diff) | |
download | seabios-52a300f1c1ec2d9733d41ecd3ecaf78be48097b8.tar.gz |
Introduce MODESEGMENT define; rename VISIBLE32 to VISIBLE32FLAT.
Prepare for support of segmented 32bit code.
Add new MODESEGMENT definition, and clarify existing 32bit mode defs.
Diffstat (limited to 'src')
-rw-r--r-- | src/biosvar.h | 6 | ||||
-rw-r--r-- | src/block.c | 2 | ||||
-rw-r--r-- | src/boot.c | 4 | ||||
-rw-r--r-- | src/farptr.h | 14 | ||||
-rw-r--r-- | src/output.c | 18 | ||||
-rw-r--r-- | src/pmm.c | 16 | ||||
-rw-r--r-- | src/post.c | 2 | ||||
-rw-r--r-- | src/resume.c | 4 | ||||
-rw-r--r-- | src/smm.c | 2 | ||||
-rw-r--r-- | src/smp.c | 3 | ||||
-rw-r--r-- | src/stacks.c | 10 | ||||
-rw-r--r-- | src/types.h | 23 | ||||
-rw-r--r-- | src/util.c | 8 | ||||
-rw-r--r-- | src/util.h | 2 |
14 files changed, 56 insertions, 58 deletions
diff --git a/src/biosvar.h b/src/biosvar.h index aeebf0fc..6a789e41 100644 --- a/src/biosvar.h +++ b/src/biosvar.h @@ -238,7 +238,7 @@ static inline u16 get_ebda_seg() { static inline struct extended_bios_data_area_s * get_ebda_ptr() { - ASSERT32(); + ASSERT32FLAT(); return MAKE_FLATPTR(get_ebda_seg(), 0); } #define GET_EBDA2(eseg, var) \ @@ -267,10 +267,10 @@ static inline u16 get_global_seg() { #define GET_GLOBAL(var) \ GET_VAR(GLOBAL_SEGREG, (var)) #define SET_GLOBAL(var, val) do { \ - ASSERT32(); \ + ASSERT32FLAT(); \ (var) = (val); \ } while (0) -#if MODE16 +#if MODESEGMENT #define ADJUST_GLOBAL_PTR(var) (var) #else #define ADJUST_GLOBAL_PTR(var) ((typeof(var))((void*)var - BUILD_BIOS_ADDR)) diff --git a/src/block.c b/src/block.c index 1fbfadab..3fb5e91d 100644 --- a/src/block.c +++ b/src/block.c @@ -283,7 +283,7 @@ map_floppy_drive(struct drive_s *drive_g) void describe_drive(struct drive_s *drive_g) { - ASSERT32(); + ASSERT32FLAT(); u8 type = GET_GLOBAL(drive_g->type); switch (type) { case DTYPE_FLOPPY: @@ -486,7 +486,7 @@ do_boot(u16 seq_nr) } // Boot Failure recovery: try the next device. -void VISIBLE32 +void VISIBLE32FLAT handle_18() { debug_serial_setup(); @@ -498,7 +498,7 @@ handle_18() } // INT 19h Boot Load Service Entry Point -void VISIBLE32 +void VISIBLE32FLAT handle_19() { debug_serial_setup(); diff --git a/src/farptr.h b/src/farptr.h index acc9d596..3cc41706 100644 --- a/src/farptr.h +++ b/src/farptr.h @@ -122,9 +122,9 @@ extern void __force_link_error__unknown_type(); #define MAKE_FLATPTR(seg,off) ((void*)(((u32)(seg)<<4)+(u32)(off))) -#if MODE16 == 1 +#if MODESEGMENT == 1 -// Definitions when in 16 bit mode. +// Definitions when using segmented mode. #define GET_FARVAR(seg, var) __GET_FARVAR((seg), (var)) #define SET_FARVAR(seg, var, val) __SET_FARVAR((seg), (var), (val)) #define GET_VAR(seg, var) __GET_VAR(seg, (var)) @@ -159,13 +159,9 @@ static inline void outsl_fl(u16 port, void *ptr_fl, u16 count) { outsl(port, (u32*)FLATPTR_TO_OFFSET(ptr_fl), count); } -extern void __force_link_error__only_in_32bit() __attribute__ ((noreturn)); -#define ASSERT16() do { } while (0) -#define ASSERT32() __force_link_error__only_in_32bit() - #else -// In 32-bit mode there is no need to mess with the segments. +// In 32-bit flat mode there is no need to mess with the segments. #define GET_FARVAR(seg, var) \ (*((typeof(&(var)))MAKE_FLATPTR((seg), &(var)))) #define SET_FARVAR(seg, var, val) \ @@ -184,10 +180,6 @@ extern void __force_link_error__only_in_32bit() __attribute__ ((noreturn)); #define outsw_fl(port, ptr_fl, count) outsw(port, ptr_fl, count) #define outsl_fl(port, ptr_fl, count) outsl(port, ptr_fl, count) -extern void __force_link_error__only_in_16bit() __attribute__ ((noreturn)); -#define ASSERT16() __force_link_error__only_in_16bit() -#define ASSERT32() do { } while (0) - #endif // Definition for common 16bit segment/offset pointers. diff --git a/src/output.c b/src/output.c index e49010da..3b0e0e7c 100644 --- a/src/output.c +++ b/src/output.c @@ -84,10 +84,10 @@ putc_debug(struct putcinfo *action, char c) debug_serial(c); } -// In 16bit mode just need a dummy variable (putc_debug is always used -// anyway), and in 32bit mode need a pointer to the 32bit instance of -// putc_debug(). -#if MODE16 +// In segmented mode just need a dummy variable (putc_debug is always +// used anyway), and in 32bit flat mode need a pointer to the 32bit +// instance of putc_debug(). +#if MODESEGMENT static struct putcinfo debuginfo VAR16; #else static struct putcinfo debuginfo = { putc_debug }; @@ -132,8 +132,8 @@ static struct putcinfo screeninfo = { putc_screen }; static void putc(struct putcinfo *action, char c) { - if (MODE16) { - // Only debugging output supported in 16bit mode. + if (MODESEGMENT) { + // Only debugging output supported in segmented mode. putc_debug(action, c); return; } @@ -325,7 +325,7 @@ panic(const char *fmt, ...) void __dprintf(const char *fmt, ...) { - if (!MODE16 && CONFIG_THREADS && CONFIG_DEBUG_LEVEL >= DEBUG_thread + if (!MODESEGMENT && CONFIG_THREADS && CONFIG_DEBUG_LEVEL >= DEBUG_thread && *fmt != '\\' && *fmt != '/') { struct thread_info *cur = getCurThread(); if (cur != &MainThread) { @@ -347,7 +347,7 @@ __dprintf(const char *fmt, ...) void printf(const char *fmt, ...) { - ASSERT32(); + ASSERT32FLAT(); va_list args; va_start(args, fmt); bvprintf(&screeninfo, fmt, args); @@ -382,7 +382,7 @@ putc_str(struct putcinfo *info, char c) int snprintf(char *str, size_t size, const char *fmt, ...) { - ASSERT32(); + ASSERT32FLAT(); if (!size) return 0; struct snprintfinfo sinfo = { { putc_str }, str, str + size }; @@ -11,7 +11,7 @@ #include "biosvar.h" // GET_BDA -#if MODE16 +#if MODESEGMENT // The 16bit pmm entry points runs in "big real" mode, and can // therefore read/write to the 32bit malloc variables. #define GET_PMMVAR(var) GET_FARVAR(0, (var)) @@ -26,11 +26,11 @@ struct zone_s { u32 top, bottom, cur; }; -struct zone_s ZoneLow VAR32VISIBLE, ZoneHigh VAR32VISIBLE; -struct zone_s ZoneFSeg VAR32VISIBLE; -struct zone_s ZoneTmpLow VAR32VISIBLE, ZoneTmpHigh VAR32VISIBLE; +struct zone_s ZoneLow VAR32FLATVISIBLE, ZoneHigh VAR32FLATVISIBLE; +struct zone_s ZoneFSeg VAR32FLATVISIBLE; +struct zone_s ZoneTmpLow VAR32FLATVISIBLE, ZoneTmpHigh VAR32FLATVISIBLE; -struct zone_s *Zones[] VAR32VISIBLE = { +struct zone_s *Zones[] VAR32FLATVISIBLE = { &ZoneTmpLow, &ZoneLow, &ZoneFSeg, &ZoneTmpHigh, &ZoneHigh }; @@ -49,7 +49,7 @@ relocate_ebda(u32 newebda, u32 oldebda, u8 ebda_size) return -1; // Do copy - if (MODE16) + if (MODESEGMENT) memcpy_far(FLATPTR_TO_SEG(newebda) , (void*)FLATPTR_TO_OFFSET(newebda) , FLATPTR_TO_SEG(oldebda) @@ -172,7 +172,7 @@ struct pmmalloc_s { struct pmmalloc_s *next; }; -struct pmmalloc_s *PMMAllocs VAR32VISIBLE; +struct pmmalloc_s *PMMAllocs VAR32FLATVISIBLE; // Allocate memory from the given zone and track it as a PMM allocation void * @@ -279,7 +279,7 @@ pmm_find(u32 handle) void malloc_setup() { - ASSERT32(); + ASSERT32FLAT(); dprintf(3, "malloc setup\n"); PMMAllocs = NULL; @@ -234,7 +234,7 @@ post() } // 32-bit entry point. -void VISIBLE32 +void VISIBLE32FLAT _start() { init_dma(); diff --git a/src/resume.c b/src/resume.c index 097bb6f3..59bb9019 100644 --- a/src/resume.c +++ b/src/resume.c @@ -93,8 +93,8 @@ handle_resume(u8 status) panic("Unimplemented shutdown status: %02x\n", status); } -#if MODE16==0 -void VISIBLE32 +#if MODESEGMENT == 0 +void VISIBLE32FLAT s3_resume() { if (!CONFIG_S3_RESUME) @@ -11,7 +11,7 @@ #include "ioport.h" // outb #include "pci_ids.h" // PCI_VENDOR_ID_INTEL -ASM32( +ASM32FLAT( ".global smm_relocation_start\n" ".global smm_relocation_end\n" ".global smm_code_start\n" @@ -8,7 +8,6 @@ #include "util.h" // dprintf #include "config.h" // CONFIG_* #include "cmos.h" // CMOS_BIOS_SMP_COUNT -#include "farptr.h" // ASSERT32 #include "paravirt.h" #define APIC_ICR_LOW ((u8*)BUILD_APIC_ADDR + 0x300) @@ -70,7 +69,7 @@ ASM16( void smp_probe(void) { - ASSERT32(); + ASSERT32FLAT(); u32 eax, ebx, ecx, cpuid_features; cpuid(1, &eax, &ebx, &ecx, &cpuid_features); if (! (cpuid_features & CPUID_APIC)) { diff --git a/src/stacks.c b/src/stacks.c index 56d17a1a..0ddb9a89 100644 --- a/src/stacks.c +++ b/src/stacks.c @@ -168,7 +168,7 @@ switch_next(struct thread_info *cur) void yield() { - if (MODE16 || !CONFIG_THREADS) { + if (MODESEGMENT || !CONFIG_THREADS) { // Just directly check irqs. check_irqs(); return; @@ -198,7 +198,7 @@ __end_thread(struct thread_info *old) void run_thread(void (*func)(void*), void *data) { - ASSERT32(); + ASSERT32FLAT(); if (! CONFIG_THREADS) goto fail; struct thread_info *thread; @@ -241,7 +241,7 @@ fail: void wait_threads() { - ASSERT32(); + ASSERT32FLAT(); if (! CONFIG_THREADS) return; while (MainThread.next != &MainThread) @@ -278,9 +278,9 @@ finish_preempt() } extern void yield_preempt(); -#if !MODE16 +#if MODESEGMENT == 0 // Try to execute 32bit threads. -void VISIBLE32 +void VISIBLE32FLAT yield_preempt() { PreemptCount++; diff --git a/src/types.h b/src/types.h index 8b9fbb12..b9786e25 100644 --- a/src/types.h +++ b/src/types.h @@ -38,8 +38,8 @@ union u64_u32_u { #if MODE16 == 1 // Notes a function as externally visible in the 16bit code chunk. # define VISIBLE16 __VISIBLE -// Notes a function as externally visible in the 32bit code chunk. -# define VISIBLE32 +// Notes a function as externally visible in the 32bit flat code chunk. +# define VISIBLE32FLAT // 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. @@ -49,21 +49,28 @@ union u64_u32_u { // Designate a variable at a specific 16bit address # define VAR16FIXED(addr) __aligned(1) __VISIBLE __section(".fixedaddr." __stringify(addr)) // Designate a 32bit variable also available in 16bit "big real" mode. -# define VAR32VISIBLE __section(".discard.var32." UNIQSEC) __VISIBLE __weak +# define VAR32FLATVISIBLE __section(".discard.var32flat." UNIQSEC) __VISIBLE __weak // Designate top-level assembler as 16bit only. # define ASM16(code) __ASM(code) -// Designate top-level assembler as 32bit only. -# define ASM32(code) +// Designate top-level assembler as 32bit flat only. +# define ASM32FLAT(code) +// Compile time check for a given mode. +extern void __force_link_error__only_in_32bit_flat() __attribute__ ((noreturn)); +#define ASSERT16() do { } while (0) +#define ASSERT32FLAT() __force_link_error__only_in_32bit_flat() #else # define VISIBLE16 -# define VISIBLE32 __VISIBLE +# define VISIBLE32FLAT __VISIBLE # define VAR16 __section(".discard.var16." UNIQSEC) # define VAR16VISIBLE VAR16 __VISIBLE __weak # define VAR16EXPORT VAR16VISIBLE # define VAR16FIXED(addr) VAR16VISIBLE -# define VAR32VISIBLE __VISIBLE +# define VAR32FLATVISIBLE __VISIBLE # define ASM16(code) -# define ASM32(code) __ASM(code) +# define ASM32FLAT(code) __ASM(code) +extern void __force_link_error__only_in_16bit() __attribute__ ((noreturn)); +#define ASSERT16() __force_link_error__only_in_16bit() +#define ASSERT32FLAT() do { } while (0) #endif #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) @@ -18,7 +18,7 @@ inline void call16(struct bregs *callregs) { - if (!MODE16 && getesp() > BUILD_STACK_ADDR) + if (!MODESEGMENT && getesp() > BUILD_STACK_ADDR) panic("call16 with invalid stack\n"); asm volatile( #if MODE16 == 1 @@ -36,7 +36,7 @@ call16(struct bregs *callregs) inline void call16big(struct bregs *callregs) { - ASSERT32(); + ASSERT32FLAT(); if (getesp() > BUILD_STACK_ADDR) panic("call16 with invalid stack\n"); asm volatile( @@ -49,7 +49,7 @@ call16big(struct bregs *callregs) inline void __call16_int(struct bregs *callregs, u16 offset) { - if (MODE16) + if (MODESEGMENT) callregs->code.seg = GET_SEG(CS); else callregs->code.seg = SEG_BIOS; @@ -197,7 +197,7 @@ memcpy_far(u16 d_seg, void *d_far, u16 s_seg, const void *s_far, size_t len) void * #undef memcpy memcpy(void *d1, const void *s1, size_t len) -#if MODE16 == 0 +#if MODESEGMENT == 0 #define memcpy __builtin_memcpy #endif { @@ -176,7 +176,7 @@ void *memset(void *s, int c, size_t n); inline void memcpy_far(u16 d_seg, void *d_far , u16 s_seg, const void *s_far, size_t len); void *memcpy(void *d1, const void *s1, size_t len); -#if MODE16 == 0 +#if MODESEGMENT == 0 #define memcpy __builtin_memcpy #endif void iomemcpy(void *d, const void *s, u32 len); |