/* this file replaces all the inlines that are used on Linux systems */
#include "u.h"
#include "../port/lib.h"
#include "mem.h"
#include "dat.h"
#include "fns.h"
#include "io.h"
#include "ureg.h"
#include "pool.h"
#include "../xen/xen.h"
int gcc_call(int op);
int gcc_call_b(int op, unsigned long ebx);
int gcc_call_b_c(int op, unsigned long ebx, unsigned long ecx);
int gcc_call_b_c_d(int op, unsigned long ebx, unsigned long ecx,
unsigned long edx);
int gcc_call_b_c_d_S(int op, unsigned long ebx, unsigned long ecx,
unsigned long edx, unsigned long esi);
int gcc_call_b_c_d_S_D(int op, unsigned long ebx, unsigned long ecx,
unsigned long edx, unsigned long esi, unsigned long edi);
int gcc_call_b_S(int op, unsigned long ebx, unsigned long esi);
int HYPERVISOR_update_va_mapping(
unsigned long pte_physical, unsigned long new_val, unsigned long flags)
{
int ret;
void panic(char *, ...);
ret = gcc_call_b_c_d(
(__HYPERVISOR_update_va_mapping),
(pte_physical), (new_val), (flags) );
if ((ret < 0) )
panic("Failed update VA mapping: %08ulx, %08ulx, %08ulx, ret %d",
pte_physical, new_val, flags, ret);
return ret;
}
int HYPERVISOR_physdev_op(void *physdev_op)
{
int ret;
ret = gcc_call_b(
(__HYPERVISOR_physdev_op),
(unsigned long) (physdev_op) );
return ret;
}
#ifdef NOT
int HYPERVISOR_update_va_mapping_otherdomain(
unsigned long page_nr, unsigned long new_val,
unsigned long flags, domid_t domid)
{
int ret;
ret = gcc_call_b_c_d_S_D(
(__HYPERVISOR_update_va_mapping_otherdomain),
(page_nr), ((new_val)), (flags),
(domid.lo), (domid.hi)
);
return ret;
}
#endif
long HYPERVISOR_set_timer_op(uvlong timeout)
{
int ret;
unsigned long timeout_hi = (unsigned long)(timeout>>32);
unsigned long timeout_lo = (unsigned long)timeout;
ret = gcc_call_b_c(
(__HYPERVISOR_set_timer_op),
(timeout_hi), (timeout_lo) );
return ret;
}
int HYPERVISOR_dom0_op(dom0_op_t *dom0_op)
{
int ret;
dom0_op->interface_version = DOM0_INTERFACE_VERSION;
ret = gcc_call_b(
(__HYPERVISOR_dom0_op),
(unsigned long) (dom0_op) );
return ret;
}
#ifdef OOPSY
int HYPERVISOR_network_op(void *network_op)
{
int ret;
ret = gcc_call_b(
(__HYPERVISOR_network_op),
(unsigned long) (network_op) );
return ret;
}
int HYPERVISOR_block_io_op(void *block_io_op)
{
int ret;
ret = gcc_call_b(
(__HYPERVISOR_block_io_op),
(unsigned long) (block_io_op) );
return ret;
}
#endif
int HYPERVISOR_set_trap_table(trap_info_t *table)
{
int ret;
ret = gcc_call_b(
(__HYPERVISOR_set_trap_table),
(unsigned long) (table) );
return ret;
}
int HYPERVISOR_mmu_update(mmu_update_t *req,
int count,
int *success_count)
{
int ret;
ret = gcc_call_b_c_d(
(__HYPERVISOR_mmu_update),
(unsigned long) (req), (count), (unsigned long) (success_count) );
return ret;
}
int HYPERVISOR_set_gdt(unsigned long *frame_list, int entries)
{
int ret;
ret = gcc_call_b_c(
(__HYPERVISOR_set_gdt),
(unsigned long) (frame_list), (entries) );
return ret;
}
int HYPERVISOR_stack_switch(unsigned long ss, unsigned long esp)
{
int ret;
ret = gcc_call_b_c(
(__HYPERVISOR_stack_switch),
(ss), (esp) );
if (ret)
dp("stack switch failed !. ret %d\n", ret);
return ret;
}
int HYPERVISOR_set_callbacks(
unsigned long event_selector, unsigned long event_address,
unsigned long failsafe_selector, unsigned long failsafe_address)
{
int ret;
ret = gcc_call_b_c_d_S(
(__HYPERVISOR_set_callbacks),
(event_selector), (event_address),
(failsafe_selector), (failsafe_address) );
return ret;
}
#ifdef OOPSY
int HYPERVISOR_net_io_op(netop_t *op)
{
int ret;
ret = gcc_call_b(
(__HYPERVISOR_net_io_op),
(unsigned long) (op) );
return ret;
}
#endif
int HYPERVISOR_fpu_taskswitch(void)
{
int ret;
ret = gcc_call(
(__HYPERVISOR_fpu_taskswitch) );
return ret;
}
int HYPERVISOR_yield(void)
{
int ret;
ret = gcc_call_b(
(__HYPERVISOR_sched_op),
(SCHEDOP_yield) );
return ret;
}
int HYPERVISOR_block(void)
{
int ret;
ret = gcc_call_b(
(__HYPERVISOR_sched_op),
(SCHEDOP_block) );
return ret;
}
int HYPERVISOR_exit(void)
{
int ret;
ret = gcc_call_b(
(__HYPERVISOR_sched_op),
(SCHEDOP_shutdown) );
return ret;
}
int HYPERVISOR_stop(unsigned long srec)
{
int ret;
/* NB. On suspend, control software expects a suspend record in %esi. */
ret = gcc_call_b_S(
(__HYPERVISOR_sched_op),
(SCHEDOP_shutdown), (srec) );
return ret;
}
int HYPERVISOR_set_debugreg(int reg, unsigned long value)
{
int ret;
ret = gcc_call_b_c(
(__HYPERVISOR_set_debugreg),
(reg), (value) );
return ret;
}
unsigned long HYPERVISOR_get_debugreg(int reg)
{
unsigned long ret;
ret = gcc_call_b(
(__HYPERVISOR_get_debugreg),
(reg) );
return ret;
}
int HYPERVISOR_update_descriptor(
unsigned long pa, unsigned long word1, unsigned long word2)
{
int ret;
ret = gcc_call_b_c_d(
(__HYPERVISOR_update_descriptor),
(pa), (word1), (word2) );
return ret;
}
int HYPERVISOR_set_fast_trap(int idx)
{
int ret;
ret = gcc_call_b(
(__HYPERVISOR_set_fast_trap),
(idx) );
return ret;
}
int HYPERVISOR_dom_mem_op(int op,
unsigned long *extent_list,
unsigned long num_extents,
unsigned int order)
{
int ret;
/*
dp("dom_mem_op: op %d, list %p, num %d, order %d\n",
op, extent_list, num_extents, order);
*/
ret = gcc_call_b_c_d_S_D(
(__HYPERVISOR_dom_mem_op),
op,
(unsigned long) extent_list,
num_extents, order,
DOMID_SELF );
/* dp("ret is %d\n", ret);*/
return ret;
}
int HYPERVISOR_multicall(void *call_list, int nr_calls)
{
int ret;
ret = gcc_call_b_c(
(__HYPERVISOR_multicall),
(unsigned long) (call_list), (nr_calls) );
return ret;
}
#ifdef OOPSY
long HYPERVISOR_kbd_op(unsigned char op, unsigned char val)
{
int ret;
ret = gcc_call_b_c(
(__HYPERVISOR_kbd_op),
(op), (val) );
return ret;
}
#endif
int HYPERVISOR_event_channel_op(void *op)
{
int ret;
// dp("event channel op\n");
ret = gcc_call_b(
(__HYPERVISOR_event_channel_op),
(unsigned long) (op) );
// dp("event channel op ret %d\n", ret);
return ret;
}
int HYPERVISOR_xen_version(int cmd)
{
int ret;
ret = gcc_call_b(
(__HYPERVISOR_xen_version),
(cmd) );
return ret;
}
int HYPERVISOR_console_io(int cmd, int count, char *str)
{
int ret;
ret = gcc_call_b_c_d(
(__HYPERVISOR_console_io),
(cmd), (count), (unsigned long)(str) );
return ret;
}
|