📄 entry.s
字号:
movb %cl,TRAPBOUNCE_flags(%rdx) call compat_create_bounce_frame jmp compat_test_all_events2: movl $TRAP_gp_fault,UREGS_entry_vector(%rsp) movq VCPU_gp_fault_addr(%rbx),%rax movzwl VCPU_gp_fault_sel(%rbx),%esi movb $(TBF_EXCEPTION|TBF_EXCEPTION_ERRCODE|TBF_INTERRUPT),%cl movl $0,TRAPBOUNCE_error_code(%rdx) jmp 1bENTRY(compat_sysenter) cmpl $TRAP_gp_fault,UREGS_entry_vector(%rsp) movzwl VCPU_sysenter_sel(%rbx),%eax movzwl VCPU_gp_fault_sel(%rbx),%ecx cmovel %ecx,%eax testl $~3,%eax movl $FLAT_COMPAT_USER_SS,UREGS_ss(%rsp) cmovzl %ecx,%eax movw %ax,TRAPBOUNCE_cs(%rdx) call compat_create_bounce_frame jmp compat_test_all_eventsENTRY(compat_int80_direct_trap) call compat_create_bounce_frame jmp compat_test_all_events/* CREATE A BASIC EXCEPTION FRAME ON GUEST OS (RING-1) STACK: *//* {[ERRCODE,] EIP, CS, EFLAGS, [ESP, SS]} *//* %rdx: trap_bounce, %rbx: struct vcpu *//* On return only %rbx and %rdx are guaranteed non-clobbered. */compat_create_bounce_frame: ASSERT_INTERRUPTS_ENABLED mov %fs,%edi testb $2,UREGS_cs+8(%rsp) jz 1f /* Push new frame at registered guest-OS stack base. */ movl VCPU_kernel_sp(%rbx),%esi.Lft1: mov VCPU_kernel_ss(%rbx),%fs subl $2*4,%esi movl UREGS_rsp+8(%rsp),%eax.Lft2: movl %eax,%fs:(%rsi) movl UREGS_ss+8(%rsp),%eax.Lft3: movl %eax,%fs:4(%rsi) jmp 2f1: /* In kernel context already: push new frame at existing %rsp. */ movl UREGS_rsp+8(%rsp),%esi.Lft4: mov UREGS_ss+8(%rsp),%fs2: movb TRAPBOUNCE_flags(%rdx),%cl subl $3*4,%esi movq VCPU_vcpu_info(%rbx),%rax pushq COMPAT_VCPUINFO_upcall_mask(%rax) testb $TBF_INTERRUPT,%cl setnz %ch # TBF_INTERRUPT -> set upcall mask orb %ch,COMPAT_VCPUINFO_upcall_mask(%rax) popq %rax shll $16,%eax # Bits 16-23: saved_upcall_mask movw UREGS_cs+8(%rsp),%ax # Bits 0-15: CS.Lft5: movl %eax,%fs:4(%rsi) # CS / saved_upcall_mask shrl $16,%eax testb %al,%al # Bits 0-7: saved_upcall_mask setz %ch # %ch == !saved_upcall_mask movl UREGS_eflags+8(%rsp),%eax andl $~X86_EFLAGS_IF,%eax addb %ch,%ch # Bit 9 (EFLAGS.IF) orb %ch,%ah # Fold EFLAGS.IF into %eax.Lft6: movl %eax,%fs:2*4(%rsi) # EFLAGS movl UREGS_rip+8(%rsp),%eax.Lft7: movl %eax,%fs:(%rsi) # EIP testb $TBF_EXCEPTION_ERRCODE,%cl jz 1f subl $4,%esi movl TRAPBOUNCE_error_code(%rdx),%eax.Lft8: movl %eax,%fs:(%rsi) # ERROR CODE1: testb $TBF_FAILSAFE,%cl jz 2f subl $4*4,%esi movl %gs,%eax.Lft9: movl %eax,%fs:3*4(%rsi) # GS.Lft10: movl %edi,%fs:2*4(%rsi) # FS movl %es,%eax.Lft11: movl %eax,%fs:1*4(%rsi) # ES movl %ds,%eax.Lft12: movl %eax,%fs:0*4(%rsi) # DS2: /* Rewrite our stack frame and return to guest-OS mode. */ /* IA32 Ref. Vol. 3: TF, VM, RF and NT flags are cleared on trap. */ andl $~(X86_EFLAGS_VM|X86_EFLAGS_RF|\ X86_EFLAGS_NT|X86_EFLAGS_TF),UREGS_eflags+8(%rsp) mov %fs,UREGS_ss+8(%rsp) movl %esi,UREGS_rsp+8(%rsp).Lft13: mov %edi,%fs movzwl TRAPBOUNCE_cs(%rdx),%eax /* Null selectors (0-3) are not allowed. */ testl $~3,%eax jz domain_crash_synchronous movl %eax,UREGS_cs+8(%rsp) movl TRAPBOUNCE_eip(%rdx),%eax movl %eax,UREGS_rip+8(%rsp) ret.section .fixup,"ax".Lfx13: xorl %edi,%edi jmp .Lft13.previous.section __ex_table,"a" .quad .Lft1,domain_crash_synchronous , .Lft2,compat_crash_page_fault .quad .Lft3,compat_crash_page_fault_4 , .Lft4,domain_crash_synchronous .quad .Lft5,compat_crash_page_fault_4 , .Lft6,compat_crash_page_fault_8 .quad .Lft7,compat_crash_page_fault , .Lft8,compat_crash_page_fault .quad .Lft9,compat_crash_page_fault_12, .Lft10,compat_crash_page_fault_8 .quad .Lft11,compat_crash_page_fault_4 , .Lft12,compat_crash_page_fault .quad .Lft13,.Lfx13.previouscompat_crash_page_fault_12: addl $4,%esicompat_crash_page_fault_8: addl $4,%esicompat_crash_page_fault_4: addl $4,%esicompat_crash_page_fault:.Lft14: mov %edi,%fs movl %esi,%edi call show_page_walk jmp domain_crash_synchronous.section .fixup,"ax".Lfx14: xorl %edi,%edi jmp .Lft14.previous.section __ex_table,"a" .quad .Lft14,.Lfx14.previous.section .rodata, "a", @progbitsENTRY(compat_hypercall_table) .quad compat_set_trap_table /* 0 */ .quad do_mmu_update .quad compat_set_gdt .quad do_stack_switch .quad compat_set_callbacks .quad do_fpu_taskswitch /* 5 */ .quad do_sched_op_compat .quad compat_platform_op .quad do_set_debugreg .quad do_get_debugreg .quad compat_update_descriptor /* 10 */ .quad compat_ni_hypercall .quad compat_memory_op .quad compat_multicall .quad compat_update_va_mapping .quad compat_set_timer_op /* 15 */ .quad do_event_channel_op_compat .quad compat_xen_version .quad do_console_io .quad compat_physdev_op_compat .quad compat_grant_table_op /* 20 */ .quad compat_vm_assist .quad compat_update_va_mapping_otherdomain .quad compat_iret .quad compat_vcpu_op .quad compat_ni_hypercall /* 25 */ .quad compat_mmuext_op .quad do_xsm_op .quad compat_nmi_op .quad compat_sched_op .quad compat_callback_op /* 30 */ .quad compat_xenoprof_op .quad do_event_channel_op .quad compat_physdev_op .quad do_hvm_op .quad do_sysctl /* 35 */ .quad do_domctl .quad compat_kexec_op .rept __HYPERVISOR_arch_0-((.-compat_hypercall_table)/8) .quad compat_ni_hypercall .endr .quad do_mca /* 48 */ .rept NR_hypercalls-((.-compat_hypercall_table)/8) .quad compat_ni_hypercall .endrENTRY(compat_hypercall_args_table) .byte 1 /* compat_set_trap_table */ /* 0 */ .byte 4 /* compat_mmu_update */ .byte 2 /* compat_set_gdt */ .byte 2 /* compat_stack_switch */ .byte 4 /* compat_set_callbacks */ .byte 1 /* compat_fpu_taskswitch */ /* 5 */ .byte 2 /* compat_sched_op_compat */ .byte 1 /* compat_platform_op */ .byte 2 /* compat_set_debugreg */ .byte 1 /* compat_get_debugreg */ .byte 4 /* compat_update_descriptor */ /* 10 */ .byte 0 /* compat_ni_hypercall */ .byte 2 /* compat_memory_op */ .byte 2 /* compat_multicall */ .byte 4 /* compat_update_va_mapping */ .byte 2 /* compat_set_timer_op */ /* 15 */ .byte 1 /* compat_event_channel_op_compat */ .byte 2 /* compat_xen_version */ .byte 3 /* compat_console_io */ .byte 1 /* compat_physdev_op_compat */ .byte 3 /* compat_grant_table_op */ /* 20 */ .byte 2 /* compat_vm_assist */ .byte 5 /* compat_update_va_mapping_otherdomain */ .byte 0 /* compat_iret */ .byte 3 /* compat_vcpu_op */ .byte 0 /* compat_ni_hypercall */ /* 25 */ .byte 4 /* compat_mmuext_op */ .byte 1 /* do_xsm_op */ .byte 2 /* compat_nmi_op */ .byte 2 /* compat_sched_op */ .byte 2 /* compat_callback_op */ /* 30 */ .byte 2 /* compat_xenoprof_op */ .byte 2 /* compat_event_channel_op */ .byte 2 /* compat_physdev_op */ .byte 2 /* do_hvm_op */ .byte 1 /* do_sysctl */ /* 35 */ .byte 1 /* do_domctl */ .byte 2 /* compat_kexec_op */ .rept __HYPERVISOR_arch_0-(.-compat_hypercall_args_table) .byte 0 /* compat_ni_hypercall */ .endr .byte 1 /* do_mca */ .rept NR_hypercalls-(.-compat_hypercall_args_table) .byte 0 /* compat_ni_hypercall */ .endr
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -