Mercurial > hg > Game > Atoc
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*/