summaryrefslogtreecommitdiff
path: root/src/pmm.c
diff options
context:
space:
mode:
authorKevin O'Connor <kevin@koconnor.net>2011-07-16 13:13:12 -0400
committerKevin O'Connor <kevin@koconnor.net>2011-07-16 13:15:27 -0400
commit533b6286cbc5a01e8aaafc2a8393a7d109f81958 (patch)
tree5d051ff2edeb3f62b982d5fcc4761bf9dd5448e7 /src/pmm.c
parent77b8536e5c9908fbe99c88d01462a36a3deb05b1 (diff)
downloadqemu-seabios-533b6286cbc5a01e8aaafc2a8393a7d109f81958.tar.gz
Run option rom visible PMM code in 32bit mode instead of 16bit mode.
Use call32() to jump into handle_pmm(). This reduces the amount of 16bit code needed. Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Diffstat (limited to 'src/pmm.c')
-rw-r--r--src/pmm.c51
1 files changed, 40 insertions, 11 deletions
diff --git a/src/pmm.c b/src/pmm.c
index e0770ac..2e9d1ff 100644
--- a/src/pmm.c
+++ b/src/pmm.c
@@ -44,13 +44,13 @@ struct zone_s {
struct allocinfo_s *info;
};
-struct zone_s ZoneLow VAR32FLATVISIBLE;
-struct zone_s ZoneHigh VAR32FLATVISIBLE;
-struct zone_s ZoneFSeg VAR32FLATVISIBLE;
-struct zone_s ZoneTmpLow VAR32FLATVISIBLE;
-struct zone_s ZoneTmpHigh VAR32FLATVISIBLE;
+struct zone_s ZoneLow;
+struct zone_s ZoneHigh;
+struct zone_s ZoneFSeg;
+struct zone_s ZoneTmpLow;
+struct zone_s ZoneTmpHigh;
-struct zone_s *Zones[] VAR32FLATVISIBLE = {
+struct zone_s *Zones[] = {
&ZoneTmpLow, &ZoneLow, &ZoneFSeg, &ZoneTmpHigh, &ZoneHigh
};
@@ -225,6 +225,22 @@ malloc_setup(void)
}
}
+// Update pointers after code relocation.
+void
+malloc_fixupreloc(void)
+{
+ ASSERT32FLAT();
+ if (!CONFIG_RELOCATE_INIT)
+ return;
+ dprintf(3, "malloc fixup reloc\n");
+
+ int i;
+ for (i=0; i<ARRAY_SIZE(Zones); i++) {
+ struct zone_s *zone = Zones[i];
+ zone->info->pprev = &zone->info;
+ }
+}
+
void
malloc_finalize(void)
{
@@ -542,7 +558,7 @@ handle_pmmXX(u16 *args)
return PMM_FUNCTION_NOT_SUPPORTED;
}
-u32 VISIBLE16
+u32 VISIBLE32INIT
handle_pmm(u16 *args)
{
if (! CONFIG_PMM)
@@ -551,12 +567,25 @@ handle_pmm(u16 *args)
u16 arg1 = args[0];
dprintf(DEBUG_HDL_pmm, "pmm call arg1=%x\n", arg1);
+ int oldpreempt;
+ if (CONFIG_THREAD_OPTIONROMS) {
+ // Not a preemption event - don't wait in wait_preempt()
+ oldpreempt = CanPreempt;
+ CanPreempt = 0;
+ }
+
+ u32 ret;
switch (arg1) {
- case 0x00: return handle_pmm00(args);
- case 0x01: return handle_pmm01(args);
- case 0x02: return handle_pmm02(args);
- default: return handle_pmmXX(args);
+ case 0x00: ret = handle_pmm00(args); break;
+ case 0x01: ret = handle_pmm01(args); break;
+ case 0x02: ret = handle_pmm02(args); break;
+ default: ret = handle_pmmXX(args); break;
}
+
+ if (CONFIG_THREAD_OPTIONROMS)
+ CanPreempt = oldpreempt;
+
+ return ret;
}
// romlayout.S