1 /* 2 * librm: a library for interfacing to real-mode code 3 * 4 * Michael Brown <mbrown (at) fensystems.co.uk> 5 * 6 */ 7 8 FILE_LICENCE ( GPL2_OR_LATER ); 9 10 #include <stdint.h> 11 #include <realmode.h> 12 13 /* 14 * This file provides functions for managing librm. 15 * 16 */ 17 18 /** 19 * Allocate space on the real-mode stack and copy data there from a 20 * user buffer 21 * 22 * @v data User buffer 23 * @v size Size of stack data 24 * @ret sp New value of real-mode stack pointer 25 */ 26 uint16_t copy_user_to_rm_stack ( userptr_t data, size_t size ) { 27 userptr_t rm_stack; 28 rm_sp -= size; 29 rm_stack = real_to_user ( rm_ss, rm_sp ); 30 memcpy_user ( rm_stack, 0, data, 0, size ); 31 return rm_sp; 32 }; 33 34 /** 35 * Deallocate space on the real-mode stack, optionally copying back 36 * data to a user buffer. 37 * 38 * @v data User buffer 39 * @v size Size of stack data 40 */ 41 void remove_user_from_rm_stack ( userptr_t data, size_t size ) { 42 if ( data ) { 43 userptr_t rm_stack = real_to_user ( rm_ss, rm_sp ); 44 memcpy_user ( rm_stack, 0, data, 0, size ); 45 } 46 rm_sp += size; 47 }; 48 49 PROVIDE_UACCESS_INLINE ( librm, phys_to_user ); 50 PROVIDE_UACCESS_INLINE ( librm, user_to_phys ); 51 PROVIDE_UACCESS_INLINE ( librm, virt_to_user ); 52 PROVIDE_UACCESS_INLINE ( librm, user_to_virt ); 53 PROVIDE_UACCESS_INLINE ( librm, userptr_add ); 54 PROVIDE_UACCESS_INLINE ( librm, memcpy_user ); 55 PROVIDE_UACCESS_INLINE ( librm, memmove_user ); 56 PROVIDE_UACCESS_INLINE ( librm, memset_user ); 57 PROVIDE_UACCESS_INLINE ( librm, strlen_user ); 58 PROVIDE_UACCESS_INLINE ( librm, memchr_user ); 59