#pragma once #include "../types.h" namespace Core { /*! \brief Protection Rings */ namespace Ring { /*! \brief Switch to Ring 3 * * \param stackpointer usermode stack pointer * \param kickoff pointer to function in user mode * \param kickoff_parameter put in register for 1. function parameter */ [[gnu::noreturn]] void switchToUsermode(void *stackpointer, void *kickoff, void *kickoff_parameter); /*! \brief Get current protection level * * \return current ring */ inline unsigned get() { unsigned cs; asm volatile("mov %%cs, %0\n\t" : "=r"(cs)::"memory"); return cs & 0b11; // last bits define the ring } } // namespace Ring } // namespace Core