Skip to content
Snippets Groups Projects
Commit a06c22d7 authored by Claudio Fontana's avatar Claudio Fontana Committed by Pekka Enberg
Browse files

loader: move x64-specific stuff from premain


move the arch-specific stuff in premain to
arch/x64/arch-setup.cc.

Introduce arch_init_premain() and arch_setup_tls().

arch_init_premain() is supposed to perform arch-specific
initialization before the common premain code is run.

arch_setup_tls() is run _after_ the common setup_tls code.

Reviewed-by: default avatarGlauber Costa <glommer@cloudius-systems.com>
Signed-off-by: default avatarClaudio Fontana <claudio.fontana@huawei.com>
Signed-off-by: default avatarPekka Enberg <penberg@cloudius-systems.com>
parent 16086d77
No related branches found
No related tags found
No related merge requests found
......@@ -10,6 +10,8 @@
#include <osv/mempool.hh>
#include <osv/mmu.hh>
#include "processor.hh"
#include "msr.hh"
#include "xen.hh"
#include <osv/elf.hh>
#include <osv/types.h>
#include <alloca.h>
......@@ -188,3 +190,19 @@ void arch_setup_free_memory()
mmu::free_initial_memory_range(ent.addr, ent.size);
});
}
void arch_setup_tls(thread_control_block *tcb)
{
processor::wrmsr(msr::IA32_FS_BASE, reinterpret_cast<uint64_t>(tcb));
}
static inline void disable_pic()
{
// PIC not present in Xen
XENPV_ALTERNATIVE({ processor::outb(0xff, 0x21); processor::outb(0xff, 0xa1); }, {});
}
void arch_init_premain()
{
disable_pic();
}
......@@ -8,6 +8,11 @@
#ifndef ARCH_SETUP_HH_
#define ARCH_SETUP_HH_
#include <osv/tls.hh>
void arch_init_premain();
void arch_setup_tls(thread_control_block *tcb);
void arch_setup_free_memory();
#endif /* ARCH_SETUP_HH_ */
......@@ -14,12 +14,10 @@
#include <cctype>
#include <osv/elf.hh>
#include <osv/tls.hh>
#include "msr.hh"
#include "exceptions.hh"
#include <osv/debug.hh>
#include "drivers/pci.hh"
#include "smp.hh"
#include "xen.hh"
#include "ioapic.hh"
#include "drivers/acpi.hh"
......@@ -36,6 +34,7 @@
#include "drivers/pvpanic.hh"
#include <osv/barrier.hh>
#include "arch.hh"
#include "arch-setup.hh"
#include "osv/trace.hh"
#include <osv/power.hh>
#include <osv/rcu.hh>
......@@ -72,7 +71,8 @@ void setup_tls(elf::init_table inittab)
memcpy(tcb0, inittab.tls.start, inittab.tls.size);
auto p = reinterpret_cast<thread_control_block*>(tcb0 + inittab.tls.size);
p->self = p;
processor::wrmsr(msr::IA32_FS_BASE, reinterpret_cast<uint64_t>(p));
arch_setup_tls(p);
}
extern "C" {
......@@ -82,16 +82,10 @@ extern "C" {
void ramdisk_init(void);
}
void disable_pic()
{
// PIC not present in Xen
XENPV_ALTERNATIVE({ outb(0xff, 0x21); outb(0xff, 0xa1); }, {});
}
void premain()
{
disable_pic();
arch_init_premain();
auto inittab = elf::get_init(elf_header);
setup_tls(inittab);
boot_time.event("TLS initialization");
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment