/* * Copy data from kernel memory into a user buffer. * Params: * destInUser - address of user buffer * srcInKernel - address of kernel buffer * bufSize - number of bytes to copy * * Returns: * true if successful, false if user buffer is invalid (i.e., * doesn't correspond to memory the process has a right to * access) */ bool Copy_To_User(ulong_t destInUser, void *srcInKernel, ulong_t bufSize) { struct User_Context *current = g_currentThread->userContext; if (!Validate_User_Memory(current, destInUser, bufSize)) return false; memcpy(User_To_Kernel(current, destInUser), srcInKernel, bufSize); return true; }
/* * Copy data from kernel memory into a user buffer. * Params: * destInUser - address of user buffer * srcInKernel - address of kernel buffer * bufSize - number of bytes to copy * * Returns: * true if successful, false if user buffer is invalid (i.e., * doesn't correspond to memory the process has a right to * access) */ bool Copy_To_User(ulong_t destInUser, void* srcInKernel, ulong_t bufSize) { if(Validate_User_Memory(g_currentThread->userContext, destInUser, bufSize)){ memcpy( (char*)(g_currentThread->userContext)->memory + destInUser, srcInKernel, bufSize ); return true; }else{ return false; } }
/* * Copy data from user memory into a kernel buffer. * Params: * destInKernel - address of kernel buffer * srcInUser - address of user buffer * bufSize - number of bytes to copy * * Returns: * true if successful, false if user buffer is invalid (i.e., * doesn't correspond to memory the process has a right to * access) */ bool Copy_From_User(void* destInKernel, ulong_t srcInUser, ulong_t bufSize) { /* * Hints: * - the User_Context of the current process can be found * from g_currentThread->userContext * - the user address is an index relative to the chunk * of memory you allocated for it * - make sure the user buffer lies entirely in memory belonging * to the process */ TODO("Copy memory from user buffer to kernel buffer"); Validate_User_Memory(NULL,0,0); /* delete this; keeps gcc happy */ }
/* * Copy data from user memory into a kernel buffer. * Params: * destInKernel - address of kernel buffer * srcInUser - address of user buffer * bufSize - number of bytes to copy * * Returns: * true if successful, false if user buffer is invalid (i.e., * doesn't correspond to memory the process has a right to * access) */ bool Copy_From_User(void* destInKernel, ulong_t srcInUser, ulong_t bufSize) { /* * Hints: * TODO * * - the User_Context of the current process can be found * from g_currentThread->userContext * - the user address is an index relative to the chunk * of memory you allocated for it * - make sure the user buffer lies entirely in memory belonging * to the process */ if(Validate_User_Memory(g_currentThread->userContext, srcInUser, bufSize)){ memcpy(destInKernel, (char*)(g_currentThread->userContext)->memory + srcInUser, bufSize ); return true; }else{ return false; } }