Add phys_to_user() and copy_user().
authorMichael Brown <mcb30@etherboot.org>
Thu, 11 Jan 2007 14:01:20 +0000 (14:01 +0000)
committerMichael Brown <mcb30@etherboot.org>
Thu, 11 Jan 2007 14:01:20 +0000 (14:01 +0000)
src/arch/i386/include/librm.h

index 3f2dbd5..7804e95 100644 (file)
@@ -120,7 +120,7 @@ typedef intptr_t userptr_t;
  */
 static inline __attribute__ (( always_inline )) void
 copy_to_user ( userptr_t buffer, off_t offset, const void *src, size_t len ) {
  */
 static inline __attribute__ (( always_inline )) void
 copy_to_user ( userptr_t buffer, off_t offset, const void *src, size_t len ) {
-       memcpy ( ( void * ) buffer + offset, src, len );
+       memcpy ( ( ( void * ) buffer + offset ), src, len );
 }
 
 /**
 }
 
 /**
@@ -133,7 +133,23 @@ copy_to_user ( userptr_t buffer, off_t offset, const void *src, size_t len ) {
  */
 static inline __attribute__ (( always_inline )) void
 copy_from_user ( void *dest, userptr_t buffer, off_t offset, size_t len ) {
  */
 static inline __attribute__ (( always_inline )) void
 copy_from_user ( void *dest, userptr_t buffer, off_t offset, size_t len ) {
-       memcpy ( dest, ( void * ) buffer + offset, len );
+       memcpy ( dest, ( ( void * ) buffer + offset ), len );
+}
+
+/**
+ * Copy data between user buffers
+ *
+ * @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
+copy_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 );
 }
 
 /**
 }
 
 /**
@@ -163,6 +179,17 @@ real_to_user ( unsigned int segment, unsigned int offset ) {
        return virt_to_user ( VIRTUAL ( segment, offset ) );
 }
 
        return virt_to_user ( VIRTUAL ( segment, offset ) );
 }
 
+/**
+ * Convert physical address to user buffer
+ *
+ * @v physical Physical address
+ * @ret buffer User buffer
+ */
+static inline __attribute__ (( always_inline )) userptr_t
+phys_to_user ( physaddr_t physical ) {
+       return virt_to_user ( phys_to_virt ( physical ) );
+}
+
 /* Copy to/from real-mode stack */
 extern uint16_t copy_to_rm_stack ( void *data, size_t size );
 extern void remove_from_rm_stack ( void *data, size_t size );
 /* Copy to/from real-mode stack */
 extern uint16_t copy_to_rm_stack ( void *data, size_t size );
 extern void remove_from_rm_stack ( void *data, size_t size );