124 lines
2.9 KiB
C++
124 lines
2.9 KiB
C++
/*
|
|
* \brief Virtual Machine Monitor VM definition
|
|
* \author Stefan Kalkowski
|
|
* \author Martin Stein
|
|
* \date 2012-06-25
|
|
*/
|
|
|
|
/*
|
|
* Copyright (C) 2012-2017 Genode Labs GmbH
|
|
*
|
|
* This file is part of the Genode OS framework, which is distributed
|
|
* under the terms of the GNU Affero General Public License version 3.
|
|
*/
|
|
|
|
#ifndef _VM_BASE_H_
|
|
#define _VM_BASE_H_
|
|
|
|
/* Genode includes */
|
|
#include <dataspace/client.h>
|
|
#include <rom_session/connection.h>
|
|
#include <vm_session/connection.h>
|
|
#include <util/noncopyable.h>
|
|
#include <cpu/vm_state.h>
|
|
|
|
/* local includes */
|
|
#include <ram.h>
|
|
|
|
namespace Genode
|
|
{
|
|
class Board_revision;
|
|
class Vm_base;
|
|
class Machine_type;
|
|
}
|
|
|
|
struct Genode::Board_revision
|
|
{
|
|
unsigned long value;
|
|
|
|
explicit Board_revision(unsigned long value) : value(value) { }
|
|
};
|
|
|
|
|
|
struct Genode::Machine_type
|
|
{
|
|
unsigned long value;
|
|
|
|
explicit Machine_type(unsigned long value) : value(value) { }
|
|
};
|
|
|
|
|
|
class Genode::Vm_base : Noncopyable, Interface
|
|
{
|
|
public:
|
|
|
|
using Kernel_name = String<32>;
|
|
using Command_line = String<64>;
|
|
|
|
private:
|
|
|
|
Vm_base(Vm_base const &);
|
|
Vm_base &operator = (Vm_base const &);
|
|
|
|
protected:
|
|
|
|
Env &_env;
|
|
Kernel_name const &_kernel;
|
|
Command_line const &_cmdline;
|
|
off_t const _kernel_off;
|
|
Machine_type const _machine;
|
|
Board_revision const _board;
|
|
Ram const _ram;
|
|
Vm_connection _vm { _env };
|
|
Vm_session::Vcpu_id _vcpu_id;
|
|
Vm_state &_state { *(Vm_state*)_env.rm().attach(_vm.cpu_state(_vcpu_id)) };
|
|
|
|
void _load_kernel();
|
|
|
|
virtual void _load_kernel_surroundings() = 0;
|
|
virtual addr_t _board_info_offset() const = 0;
|
|
|
|
public:
|
|
|
|
struct Inject_irq_failed : Exception { };
|
|
struct Exception_handling_failed : Exception { };
|
|
|
|
Vm_base(Env &env,
|
|
Kernel_name const &kernel,
|
|
Command_line const &cmdline,
|
|
addr_t ram_base,
|
|
size_t ram_size,
|
|
off_t kernel_off,
|
|
Machine_type machine,
|
|
Board_revision board,
|
|
Allocator &alloc,
|
|
Vm_handler_base &handler);
|
|
|
|
void run() { _vm.run(_vcpu_id); }
|
|
void pause() { _vm.pause(_vcpu_id); }
|
|
|
|
void start();
|
|
void dump();
|
|
void inject_irq(unsigned irq);
|
|
addr_t va_to_pa(addr_t va);
|
|
|
|
Vm_state const &state() const { return _state; }
|
|
Ram const &ram() const { return _ram; }
|
|
|
|
addr_t smc_arg_0() { return _state.r0; }
|
|
addr_t smc_arg_1() { return _state.r1; }
|
|
addr_t smc_arg_2() { return _state.r2; }
|
|
addr_t smc_arg_3() { return _state.r3; }
|
|
addr_t smc_arg_4() { return _state.r4; }
|
|
addr_t smc_arg_5() { return _state.r5; }
|
|
addr_t smc_arg_6() { return _state.r6; }
|
|
addr_t smc_arg_7() { return _state.r7; }
|
|
addr_t smc_arg_8() { return _state.r8; }
|
|
addr_t smc_arg_9() { return _state.r9; }
|
|
|
|
void smc_ret(addr_t const ret_0) { _state.r0 = ret_0; }
|
|
void smc_ret(addr_t const ret_0, addr_t const ret_1);
|
|
};
|
|
|
|
#endif /* _VM_BASE_H_ */
|