view include/hvcalls/spe.h @ 0:42f240cc4bc6

From: 太田 篤志 <atoc@namikilab.tuat.ac.jp>
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Tue, 08 Sep 2009 13:44:18 +0900
parents
children
line wrap: on
line source

/**
 * hvcalls/spe.h
 * SPE 関連のハイパーバイザコール詰め合わせ
 */

#ifndef HVCALLS__SPE_H
#define HVCALLS__SPE_H

#include <asm/lv1call.h>
#include "common.h"


//--------------------------------------------------------------------------------------------- hvc_create_logical_spe()
/**
 * hvc_create_logical_spe (57:lv1_construct_logical_spe)
 * 論理 SPE を生成する
 *
 * @param  HVC_u64  vas_id        [IN]  仮想アドレス空間識別子
 * @param  HVC_u64 *spe_id        [OUT] 論理 SPE 識別子
 * @param  HVC_u64 *ls_addr       [OUT] LS がマップされた論理パーティションアドレス
 * @param  HVC_u64 *problem_addr  [OUT] プロブレムステート MMIO レジスタがマップされた
 *                                      論理パーティションアドレス
 * @param  HVC_u64 *priv2_addr    [OUT] 特権 2 MMIO レジスタがマップされた論理パーティションアドレス
 * @param  HVC_u64 *shadow_addr   [OUT] SPE レジスタシャドーエリアがマップされた
 *                                      論理パーティションアドレス
 * @return int                          0...成功, not 0...失敗
 * @static
 * @inline
 */
static inline int hvc_create_logical_spe (
	const HVC_u64        vas_id,
	      HVC_u64 *const spe_id,
	      HVC_u64 *const ls_addr,
	      HVC_u64 *const problem_addr,
	      HVC_u64 *const priv2_addr,
	      HVC_u64 *const shadow_addr
)
{
	HVC_u64 unused;
	const HVC_u64 ret =
		lv1_construct_logical_spe (
			PAGE_SHIFT,
			PAGE_SHIFT,
			PAGE_SHIFT,
			PAGE_SHIFT,
			PAGE_SHIFT,
			vas_id,
			0, //SPE_TYPE_LOGICAL
			priv2_addr,
			problem_addr,
			ls_addr,
			&unused,
			shadow_addr,
			spe_id
		);
	HVCALLS_PRINT_INFO("lv1_construct_logical_spe");
	if (ret)
	{
		HVCALLS_PRINT_ERR("lv1_construct_logical_spe FAILED.", ret);
	}
	else
	{
		HVCALLS_PRINT_VALUE_U64("        spe_id", *spe_id);
		HVCALLS_PRINT_VALUE_HEX("       ls_addr", *ls_addr);
		HVCALLS_PRINT_VALUE_HEX("  problem_addr", *problem_addr);
		HVCALLS_PRINT_VALUE_HEX("    priv2_addr", *priv2_addr);
		HVCALLS_PRINT_VALUE_HEX("   shadow_addr", *shadow_addr);
	}
	return (int)ret;
}

//--------------------------------------------------------------------------------------------- hvc_enable_logical_spe()
/**
 * hvc_enable_logical_spe (207:lv1_enable_logical_spe)
 * 論理 SPE を利用可能状態にする
 *
 * @param  HVC_u64 spe_id  [IN] 論理 SPE 識別子
 * @param  HVC_u64 res_id  [IN] 論理 SPE 予約識別子
 * @return int                  0...成功, not 0...失敗
 * @static
 * @inline
 */
static inline int hvc_enable_logical_spe(const HVC_u64 spe_id, const HVC_u64 res_id)
{
	const HVC_u64 ret = lv1_enable_logical_spe(spe_id, res_id);
	HVCALLS_PRINT_INFO     ("lv1_enable_logical_spe");
	HVCALLS_PRINT_VALUE_U64("  spe_id", spe_id);
	HVCALLS_PRINT_VALUE_U64("  res_id", res_id);
	if (ret) HVCALLS_PRINT_ERR("lv1_enable_logical_spe FAILED.", ret);
	return (int)ret;
}

