Hi,

this patch merge the Vti and non-vti pal emulator.

Tested by booting domVTi+linux and domU.

Tristan.
# HG changeset patch
# User [EMAIL PROTECTED]
# Node ID e6a3e55dec70d7acb9f6a8cdc4b378c75341ddb4
# Parent  06ed19691f6d770eb9cbf2a9236f02f1d016da74
Merge VTi pal emulator with Xen pal emulator.
Xen/ia64 now has only one pal and one sal emulator.

Signed-off-by: Tristan Gingold <[EMAIL PROTECTED]>

diff -r 06ed19691f6d -r e6a3e55dec70 xen/arch/ia64/vmx/pal_emul.c
--- a/xen/arch/ia64/vmx/pal_emul.c	Tue Oct 17 15:49:05 2006 -0600
+++ b/xen/arch/ia64/vmx/pal_emul.c	Wed Oct 18 08:12:01 2006 +0200
@@ -17,509 +17,46 @@
  * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
  * Place - Suite 330, Boston, MA 02111-1307 USA.
  */
-
-#include <asm/vmx_vcpu.h>
+  
+#include <xen/lib.h>
+#include <asm/vcpu.h>
+#include <asm/dom_fw.h>
 #include <asm/pal.h>
 #include <asm/sal.h>
-#include <asm/dom_fw.h>
-#include <asm/tlb.h>
-#include <asm/vmx_mm_def.h>
-#include <xen/hypercall.h>
-#include <public/sched.h>
 
