diff options
author | Kevin O'Connor <kevin@koconnor.net> | 2010-06-06 16:11:45 -0400 |
---|---|---|
committer | Kevin O'Connor <kevin@koconnor.net> | 2010-06-06 16:11:45 -0400 |
commit | 8f59aa38ba522f63824552a15afc363e2d231fc1 (patch) | |
tree | 25402d0272bd1aa772de24b199ff7ab0e02f75df | |
parent | 42a1d4cdb09535d9c5880880af6a17d6741377a6 (diff) | |
download | seabios-8f59aa38ba522f63824552a15afc363e2d231fc1.tar.gz |
Introduce memcpy_fl - a memcpy on "flat" pointers.
-rw-r--r-- | src/pmm.c | 20 | ||||
-rw-r--r-- | src/util.c | 11 | ||||
-rw-r--r-- | src/util.h | 1 |
3 files changed, 17 insertions, 15 deletions
@@ -121,7 +121,6 @@ addSpace(struct zone_s *zone, void *start, void *end) tempdetail.datainfo.pprev = pprev; tempdetail.datainfo.data = tempdetail.datainfo.dataend = start; tempdetail.datainfo.allocend = end; - tempdetail.handle = PMM_DEFAULT_HANDLE; struct allocdetail_s *tempdetailp = MAKE_FLATPTR(GET_SEG(SS), &tempdetail); SET_PMMVAR(*pprev, &tempdetailp->datainfo); if (info) @@ -144,11 +143,8 @@ addSpace(struct zone_s *zone, void *start, void *end) } // Replace temp alloc space with final alloc space - SET_PMMVAR(detail->datainfo.next, tempdetail.datainfo.next); - SET_PMMVAR(detail->datainfo.pprev, tempdetail.datainfo.pprev); - SET_PMMVAR(detail->datainfo.data, tempdetail.datainfo.data); - SET_PMMVAR(detail->datainfo.dataend, tempdetail.datainfo.dataend); - SET_PMMVAR(detail->datainfo.allocend, tempdetail.datainfo.allocend); + memcpy_fl(&detail->datainfo, &tempdetailp->datainfo + , sizeof(detail->datainfo)); SET_PMMVAR(detail->handle, PMM_DEFAULT_HANDLE); SET_PMMVAR(*tempdetail.datainfo.pprev, &detail->datainfo); @@ -275,15 +271,9 @@ relocate_ebda(u32 newebda, u32 oldebda, u8 ebda_size) // EBDA isn't at end of ram - give up. return -1; - // Do copy - if (MODESEGMENT) - memcpy_far(FLATPTR_TO_SEG(newebda) - , (void*)FLATPTR_TO_OFFSET(newebda) - , FLATPTR_TO_SEG(oldebda) - , (void*)FLATPTR_TO_OFFSET(oldebda) - , ebda_size * 1024); - else - memmove((void*)newebda, (void*)oldebda, ebda_size * 1024); + // Do copy (this assumes memcpy copies forward - otherwise memmove + // is needed) + memcpy_fl((void*)newebda, (void*)oldebda, ebda_size * 1024); // Update indexes dprintf(1, "ebda moved from %x to %x\n", oldebda, newebda); @@ -165,6 +165,17 @@ memcpy_far(u16 d_seg, void *d_far, u16 s_seg, const void *s_far, size_t len) : "cc", "memory"); } +inline void +memcpy_fl(void *d_fl, const void *s_fl, size_t len) +{ + if (MODESEGMENT) + memcpy_far(FLATPTR_TO_SEG(d_fl), (void*)FLATPTR_TO_OFFSET(d_fl) + , FLATPTR_TO_SEG(s_fl), (void*)FLATPTR_TO_OFFSET(s_fl) + , len); + else + memcpy(d_fl, s_fl, len); +} + void * #undef memcpy memcpy(void *d1, const void *s1, size_t len) @@ -186,6 +186,7 @@ inline void memset16_far(u16 d_seg, void *d_far, u16 c, size_t len); 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_fl(void *d_fl, const void *s_fl, size_t len); void *memcpy(void *d1, const void *s1, size_t len); #if MODESEGMENT == 0 #define memcpy __builtin_memcpy |