# HG changeset patch # User gingold@virtu10 # 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 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 + +#include +#include +#include #include #include -#include -#include -#include -#include -#include -/* - * 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 #include "hpsim_ssc.h" #include +#include #include #include #include +#include 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);