-/*
- * Handy macros to make sure that the PAL return values start out
- * as something meaningful.
- */
-#define INIT_PAL_STATUS_UNIMPLEMENTED(x)		\
-	{						\
-		x.status = PAL_STATUS_UNIMPLEMENTED;	\
-		x.v0 = 0;				\
-		x.v1 = 0;				\
-		x.v2 = 0;				\
-	}
-
-#define INIT_PAL_STATUS_SUCCESS(x)			\
-	{						\
-	       	x.status = PAL_STATUS_SUCCESS;		\
-		x.v0 = 0;				\
-		x.v1 = 0;				\
-		x.v2 = 0;				\
-	}
-
-static void
-get_pal_parameters(VCPU *vcpu, u64 *gr29, u64 *gr30, u64 *gr31) {
-
-	vcpu_get_gr_nat(vcpu,29,gr29);
-	vcpu_get_gr_nat(vcpu,30,gr30); 
-	vcpu_get_gr_nat(vcpu,31,gr31);
-}
-
-static void
-set_pal_result(VCPU *vcpu,struct ia64_pal_retval result) {
-
-	vcpu_set_gr(vcpu,8, result.status,0);
-	vcpu_set_gr(vcpu,9, result.v0,0);
-	vcpu_set_gr(vcpu,10, result.v1,0);
-	vcpu_set_gr(vcpu,11, result.v2,0);
-}
-
-static void
-set_sal_result(VCPU *vcpu,struct sal_ret_values result) {
-
-	vcpu_set_gr(vcpu,8, result.r8,0);
-	vcpu_set_gr(vcpu,9, result.r9,0);
-	vcpu_set_gr(vcpu,10, result.r10,0);
-	vcpu_set_gr(vcpu,11, result.r11,0);
-}
-
-static struct ia64_pal_retval
-pal_cache_flush(VCPU *vcpu) {
-	u64 gr28,gr29, gr30, gr31;
+void
+pal_emul(struct vcpu *vcpu)
+{
+	u64 gr28, gr29, gr30, gr31;
 	struct ia64_pal_retval result;
 
-	get_pal_parameters(vcpu, &gr29, &gr30, &gr31);
-	vcpu_get_gr_nat(vcpu, 28, &gr28);
+	vcpu_get_gr_nat(vcpu, 28, &gr28);  //bank1
 
-	/* Always call Host Pal in int=1 */
-	gr30 = gr30 & ~0x2UL;
+	/* FIXME: works only for static calling convention ?  */
+	vcpu_get_gr_nat(vcpu, 29, &gr29);
+	vcpu_get_gr_nat(vcpu, 30, &gr30); 
+	vcpu_get_gr_nat(vcpu, 31, &gr31);
 
-	/*
-	 * Call Host PAL cache flush
-	 * Clear psr.ic when call PAL_CACHE_FLUSH
-	 */
-	result = ia64_pal_call_static(gr28 ,gr29, gr30, gr31, 1);
+	perfc_incrc(vmx_pal_emul);
+	result = xen_pal_emulator (gr28, gr29, gr30, gr31);
 
-	/* If host PAL call is interrupted, then loop to complete it */
-//	while (result.status == 1)
-//		ia64_pal_call_static(gr28 ,gr29, gr30, result.v1, 1LL);
-//
-	if (result.status != 0)
-		panic_domain(vcpu_regs(vcpu), "PAL_CACHE_FLUSH ERROR, "
-		             "status %ld", result.status);
-
-	return result;
-}
-
-static struct ia64_pal_retval
-pal_vm_tr_read(VCPU *vcpu) {
-	struct ia64_pal_retval result;
-
-	INIT_PAL_STATUS_UNIMPLEMENTED(result);
-
-	return result;
-}
-
-static struct ia64_pal_retval
-pal_prefetch_visibility(VCPU *vcpu) {
-	/* Due to current MM virtualization algorithm,
-	 * We do not allow guest to change mapping attribute.
-	 * Thus we will not support PAL_PREFETCH_VISIBILITY
-	 */
-	struct ia64_pal_retval result;
-
-	INIT_PAL_STATUS_UNIMPLEMENTED(result);
-
-	return result;
-}
-
-static struct ia64_pal_retval
-pal_platform_addr(VCPU *vcpu) {
-	struct ia64_pal_retval result;
-
-	INIT_PAL_STATUS_SUCCESS(result);
-
-	return result;
-}
-
-static struct ia64_pal_retval
-pal_halt(VCPU *vcpu) {
-	//bugbug: to be implement. 
-	struct ia64_pal_retval result;
-
-	INIT_PAL_STATUS_UNIMPLEMENTED(result);
-
-	return result;
-}
-
-static struct ia64_pal_retval
-pal_halt_light(VCPU *vcpu) {
-	struct ia64_pal_retval result;
-	
-	if (!is_unmasked_irq(vcpu))
-		do_sched_op_compat(SCHEDOP_block, 0);
-	    
-	INIT_PAL_STATUS_SUCCESS(result);
-
-	return result;
-}
-
-static struct ia64_pal_retval
-pal_cache_read(VCPU *vcpu) {
-	struct ia64_pal_retval result;
-
-	INIT_PAL_STATUS_UNIMPLEMENTED(result);
-
-	return result;
-}
-
-static struct ia64_pal_retval
-pal_cache_write(VCPU *vcpu) {
-	struct ia64_pal_retval result;
-
-	INIT_PAL_STATUS_UNIMPLEMENTED(result);
-
-	return result;
-}
-
-static struct ia64_pal_retval
-pal_bus_get_features(VCPU *vcpu) {
-	struct ia64_pal_retval result;
-
-	INIT_PAL_STATUS_UNIMPLEMENTED(result);
-
-	return result;
-}
-
-static struct ia64_pal_retval
-pal_cache_summary(VCPU *vcpu) {
-	struct ia64_pal_retval result;
-
-	INIT_PAL_STATUS_UNIMPLEMENTED(result);
-
-	return result;
-}
-
-static struct ia64_pal_retval
-pal_cache_init(VCPU *vcpu) {
-	struct ia64_pal_retval result;
-
-	INIT_PAL_STATUS_SUCCESS(result);
-
-	return result;
-}
-
-static struct ia64_pal_retval
-pal_cache_info(VCPU *vcpu) {
-	struct ia64_pal_retval result;
-
-	INIT_PAL_STATUS_UNIMPLEMENTED(result);
-
-	return result;
-}
-
-static struct ia64_pal_retval
-pal_cache_prot_info(VCPU *vcpu) {
-	struct ia64_pal_retval result;
-
-	INIT_PAL_STATUS_UNIMPLEMENTED(result);
-
-	return result;
-}
-
-static struct ia64_pal_retval
-pal_mem_attrib(VCPU *vcpu) {
-	struct ia64_pal_retval result;
-
-	INIT_PAL_STATUS_UNIMPLEMENTED(result);
-
-	return result;
-}
-
-static struct ia64_pal_retval
-pal_debug_info(VCPU *vcpu) {
-	struct ia64_pal_retval result;
-
-	INIT_PAL_STATUS_UNIMPLEMENTED(result);
-
-	return result;
-}
-
-static struct ia64_pal_retval
-pal_fixed_addr(VCPU *vcpu) {
-	struct ia64_pal_retval result;
-
-	INIT_PAL_STATUS_UNIMPLEMENTED(result);
-
-	return result;
-}
-
-static struct ia64_pal_retval
-pal_freq_base(VCPU *vcpu) {
-	struct ia64_pal_retval result;
-	struct ia64_sal_retval isrv;
-
-	PAL_CALL(result,PAL_FREQ_BASE, 0, 0, 0);
-	/*
-	 * PAL_FREQ_BASE may not be implemented in some platforms,
-	 * call SAL instead.
-	 */
-	if (result.v0 == 0) {
-		SAL_CALL(isrv, SAL_FREQ_BASE, 
-		         SAL_FREQ_BASE_PLATFORM, 0, 0, 0, 0, 0, 0);
-		result.status = isrv.status;
-		result.v0 = isrv.v0;
-		result.v1 = result.v2 = 0;
-	}
-	return result;
-}
-
-static struct ia64_pal_retval
-pal_freq_ratios(VCPU *vcpu) {
-	struct ia64_pal_retval result;
-
-	PAL_CALL(result, PAL_FREQ_RATIOS, 0, 0, 0);
-	return result;
-}
-
-static struct ia64_pal_retval
-pal_halt_info(VCPU *vcpu) {
-	struct ia64_pal_retval result;
-
-	INIT_PAL_STATUS_UNIMPLEMENTED(result);
-
-	return result;
-}
-
-static struct ia64_pal_retval
-pal_logical_to_physica(VCPU *vcpu) {
-	struct ia64_pal_retval result;
-
-	INIT_PAL_STATUS_UNIMPLEMENTED(result);
-
-	return result;
-}
-
-static struct ia64_pal_retval
-pal_perf_mon_info(VCPU *vcpu) {
-	struct ia64_pal_retval result;
-
-	INIT_PAL_STATUS_UNIMPLEMENTED(result);
-
-	return result;
-}
-
-static struct ia64_pal_retval
-pal_proc_get_features(VCPU *vcpu) {
-	struct ia64_pal_retval result;
-
-	INIT_PAL_STATUS_UNIMPLEMENTED(result);
-
-	return result;
-}
-
-static struct ia64_pal_retval
-pal_ptce_info(VCPU *vcpu) {
-	struct ia64_pal_retval result;
-
-	INIT_PAL_STATUS_UNIMPLEMENTED(result);
-
-	return result;
-}
-
-static struct ia64_pal_retval
-pal_register_info(VCPU *vcpu) {
-	struct ia64_pal_retval result;
-
-	INIT_PAL_STATUS_UNIMPLEMENTED(result);
-
-	return result;
-}
-
-static struct ia64_pal_retval
-pal_rse_info(VCPU *vcpu) {
-	struct ia64_pal_retval result;
-
-	INIT_PAL_STATUS_UNIMPLEMENTED(result);
-
-	return result;
-}
-
-static struct ia64_pal_retval
-pal_test_info(VCPU *vcpu) {
-	struct ia64_pal_retval result;
-
-	INIT_PAL_STATUS_UNIMPLEMENTED(result);
-
-	return result;
-}
-
-static struct ia64_pal_retval
-pal_vm_summary(VCPU *vcpu) {
-	pal_vm_info_1_u_t vminfo1;
-	pal_vm_info_2_u_t vminfo2;	
-	struct ia64_pal_retval result;
-	
-	PAL_CALL(result, PAL_VM_SUMMARY, 0, 0, 0);
-	if (!result.status) {
-		vminfo1.pvi1_val = result.v0;
-		vminfo1.pal_vm_info_1_s.max_itr_entry = NITRS -1;
-		vminfo1.pal_vm_info_1_s.max_dtr_entry = NDTRS -1;
-		result.v0 = vminfo1.pvi1_val;
-		vminfo2.pal_vm_info_2_s.impl_va_msb = GUEST_IMPL_VA_MSB;
-		vminfo2.pal_vm_info_2_s.rid_size =
-		                             current->domain->arch.rid_bits;
-		result.v1 = vminfo2.pvi2_val;
-	} 
-	return result;
-}
-
-static struct ia64_pal_retval
-pal_vm_info(VCPU *vcpu) {
-	struct ia64_pal_retval result;
-
-	INIT_PAL_STATUS_UNIMPLEMENTED(result);
-
-	return result;
-}
-
-static struct ia64_pal_retval
-pal_vm_page_size(VCPU *vcpu) {
-	struct ia64_pal_retval result;
-
-	INIT_PAL_STATUS_UNIMPLEMENTED(result);
-
-	return result;
+	vcpu_set_gr(vcpu, 8, result.status, 0);
+	vcpu_set_gr(vcpu, 9, result.v0, 0);
+	vcpu_set_gr(vcpu, 10, result.v1, 0);
+	vcpu_set_gr(vcpu, 11, result.v2, 0);
 }
 
 void
-pal_emul(VCPU *vcpu) {
-	u64 gr28;
-	struct ia64_pal_retval result;
-
-	vcpu_get_gr_nat(vcpu,28,&gr28);  //bank1
-
-	perfc_incrc(vmx_pal_emul);
-	switch (gr28) {
-		case PAL_CACHE_FLUSH:
-			result = pal_cache_flush(vcpu);
-			break;
-
-		case PAL_PREFETCH_VISIBILITY:
-			result = pal_prefetch_visibility(vcpu);
-			break;
-
-		case PAL_VM_TR_READ:
-			result = pal_vm_tr_read(vcpu);
-			break;
-
-		case PAL_HALT:
-			result = pal_halt(vcpu);
-			break;
-
-		case PAL_HALT_LIGHT:
-			result = pal_halt_light(vcpu);
-			break;
-
-		case PAL_CACHE_READ:
-			result = pal_cache_read(vcpu);
-			break;
-
-		case PAL_CACHE_WRITE:
-			result = pal_cache_write(vcpu);
-			break;
-
-		case PAL_PLATFORM_ADDR:
-			result = pal_platform_addr(vcpu);
-			break;
-
-		case PAL_FREQ_RATIOS:
-			result = pal_freq_ratios(vcpu);
-			break;
-
-		case PAL_FREQ_BASE:
-			result = pal_freq_base(vcpu);
-			break;
-
-		case PAL_BUS_GET_FEATURES :
-			result = pal_bus_get_features(vcpu);
-			break;
-
-		case PAL_CACHE_SUMMARY :
-			result = pal_cache_summary(vcpu);
-			break;
-
-		case PAL_CACHE_INIT :
-			result = pal_cache_init(vcpu);
-			break;
-
-		case PAL_CACHE_INFO :
-			result = pal_cache_info(vcpu);
-			break;
-
-		case PAL_CACHE_PROT_INFO :
-			result = pal_cache_prot_info(vcpu);
-			break;
-
-		case PAL_MEM_ATTRIB :
-			result = pal_mem_attrib(vcpu);
-			break;
-
-		case PAL_DEBUG_INFO :
-			result = pal_debug_info(vcpu);
-			break;
-
-		case PAL_FIXED_ADDR :
-			result = pal_fixed_addr(vcpu);
-			break;
-
-		case PAL_HALT_INFO :
-			result = pal_halt_info(vcpu);
-			break;
-
-		case PAL_LOGICAL_TO_PHYSICAL :
-			result = pal_logical_to_physica(vcpu);
-			break;
-
-		case PAL_PERF_MON_INFO :
-			result = pal_perf_mon_info(vcpu);
-			break;
-
-		case  PAL_PROC_GET_FEATURES:
-			result = pal_proc_get_features(vcpu);
-			break;
-
-		case PAL_PTCE_INFO :
-			result = pal_ptce_info(vcpu);
-			break;
-
-		case PAL_REGISTER_INFO :
-			result = pal_register_info(vcpu);
-			break;
-
-		case PAL_RSE_INFO :
-			result = pal_rse_info(vcpu);
-			break;
-
-		case PAL_TEST_PROC :
-			result = pal_test_info(vcpu);
-			break;
-
-		case PAL_VM_SUMMARY :
-			result = pal_vm_summary(vcpu);
-			break;
-
-		case PAL_VM_INFO :
-			result = pal_vm_info(vcpu);
-			break;
-
-		case PAL_VM_PAGE_SIZE :
-			result = pal_vm_page_size(vcpu);
-			break;
-
-		default:
-			panic_domain(vcpu_regs(vcpu),"pal_emul(): guest "
-			             "call unsupported pal" );
-	}
-	set_pal_result(vcpu, result);
-}
-
-void
-sal_emul(VCPU *v) {
+sal_emul(struct vcpu *v)
+{
 	struct sal_ret_values result;
 	result = sal_emulator(vcpu_get_gr(v, 32), vcpu_get_gr(v, 33),
 	                      vcpu_get_gr(v, 34), vcpu_get_gr(v, 35),
 	                      vcpu_get_gr(v, 36), vcpu_get_gr(v, 37),
 	                      vcpu_get_gr(v, 38), vcpu_get_gr(v, 39));
-	set_sal_result(v, result);	
+
+	vcpu_set_gr(v, 8, result.r8, 0);
+	vcpu_set_gr(v, 9, result.r9, 0);
+	vcpu_set_gr(v, 10, result.r10, 0);
+	vcpu_set_gr(v, 11, result.r11, 0);
 }
diff -r 06ed19691f6d -r e6a3e55dec70 xen/arch/ia64/xen/fw_emul.c
--- a/xen/arch/ia64/xen/fw_emul.c	Tue Oct 17 15:49:05 2006 -0600
+++ b/xen/arch/ia64/xen/fw_emul.c	Wed Oct 18 08:12:01 2006 +0200
@@ -26,9 +26,11 @@
 #include <public/sched.h>
 #include "hpsim_ssc.h"
 #include <asm/vcpu.h>
+#include <asm/vmx_vcpu.h>
 #include <asm/dom_fw.h>
 #include <asm/uaccess.h>
 #include <xen/console.h>
+#include <xen/hypercall.h>
 
 extern unsigned long running_on_sim;
 
@@ -173,6 +175,10 @@ xen_pal_emulator(unsigned long index, u6
 		break;
 	    case PAL_FREQ_BASE:
 		status = ia64_pal_freq_base(&r9);
+		if (status == PAL_STATUS_UNIMPLEMENTED) {
+			status = ia64_sal_freq_base(0,&r9,&r10);
+			r10 = 0;
+		}
 		break;
 	    case PAL_PROC_GET_FEATURES:
 		status = ia64_pal_proc_get_features(&r9,&r10,&r11);
@@ -215,7 +221,7 @@ xen_pal_emulator(unsigned long index, u6
 	        {
 			/* Use xen-specific values.
 			   hash_tag_id is somewhat random! */
-			const pal_vm_info_1_u_t v1 =
+			static const pal_vm_info_1_u_t v1 =
 				{.pal_vm_info_1_s =
 				 { .vw = 1,
 				   .phys_add_size = 44,
@@ -232,11 +238,12 @@ xen_pal_emulator(unsigned long index, u6
 				   .num_tc_levels = 1
 #endif
 				 }};
-			const pal_vm_info_2_u_t v2 =
-				{ .pal_vm_info_2_s =
-				  { .impl_va_msb = 50,
-				    .rid_size = current->domain->arch.rid_bits,
-				    .reserved = 0 }};
+			pal_vm_info_2_u_t v2;
+			v2.pvi2_val = 0;
+			v2.pal_vm_info_2_s.rid_size =
+				current->domain->arch.rid_bits;
+			v2.pal_vm_info_2_s.impl_va_msb =
+				VMX_DOMAIN(current) ? GUEST_IMPL_VA_MSB : 50;
 			r9 = v1.pvi1_val;
 			r10 = v2.pvi2_val;
 			status = PAL_STATUS_SUCCESS;
@@ -294,9 +301,20 @@ xen_pal_emulator(unsigned long index, u6
 		status = ia64_pal_register_info(in1, &r9, &r10);
 		break;
 	    case PAL_CACHE_FLUSH:
-		/* FIXME */
-		printk("PAL_CACHE_FLUSH NOT IMPLEMENTED!\n");
-		BUG();
+		/* Always call Host Pal in int=0 */
+		in2 &= ~PAL_CACHE_FLUSH_CHK_INTRS;
+
+		/*
+		 * Call Host PAL cache flush
+		 * Clear psr.ic when call PAL_CACHE_FLUSH
+		 */
+		r10 = in3;
+		status = ia64_pal_cache_flush (in1, in2, &r10, &r9);
+
+		if (status != 0)
+			panic_domain(NULL, "PAL_CACHE_FLUSH ERROR, "
+				     "status %lx", status);
+
 		break;
 	    case PAL_PERF_MON_INFO:
 		{
@@ -343,15 +361,27 @@ xen_pal_emulator(unsigned long index, u6
 	        }
 		break;
 	    case PAL_HALT:
-		    if (current->domain == dom0) {
-			    printf ("Domain0 halts the machine\n");
-			    console_start_sync();
-			    (*efi.reset_system)(EFI_RESET_SHUTDOWN,0,0,NULL);
-		    }
-		    else
-			    domain_shutdown (current->domain,
-					     SHUTDOWN_poweroff);
-		    break;
+		if (current->domain == dom0) {
+			printf ("Domain0 halts the machine\n");
+			console_start_sync();
+			(*efi.reset_system)(EFI_RESET_SHUTDOWN,0,0,NULL);
+		}
+		else
+			domain_shutdown (current->domain,
+					 SHUTDOWN_poweroff);
+		break;
+	    case PAL_HALT_LIGHT:
+		if (VMX_DOMAIN(current)) {
+			/* Called by VTI.  */
+			if (!is_unmasked_irq(current))
+				do_sched_op_compat(SCHEDOP_block, 0);
+			status = PAL_STATUS_SUCCESS;
+		}
+		break;
+	    case PAL_PLATFORM_ADDR:
+		if (VMX_DOMAIN(current))
+			status = PAL_STATUS_SUCCESS;
+		break;
 	    default:
 		printk("xen_pal_emulator: UNIMPLEMENTED PAL CALL %lu!!!!\n",
 				index);
_______________________________________________
Xen-ia64-devel mailing list
Xen-ia64-devel@lists.xensource.com
http://lists.xensource.com/xen-ia64-devel

Reply via email to