IMPLEMENTATION [ia32,ux]:
+#include "mem_layout.h"
#include "tss.h"
PUBLIC static inline
PUBLIC static inline
Unsigned64
-Cpu::rdtsc (void)
+Cpu::rdtsc()
{
Unsigned64 tsc;
asm volatile ("rdtsc" : "=A" (tsc));
PUBLIC static inline
void
-Cpu::set_flags (Unsigned32 efl)
+Cpu::set_flags(Unsigned32 efl)
{ asm volatile ("pushl %0 ; popfl" : : "rm" (efl) : "memory"); }
IMPLEMENT inline NEEDS["tss.h"]
PUBLIC static inline
void
-Cpu:: set_cs ()
+Cpu:: set_cs()
{
asm volatile ("ljmp %0,$1f ; 1:"
: : "i"(Gdt::gdt_code_kernel | Gdt::Selector_kernel));
PUBLIC FIASCO_INIT_CPU
void
-Cpu::init_tss_dbf (Address tss_dbf_mem, Address kdir)
+Cpu::init_tss_dbf(Address tss_dbf_mem, Address kdir)
{
tss_dbf = reinterpret_cast<Tss*>(tss_dbf_mem);
- gdt->set_entry_byte (Gdt::gdt_tss_dbf/8, tss_dbf_mem, sizeof(Tss)-1,
- Gdt_entry::Access_kernel | Gdt_entry::Access_tss |
- Gdt_entry::Accessed, 0);
+ gdt->set_entry_byte(Gdt::gdt_tss_dbf/8, tss_dbf_mem, sizeof(Tss)-1,
+ Gdt_entry::Access_kernel | Gdt_entry::Access_tss |
+ Gdt_entry::Accessed, 0);
tss_dbf->_cs = Gdt::gdt_code_kernel;
tss_dbf->_ss = Gdt::gdt_data_kernel;
PUBLIC FIASCO_INIT_CPU
void
-Cpu::init_tss (Address tss_mem, size_t tss_size)
+Cpu::init_tss(Address tss_mem, size_t tss_size)
{
tss = reinterpret_cast<Tss*>(tss_mem);
- gdt->set_entry_byte (Gdt::gdt_tss/8, tss_mem, tss_size,
- Gdt_entry::Access_kernel | Gdt_entry::Access_tss, 0);
+ gdt->set_entry_byte(Gdt::gdt_tss/8, tss_mem, tss_size,
+ Gdt_entry::Access_kernel | Gdt_entry::Access_tss, 0);
tss->set_ss0(Gdt::gdt_data_kernel);
tss->_io_bit_map_offset = Mem_layout::Io_bitmap - tss_mem;
PUBLIC FIASCO_INIT_CPU
void
-Cpu::init_gdt (Address gdt_mem, Address user_max)
+Cpu::init_gdt(Address gdt_mem, Address user_max)
{
gdt = reinterpret_cast<Gdt*>(gdt_mem);
// cache line, respectively; pre-set all "accessed" flags so that
// the CPU doesn't need to do this later
- gdt->set_entry_4k (Gdt::gdt_code_kernel/8, 0, 0xffffffff,
- Gdt_entry::Access_kernel |
- Gdt_entry::Access_code_read |
- Gdt_entry::Accessed, Gdt_entry::Size_32);
- gdt->set_entry_4k (Gdt::gdt_data_kernel/8, 0, 0xffffffff,
- Gdt_entry::Access_kernel |
- Gdt_entry::Access_data_write |
- Gdt_entry::Accessed, Gdt_entry::Size_32);
- gdt->set_entry_4k (Gdt::gdt_code_user/8, 0, user_max,
- Gdt_entry::Access_user |
- Gdt_entry::Access_code_read |
- Gdt_entry::Accessed, Gdt_entry::Size_32);
- gdt->set_entry_4k (Gdt::gdt_data_user/8, 0, user_max,
- Gdt_entry::Access_user |
- Gdt_entry::Access_data_write |
- Gdt_entry::Accessed, Gdt_entry::Size_32);
+ gdt->set_entry_4k(Gdt::gdt_code_kernel/8, 0, 0xffffffff,
+ Gdt_entry::Access_kernel |
+ Gdt_entry::Access_code_read |
+ Gdt_entry::Accessed, Gdt_entry::Size_32);
+ gdt->set_entry_4k(Gdt::gdt_data_kernel/8, 0, 0xffffffff,
+ Gdt_entry::Access_kernel |
+ Gdt_entry::Access_data_write |
+ Gdt_entry::Accessed, Gdt_entry::Size_32);
+ gdt->set_entry_4k(Gdt::gdt_code_user/8, 0, user_max,
+ Gdt_entry::Access_user |
+ Gdt_entry::Access_code_read |
+ Gdt_entry::Accessed, Gdt_entry::Size_32);
+ gdt->set_entry_4k(Gdt::gdt_data_user/8, 0, user_max,
+ Gdt_entry::Access_user |
+ Gdt_entry::Access_data_write |
+ Gdt_entry::Accessed, Gdt_entry::Size_32);
}