diff options
author | Kevin O'Connor <kevin@koconnor.net> | 2011-07-16 13:13:12 -0400 |
---|---|---|
committer | Kevin O'Connor <kevin@koconnor.net> | 2011-07-16 13:15:27 -0400 |
commit | 533b6286cbc5a01e8aaafc2a8393a7d109f81958 (patch) | |
tree | 5d051ff2edeb3f62b982d5fcc4761bf9dd5448e7 /src/pmm.c | |
parent | 77b8536e5c9908fbe99c88d01462a36a3deb05b1 (diff) | |
download | seabios-hppa-533b6286cbc5a01e8aaafc2a8393a7d109f81958.zip seabios-hppa-533b6286cbc5a01e8aaafc2a8393a7d109f81958.tar.gz seabios-hppa-533b6286cbc5a01e8aaafc2a8393a7d109f81958.tar.bz2 |
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.c | 51 |
1 files changed, 40 insertions, 11 deletions
@@ -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 |