diff options
-rw-r--r-- | src/boot.c | 2 | ||||
-rw-r--r-- | src/pcibios.c | 2 | ||||
-rw-r--r-- | src/system.c | 2 | ||||
-rw-r--r-- | src/util.c | 11 | ||||
-rw-r--r-- | src/util.h | 1 |
5 files changed, 14 insertions, 4 deletions
@@ -38,7 +38,7 @@ printf_bootdev(u16 bootdev) if (type == 4 && far_description != 0) { char description[33]; /* first 32 bytes are significant */ - memcpy(MAKE_FARPTR(GET_SEG(SS), &description), far_description, 32); + memcpy_far(MAKE_FARPTR(GET_SEG(SS), &description), far_description, 32); /* terminate string */ description[32] = 0; printf(" [%.s]", description); diff --git a/src/pcibios.c b/src/pcibios.c index 3823c2e..4e29a43 100644 --- a/src/pcibios.c +++ b/src/pcibios.c @@ -132,7 +132,7 @@ handle_1ab10e(struct bregs *regs) u16 destseg = GET_FARVAR(regs->es, *(u16*)(regs->di+4)); // Memcpy pir table slots to dest buffer. - memcpy(MAKE_FARPTR(destseg, d), pirtable_far, pirsize); + memcpy_far(MAKE_FARPTR(destseg, d), pirtable_far, pirsize); // XXX - bochs bios sets bx to (1 << 9) | (1 << 11) regs->bx = GET_FARPTR(pirtable_far->exclusive_irqs); diff --git a/src/system.c b/src/system.c index 2e19efa..04cd6ac 100644 --- a/src/system.c +++ b/src/system.c @@ -276,7 +276,7 @@ handle_15e820(struct bregs *regs) } struct e820entry *e = &((struct e820entry *)GET_EBDA(e820_loc))[regs->bx]; - memcpy(MAKE_FARPTR(regs->es, regs->di), e, sizeof(*e)); + memcpy_far(MAKE_FARPTR(regs->es, regs->di), e, sizeof(*e)); if (regs->bx == count-1) regs->ebx = 0; else @@ -53,7 +53,7 @@ memset(void *s, int c, size_t n) } void * -memcpy(void *far_d1, const void *far_s1, size_t len) +memcpy_far(void *far_d1, const void *far_s1, size_t len) { u8 *d = far_d1; u8 *s = (u8*)far_s1; @@ -68,6 +68,15 @@ memcpy(void *far_d1, const void *far_s1, size_t len) } void * +memcpy(void *d1, const void *s1, size_t len) +{ + u8 *d = (u8*)d1, *s = (u8*)s1; + while (len--) + *d++ = *s++; + return d1; +} + +void * memmove(void *d, const void *s, size_t len) { if (s >= d) @@ -60,6 +60,7 @@ static inline void cpuid(u32 index, u32 *eax, u32 *ebx, u32 *ecx, u32 *edx) void *memset(void *s, int c, size_t n); void *memcpy(void *d1, const void *s1, size_t len); +void *memcpy_far(void *far_d1, const void *far_s1, size_t len); void *memmove(void *d, const void *s, size_t len); struct bregs; |