//-------------------------------------------------------------------------------------------- hvc_disable_logical_spe()
/**
 * hvc_disable_logical_spe (65:lv1_disable_logical_spe)
 * 論理 SPE を利用不可能状態にする
 *
 * @param  HVC_u64 spe_id  [IN] 論理 SPE 識別子
 * @return int                  0...成功, not 0...失敗
 * @static
 * @inline
 */
static inline int hvc_disable_logical_spe(const HVC_u64 spe_id)
{
	const HVC_u64 ret = lv1_disable_logical_spe(spe_id, 0);
	HVCALLS_PRINT_INFO     ("lv1_disable_logical_spe");
	HVCALLS_PRINT_VALUE_U64("  spe_id", spe_id);
	if (ret) HVCALLS_PRINT_ERR("lv1_disable_logical_spe FAILED.", ret);
	return (int)ret;
}

//-------------------------------------------------------------------------------------------- hvc_destroy_logical_spe()
/**
 * hvc_destroy_logical_spe (54:lv1_destruct_logical_spe)
 * 論理 SPE を解放する
 *
 * @param  HVC_u64 spe_id  [IN] 論理 SPE 識別子
 * @return int                  0...成功, not 0...失敗
 * @static
 * @inline
 */
static inline int hvc_destroy_logical_spe(const HVC_u64 spe_id)
{
	const HVC_u64 ret = lv1_destruct_logical_spe(spe_id);
	HVCALLS_PRINT_INFO     ("lv1_destruct_logical_spe");
	HVCALLS_PRINT_VALUE_U64("  spe_id", spe_id);
	if (ret) HVCALLS_PRINT_ERR("lv1_destruct_logical_spe FAILED.", ret);
	return (int)ret;
}

//------------------------------------------------------------------------------------------ hvc_create_spe_irq_outlet()
/**
 * hvc_create_spe_irq_outlet (78:lv1_get_spe_irq_outlet)
 * 論理 SPE の IRQ アウトレットを生成する
 *
 * [Note] SPE IRQ アウトレットには解放するためのハイパーバイザコールがない。
 *        論理 SPE を解放すれば再びアウトレットを生成することができる。
 *
 * @param  HVC_u64  spe_id     [IN]  論理 SPE 識別子
 * @param  HVC_u64  irq_class  [IN]  割り込みクラス番号
 * @param  HVC_u64 *outlet     [OUT] IRQ アウトレット識別子
 * @return int                       0...成功, not 0...失敗
 * @static
 * @inline
 */
static inline int hvc_create_spe_irq_outlet (
	const HVC_u64        spe_id,
	const HVC_u64        irq_class,
	      HVC_u64 *const outlet
)
{
	const HVC_u64 ret = lv1_get_spe_irq_outlet(spe_id, irq_class, outlet);
	HVCALLS_PRINT_INFO("lv1_get_spe_irq_outlet");
	if (ret)
	{
		HVCALLS_PRINT_ERR("lv1_get_spe_irq_outlet FAILED.", ret);
	}
	else
	{
		HVCALLS_PRINT_VALUE_U64("     spe_id", spe_id);
		HVCALLS_PRINT_VALUE_U64("  irq_class", irq_class);
		HVCALLS_PRINT_VALUE_U64("     outlet", *outlet);
	}
	return (int)ret;
}

//----------------------------------------------------------------------------------------------- hvc_set_spe_int_mask()
/**
 * hvc_set_spe_int_mask (61:lv1_set_spe_interrupt_mask)
 * 論理 SPE に割り込みマスクを設定する
 *
 * [Note] この関数内で用いているハイパーバイザコール lv1_set_spe_interrupt_mask は、
 *        戻り値の詳細が不明であり、カーネルのソースコードでも戻り値は受け取っていない。
 *        おそらく 0...成功, not 0...失敗 だと思われるが、この関数の戻り値は void としている。
 *
 * @param  HVC_u64 spe_id     [IN] 論理 SPE 識別子
 * @param  HVC_u64 irq_class  [IN] 割り込みクラス番号
 * @param  HVC_u64 mask       [IN] 割り込みマスク
 * @return void
 * @static
 * @inline
 */
