summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMichael Brown2007-01-12 04:14:15 +0100
committerMichael Brown2007-01-12 04:14:15 +0100
commit1d313234b357f0b7dda57247158b7e2e1919a980 (patch)
treee25991d10954f271d9db62a1f6709283ba85a929 /src
parentAllow external code to update hidden memory regions. (diff)
downloadipxe-1d313234b357f0b7dda57247158b7e2e1919a980.tar.gz
ipxe-1d313234b357f0b7dda57247158b7e2e1919a980.tar.xz
ipxe-1d313234b357f0b7dda57247158b7e2e1919a980.zip
Rename copy_user() to memcpy_user(). Add memmove_user() and
userptr_add().
Diffstat (limited to 'src')
-rw-r--r--src/arch/i386/image/multiboot.c2
-rw-r--r--src/arch/i386/include/librm.h32
-rw-r--r--src/image/elf.c2
3 files changed, 32 insertions, 4 deletions
diff --git a/src/arch/i386/image/multiboot.c b/src/arch/i386/image/multiboot.c
index b9fb16396..f27f22807 100644
--- a/src/arch/i386/image/multiboot.c
+++ b/src/arch/i386/image/multiboot.c
@@ -255,7 +255,7 @@ static int multiboot_load_raw ( struct image *image,
}
/* Copy image to segment */
- copy_user ( buffer, 0, image->data, offset, filesz );
+ memcpy_user ( buffer, 0, image->data, offset, filesz );
/* Record execution entry point */
image->entry = hdr->mb.entry_addr;
diff --git a/src/arch/i386/include/librm.h b/src/arch/i386/include/librm.h
index 19966c6db..859249e46 100644
--- a/src/arch/i386/include/librm.h
+++ b/src/arch/i386/include/librm.h
@@ -111,6 +111,18 @@ copy_from_real_librm ( void *dest, unsigned int src_seg,
typedef intptr_t userptr_t;
/**
+ * Add offset to user pointer
+ *
+ * @v ptr User pointer
+ * @v offset Offset
+ * @ret new_ptr New pointer value
+ */
+static inline __attribute__ (( always_inline )) userptr_t
+userptr_add ( userptr_t ptr, off_t offset ) {
+ return ( ptr + offset );
+}
+
+/**
* Copy data to user buffer
*
* @v buffer User buffer
@@ -146,13 +158,29 @@ copy_from_user ( void *dest, userptr_t buffer, off_t offset, size_t len ) {
* @v len Length
*/
static inline __attribute__ (( always_inline )) void
-copy_user ( userptr_t dest, off_t dest_off, userptr_t src, off_t src_off,
- size_t len ) {
+memcpy_user ( userptr_t dest, off_t dest_off, userptr_t src, off_t src_off,
+ size_t len ) {
memcpy ( ( ( void * ) dest + dest_off ), ( ( void * ) src + src_off ),
len );
}
/**
+ * Copy data between user buffers, allowing for overlap
+ *
+ * @v dest Destination user buffer
+ * @v dest_off Offset within destination buffer
+ * @v src Source user buffer
+ * @v src_off Offset within source buffer
+ * @v len Length
+ */
+static inline __attribute__ (( always_inline )) void
+memmove_user ( userptr_t dest, off_t dest_off, userptr_t src, off_t src_off,
+ size_t len ) {
+ memmove ( ( ( void * ) dest + dest_off ), ( ( void * ) src + src_off ),
+ len );
+}
+
+/**
* Fill user buffer with a constant byte
*
* @v buffer User buffer
diff --git a/src/image/elf.c b/src/image/elf.c
index 9dc08675a..869be3f33 100644
--- a/src/image/elf.c
+++ b/src/image/elf.c
@@ -94,7 +94,7 @@ static int elf_load_segment ( struct image *image, Elf_Phdr *phdr ) {
}
/* Copy image to segment */
- copy_user ( buffer, 0, image->data, phdr->p_offset, phdr->p_filesz );
+ memcpy_user ( buffer, 0, image->data, phdr->p_offset, phdr->p_filesz );
return 0;
}