#include <kernel/i386.h> //! Sets up a a code or data entry in the IA32 GDT or LDT /*! * \param item Pointer to a descriptor table entry * \param base Address of the base used for the descriptor * \param limit Size of the end of the code or data referenced by the * descriptor, minus one * \param access Access permissions applied to the descriptor * \param attribs Attributes applied to the descriptor */ void i386_set_descriptor(descriptor_t *item, dword base, dword limit, byte access, byte attribs) { item->base_l = base & 0xFFFF; item->base_m = (base >> 16) & 0xFF; item->base_h = base >> 24; item->limit = limit & 0xFFFF; item->attribs = attribs | ((limit >> 16) & 0x0F); item->access = access; } //! Sets up an interrupt, task or call gate in the IA32 IDT /*! * \param item Pointer to an IDT entry * \param selector The CS value referred to by the gate * \param offset The EIP value referred to by the gate * \param access Access permissions applied to the gate * \param attribs Attributes applied to the gate */ void i386_set_descriptor_int(descriptor_int_t *item, word selector, dword offset, byte access, byte param_cnt) { item->selector = selector; item->offset_l = offset & 0xFFFF; item->offset_h = offset >> 16; item->access = access; item->param_cnt = param_cnt; } addr_t i386_llmemcpy(addr_t dest, addr_t src, size_t size) { asm("cld ;" "repnz movsb %%gs:(%%esi),%%es:(%%edi)" : : "D" (dest), "S" (src), "c" (size)); return dest; }