aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKevin O'Connor <kevin@koconnor.net>2009-12-26 23:32:57 -0500
committerKevin O'Connor <kevin@koconnor.net>2009-12-26 23:32:57 -0500
commit52a300f1c1ec2d9733d41ecd3ecaf78be48097b8 (patch)
treeaae0fd6884fd93440080f65144d3f7eab327e1b5 /src
parentfe2c3eece930e6d6e9f88e5d4d4ba4ccbe29f9fa (diff)
downloadseabios-hppa-52a300f1c1ec2d9733d41ecd3ecaf78be48097b8.zip
seabios-hppa-52a300f1c1ec2d9733d41ecd3ecaf78be48097b8.tar.gz
seabios-hppa-52a300f1c1ec2d9733d41ecd3ecaf78be48097b8.tar.bz2
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.h6
-rw-r--r--src/block.c2
-rw-r--r--src/boot.c4
-rw-r--r--src/farptr.h14
-rw-r--r--src/output.c18
-rw-r--r--src/pmm.c16
-rw-r--r--src/post.c2
-rw-r--r--src/resume.c4
-rw-r--r--src/smm.c2
-rw-r--r--src/smp.c3
-rw-r--r--src/stacks.c10
-rw-r--r--src/types.h23
-rw-r--r--src/util.c8
-rw-r--r--src/util.h2
14 files changed, 56 insertions, 58 deletions
diff --git a/src/biosvar.h b/src/biosvar.h
index aeebf0f..6a789e4 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 1fbfada..3fb5e91 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:
diff --git a/src/boot.c b/src/boot.c
index 05de715..c427c00 100644
--- a/src/boot.c
+++ b/src/boot.c
@@ -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 acc9d59..3cc4170 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 e49010d..3b0e0e7 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 };
diff --git a/src/pmm.c b/src/pmm.c
index 48a882a..a72167b 100644
--- a/src/pmm.c
+++ b/src/pmm.c
@@ -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;
diff --git a/src/post.c b/src/post.c
index f087a27..2f14aa7 100644
--- a/src/post.c
+++ b/src/post.c
@@ -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 097bb6f..59bb901 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)
diff --git a/src/smm.c b/src/smm.c
index 31e56d8..be2291b 100644
--- a/src/smm.c
+++ b/src/smm.c
@@ -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"
diff --git a/src/smp.c b/src/smp.c
index 00cf64b..913d3a2 100644
--- a/src/smp.c
+++ b/src/smp.c
@@ -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 56d17a1..0ddb9a8 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 8b9fbb1..b9786e2 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)
diff --git a/src/util.c b/src/util.c
index f5ae0e1..552f944 100644
--- a/src/util.c
+++ b/src/util.c
@@ -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
{
diff --git a/src/util.h b/src/util.h
index 24e39d1..7d95cbe 100644
--- a/src/util.h
+++ b/src/util.h
@@ -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);