librm_mgmt.c

Go to the documentation of this file.
00001 /*
00002  * librm: a library for interfacing to real-mode code
00003  *
00004  * Michael Brown <mbrown@fensystems.co.uk>
00005  *
00006  */
00007 
00008 FILE_LICENCE ( GPL2_OR_LATER );
00009 
00010 #include <stdint.h>
00011 #include <realmode.h>
00012 
00013 /*
00014  * This file provides functions for managing librm.
00015  *
00016  */
00017 
00018 /**
00019  * Allocate space on the real-mode stack and copy data there from a
00020  * user buffer
00021  *
00022  * @v data                      User buffer
00023  * @v size                      Size of stack data
00024  * @ret sp                      New value of real-mode stack pointer
00025  */
00026 uint16_t copy_user_to_rm_stack ( userptr_t data, size_t size ) {
00027         userptr_t rm_stack;
00028         rm_sp -= size;
00029         rm_stack = real_to_user ( rm_ss, rm_sp );
00030         memcpy_user ( rm_stack, 0, data, 0, size );
00031         return rm_sp;
00032 };
00033 
00034 /**
00035  * Deallocate space on the real-mode stack, optionally copying back
00036  * data to a user buffer.
00037  *
00038  * @v data                      User buffer
00039  * @v size                      Size of stack data
00040  */
00041 void remove_user_from_rm_stack ( userptr_t data, size_t size ) {
00042         if ( data ) {
00043                 userptr_t rm_stack = real_to_user ( rm_ss, rm_sp );
00044                 memcpy_user ( rm_stack, 0, data, 0, size );
00045         }
00046         rm_sp += size;
00047 };
00048 
00049 PROVIDE_UACCESS_INLINE ( librm, phys_to_user );
00050 PROVIDE_UACCESS_INLINE ( librm, user_to_phys );
00051 PROVIDE_UACCESS_INLINE ( librm, virt_to_user );
00052 PROVIDE_UACCESS_INLINE ( librm, user_to_virt );
00053 PROVIDE_UACCESS_INLINE ( librm, userptr_add );
00054 PROVIDE_UACCESS_INLINE ( librm, memcpy_user );
00055 PROVIDE_UACCESS_INLINE ( librm, memmove_user );
00056 PROVIDE_UACCESS_INLINE ( librm, memset_user );
00057 PROVIDE_UACCESS_INLINE ( librm, strlen_user );
00058 PROVIDE_UACCESS_INLINE ( librm, memchr_user );

Generated on Tue Apr 6 20:00:51 2010 for gPXE by  doxygen 1.5.7.1