# HG changeset patch
# User Alex Williamson <alex.williamson@xxxxxx>
# Date 1182466255 21600
# Node ID 6b1b119191f1c27daec93a11a9a387b85149c021
# Parent 593fe08cfca2783f6e42e9d7ed8abab2c3292aab
[IA64] More SN2 SAL calls that needs to be emulated.
Signed-off-by: Jes Sorensen <jes@xxxxxxx>
---
xen/arch/ia64/xen/fw_emul.c | 134 +++++++++++++++++++++++++++++++++++++++++---
1 files changed, 125 insertions(+), 9 deletions(-)
diff -r 593fe08cfca2 -r 6b1b119191f1 xen/arch/ia64/xen/fw_emul.c
--- a/xen/arch/ia64/xen/fw_emul.c Thu Jun 21 16:45:41 2007 -0600
+++ b/xen/arch/ia64/xen/fw_emul.c Thu Jun 21 16:50:55 2007 -0600
@@ -23,6 +23,7 @@
#include <asm/pal.h>
#include <asm/sal.h>
#include <asm/sn/sn_sal.h>
+#include <asm/sn/hubdev.h>
#include <asm/xenmca.h>
#include <public/sched.h>
@@ -380,7 +381,7 @@ sal_emulator (long index, unsigned long
case SN_SAL_GET_MASTER_NASID:
status = -1;
if (current->domain == dom0) {
- printk("*** Emulating SN_SAL_GET_MASTER_NASID ***\n");
+ /* printk("*** Emulating SN_SAL_GET_MASTER_NASID
***\n"); */
SAL_CALL_NOLOCK(ret_stuff, SN_SAL_GET_MASTER_NASID,
0, 0, 0, 0, 0, 0, 0);
status = ret_stuff.status;
@@ -392,7 +393,7 @@ sal_emulator (long index, unsigned long
case SN_SAL_GET_KLCONFIG_ADDR:
status = -1;
if (current->domain == dom0) {
- printk("*** Emulating SN_SAL_GET_KLCONFIG_ADDR ***\n");
+ /* printk("*** Emulating SN_SAL_GET_KLCONFIG_ADDR
***\n"); */
SAL_CALL_NOLOCK(ret_stuff, SN_SAL_GET_KLCONFIG_ADDR,
in1, 0, 0, 0, 0, 0, 0);
status = ret_stuff.status;
@@ -404,9 +405,9 @@ sal_emulator (long index, unsigned long
case SN_SAL_GET_SAPIC_INFO:
status = -1;
if (current->domain == dom0) {
- printk("*** Emulating SN_SAL_GET_SAPIC_INFO ***\n");
- SAL_CALL_NOLOCK(ret_stuff, SN_SAL_GET_SAPIC_INFO, in1,
- 0, 0, 0, 0, 0, 0);
+ /* printk("*** Emulating SN_SAL_GET_SAPIC_INFO ***\n");
*/
+ SAL_CALL_NOLOCK(ret_stuff, SN_SAL_GET_SAPIC_INFO,
+ in1, 0, 0, 0, 0, 0, 0);
status = ret_stuff.status;
r9 = ret_stuff.v0;
r10 = ret_stuff.v1;
@@ -416,9 +417,9 @@ sal_emulator (long index, unsigned long
case SN_SAL_GET_SN_INFO:
status = -1;
if (current->domain == dom0) {
- printk("*** Emulating SN_SAL_GET_SN_INFO ***\n");
- SAL_CALL_NOLOCK(ret_stuff, SN_SAL_GET_SN_INFO, in1,
- 0, 0, 0, 0, 0, 0);
+ /* printk("*** Emulating SN_SAL_GET_SN_INFO ***\n"); */
+ SAL_CALL_NOLOCK(ret_stuff, SN_SAL_GET_SN_INFO,
+ in1, 0, 0, 0, 0, 0, 0);
status = ret_stuff.status;
r9 = ret_stuff.v0;
r10 = ret_stuff.v1;
@@ -428,9 +429,124 @@ sal_emulator (long index, unsigned long
case SN_SAL_IOIF_GET_HUBDEV_INFO:
status = -1;
if (current->domain == dom0) {
- printk("*** Emulating SN_SAL_IOIF_GET_HUBDEV_INFO
***\n");
+ /* printk("*** Emulating SN_SAL_IOIF_GET_HUBDEV_INFO
***\n"); */
SAL_CALL_NOLOCK(ret_stuff, SN_SAL_IOIF_GET_HUBDEV_INFO,
in1, in2, 0, 0, 0, 0, 0);
+ status = ret_stuff.status;
+ r9 = ret_stuff.v0;
+ r10 = ret_stuff.v1;
+ r11 = ret_stuff.v2;
+ }
+ break;
+ case SN_SAL_IOIF_INIT:
+ status = -1;
+ if (current->domain == dom0) {
+ /* printk("*** Emulating SN_SAL_IOIF_INIT ***\n"); */
+ SAL_CALL_NOLOCK(ret_stuff, SN_SAL_IOIF_INIT,
+ 0, 0, 0, 0, 0, 0, 0);
+ status = ret_stuff.status;
+ r9 = ret_stuff.v0;
+ r10 = ret_stuff.v1;
+ r11 = ret_stuff.v2;
+ }
+ break;
+ case SN_SAL_GET_PROM_FEATURE_SET:
+ status = -1;
+ if (current->domain == dom0) {
+ /* printk("*** Emulating SN_SAL_GET_PROM_FEATURE_SET
***\n"); */
+ SAL_CALL_NOLOCK(ret_stuff, SN_SAL_GET_PROM_FEATURE_SET,
+ in1, 0, 0, 0, 0, 0, 0);
+ status = ret_stuff.status;
+ r9 = ret_stuff.v0;
+ r10 = ret_stuff.v1;
+ r11 = ret_stuff.v2;
+ }
+ break;
+ case SN_SAL_SET_OS_FEATURE_SET:
+ status = -1;
+ if (current->domain == dom0) {
+ /* printk("*** Emulating SN_SAL_SET_OS_FEATURE_SET
***\n"); */
+ SAL_CALL_NOLOCK(ret_stuff, SN_SAL_SET_OS_FEATURE_SET,
+ in1, 0, 0, 0, 0, 0, 0);
+ status = ret_stuff.status;
+ r9 = ret_stuff.v0;
+ r10 = ret_stuff.v1;
+ r11 = ret_stuff.v2;
+ }
+ break;
+ case SN_SAL_SET_ERROR_HANDLING_FEATURES:
+ status = -1;
+ if (current->domain == dom0) {
+ /* printk("*** Emulating
SN_SAL_SET_ERROR_HANDLING_FEATURES ***\n"); */
+ SAL_CALL_NOLOCK(ret_stuff,
+ SN_SAL_SET_ERROR_HANDLING_FEATURES,
+ in1, 0, 0, 0, 0, 0, 0);
+ status = ret_stuff.status;
+ r9 = ret_stuff.v0;
+ r10 = ret_stuff.v1;
+ r11 = ret_stuff.v2;
+ }
+ break;
+#if 0
+/*
+ * Somehow ACPI breaks if allowing this one
+ */
+ case SN_SAL_SET_CPU_NUMBER:
+ status = -1;
+ if (current->domain == dom0) {
+ printk("*** Emulating SN_SAL_SET_CPU_NUMBER ***\n");
+ SAL_CALL_NOLOCK(ret_stuff, SN_SAL_SET_CPU_NUMBER,
+ in1, 0, 0, 0, 0, 0, 0);
+ status = ret_stuff.status;
+ r9 = ret_stuff.v0;
+ r10 = ret_stuff.v1;
+ r11 = ret_stuff.v2;
+ }
+ break;
+#endif
+ case SN_SAL_LOG_CE:
+ status = -1;
+ if (current->domain == dom0) {
+ static int log_ce = 0;
+ if (!log_ce) {
+ printk("*** Emulating SN_SAL_LOG_CE *** "
+ " this will only be printed once\n");
+ log_ce = 1;
+ }
+ SAL_CALL_NOLOCK(ret_stuff, SN_SAL_LOG_CE,
+ 0, 0, 0, 0, 0, 0, 0);
+ status = ret_stuff.status;
+ r9 = ret_stuff.v0;
+ r10 = ret_stuff.v1;
+ r11 = ret_stuff.v2;
+ }
+ break;
+ case SN_SAL_IOIF_GET_DEVICE_DMAFLUSH_LIST:
+ status = -1;
+ if (current->domain == dom0) {
+ struct sn_flush_device_common flush;
+ int flush_size;
+
+ flush_size = sizeof(struct sn_flush_device_common);
+ memset(&flush, 0, flush_size);
+ SAL_CALL_NOLOCK(ret_stuff,
+ SN_SAL_IOIF_GET_DEVICE_DMAFLUSH_LIST,
+ in1, in2, in3, &flush, 0, 0, 0);
+#if 0
+ printk("*** Emulating "
+ "SN_SAL_IOIF_GET_DEVICE_DMAFLUSH_LIST ***\n");
+#endif
+ if (ret_stuff.status == SALRET_OK) {
+ XEN_GUEST_HANDLE(void) handle =
+ *(XEN_GUEST_HANDLE(void)*)&in4;
+ if (copy_to_guest(handle, &flush, 1)) {
+ printk("SN_SAL_IOIF_GET_DEVICE_"
+ "DMAFLUSH_LIST can't copy "
+ "to user!\n");
+ ret_stuff.status = SALRET_ERROR;
+ }
+ }
+
status = ret_stuff.status;
r9 = ret_stuff.v0;
r10 = ret_stuff.v1;
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|