static inline void hvc_set_spe_int_mask (
	const HVC_u64 spe_id,
	const HVC_u64 irq_class,
	const HVC_u64 mask
)
{
	const HVC_u64 ret = lv1_set_spe_interrupt_mask(spe_id, irq_class, mask);
	HVCALLS_PRINT_INFO     ("lv1_set_spe_interrupt_mask");
	HVCALLS_PRINT_VALUE_U64("     spe_id", spe_id);
	HVCALLS_PRINT_VALUE_U64("  irq_class", irq_class);
	HVCALLS_PRINT_VALUE_HEX("       mask", mask);
	HVCALLS_PRINT_VALUE_S64("   (return)", ret);
}

//----------------------------------------------------------------------------------------------- hvc_get_spe_int_stat()
/**
 * hvc_get_spe_int_stat (67:lv1_get_spe_interrupt_status)
 * 論理 SPE の割り込み発生状況を取得する
 *
 * [Note] この関数内で用いているハイパーバイザコール lv1_get_spe_interrupt_status は、
 *        戻り値の詳細が不明であり、カーネルのソースコードでも戻り値は受け取っていない。
 *        動作結果から、おそらく 0...成功, not 0...失敗 だと思われるが、
 *        この関数の戻り値は void としている。
 *
 * @param  HVC_u64  spe_id     [IN]  論理 SPE 識別子
 * @param  HVC_u64  irq_class  [IN]  割り込みクラス番号
 * @param  HVC_u64 *status     [OUT] 割り込み発生状況
 * @return void
 * @static
 * @inline
 */
static inline void hvc_get_spe_int_stat (
	const HVC_u64        spe_id,
	const HVC_u64        irq_class,
	      HVC_u64 *const status
)
{
	const HVC_u64 ret = lv1_get_spe_interrupt_status(spe_id, irq_class, status);
	HVCALLS_PRINT_INFO     ("lv1_get_spe_interrupt_status");
	HVCALLS_PRINT_VALUE_U64("     spe_id", spe_id);
	HVCALLS_PRINT_VALUE_U64("  irq_class", irq_class);
	HVCALLS_PRINT_VALUE_HEX("     status", *status);
	HVCALLS_PRINT_VALUE_S64("   (return)", ret);
}

//--------------------------------------------------------------------------------------------- hvc_clear_spe_int_stat()
/**
 * hvc_clear_spe_int_stat (66:lv1_clear_spe_interrupt_status)
 * 論理 SPE の割り込みをクリアする (Acknowledge)
 *
 * [Note] この関数内で用いているハイパーバイザコール lv1_clear_spe_interrupt_status は、
 *        戻り値の詳細が不明であり、カーネルのソースコードでも戻り値は受け取っていない。
 *        おそらく 0...成功, not 0...失敗 だと思われるが、この関数の戻り値は void としている。
 *
 * @param  HVC_u64 spe_id     [IN] 論理 SPE 識別子
 * @param  HVC_u64 irq_class  [IN] 割り込みクラス番号
 * @param  HVC_u64 status     [IN] クリアする割り込み要因
 * @return void
 * @static
 * @inline
 */
static inline void hvc_clear_spe_int_stat (
	const HVC_u64 spe_id,
	const HVC_u64 irq_class,
	const HVC_u64 status
)
{
	const HVC_u64 ret = lv1_clear_spe_interrupt_status(spe_id, irq_class, status, 0);
	HVCALLS_PRINT_INFO     ("lv1_clear_spe_interrupt_status");
	HVCALLS_PRINT_VALUE_U64("     spe_id", spe_id);
	HVCALLS_PRINT_VALUE_U64("  irq_class", irq_class);
	HVCALLS_PRINT_VALUE_HEX("     status", status);
	HVCALLS_PRINT_VALUE_S64("   (return)", ret);
}


#endif /*HVCALLS__SPE_H*/