diff options
| author | Michael Brown | 2007-01-12 04:14:15 +0100 |
|---|---|---|
| committer | Michael Brown | 2007-01-12 04:14:15 +0100 |
| commit | 1d313234b357f0b7dda57247158b7e2e1919a980 (patch) | |
| tree | e25991d10954f271d9db62a1f6709283ba85a929 /src/arch | |
| parent | Allow external code to update hidden memory regions. (diff) | |
| download | ipxe-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/arch')
| -rw-r--r-- | src/arch/i386/image/multiboot.c | 2 | ||||
| -rw-r--r-- | src/arch/i386/include/librm.h | 32 |
2 files changed, 31 insertions, 3 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 |
