xen-devel.lists.xenproject.org archive mirror
 help / color / mirror / Atom feed
From: Samuel Thibault <samuel.thibault@ens-lyon.org>
To: Juergen Gross <jgross@suse.com>
Cc: minios-devel@lists.xenproject.org,
	xen-devel@lists.xenproject.org, wei.liu2@citrix.com
Subject: Re: [PATCH 09/22] mini-os: support HVMlite traps
Date: Wed, 24 Aug 2016 00:10:26 +0200	[thread overview]
Message-ID: <20160823221026.GE4401@var.home> (raw)
In-Reply-To: <1471965368-6159-10-git-send-email-jgross@suse.com>

Juergen Gross, on Tue 23 Aug 2016 17:15:55 +0200, wrote:
> Trap handling in HVMlite domain is different from pv one.
> 
> Signed-off-by: Juergen Gross <jgross@suse.com>

Reviewed-by: Samuel Thibault <samuel.thibault@ens-lyon.org>

> ---
>  arch/x86/traps.c  |  2 --
>  arch/x86/x86_32.S | 19 ++++++++++++++--
>  arch/x86/x86_64.S | 22 +++++++++++++++++-
>  include/x86/os.h  | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++----
>  4 files changed, 101 insertions(+), 9 deletions(-)
> 
> diff --git a/arch/x86/traps.c b/arch/x86/traps.c
> index 3b1fffb..0b3d85b 100644
> --- a/arch/x86/traps.c
> +++ b/arch/x86/traps.c
> @@ -191,8 +191,6 @@ static void dump_mem(unsigned long addr)
>      }
>      printk("\n");
>  }
> -#define read_cr2() \
> -        (HYPERVISOR_shared_info->vcpu_info[smp_processor_id()].arch.cr2)
>  
>  static int handling_pg_fault = 0;
>  
> diff --git a/arch/x86/x86_32.S b/arch/x86/x86_32.S
> index 6f38708..9241418 100644
> --- a/arch/x86/x86_32.S
> +++ b/arch/x86/x86_32.S
> @@ -8,6 +8,9 @@
>  #include <xen/arch-x86_32.h>
>  
>  #ifdef CONFIG_PARAVIRT
> +
> +#define KERNEL_DS __KERNEL_DS
> +
>  ELFNOTE(Xen, XEN_ELFNOTE_GUEST_OS, .asciz "Mini-OS")
>  ELFNOTE(Xen, XEN_ELFNOTE_LOADER, .asciz "generic")
>  ELFNOTE(Xen, XEN_ELFNOTE_HYPERCALL_PAGE, _WORD hypercall_page)
> @@ -21,6 +24,8 @@ _start:
>          lss stack_start,%esp
>  #else
>  
> +#define KERNEL_DS __KERN_DS
> +
>  #include "x86_hvm.S"
>          movl stack_start,%esp
>  
> @@ -61,7 +66,7 @@ CS		= 0x2C
>  	pushl %edx; \
>  	pushl %ecx; \
>  	pushl %ebx; \
> -	movl $(__KERNEL_DS),%edx; \
> +	movl $(KERNEL_DS),%edx; \
>  	movl %edx,%ds; \
>  	movl %edx,%es;
>  
> @@ -98,7 +103,7 @@ do_exception:
>  	movl ORIG_EAX(%esp), %edx	# get the error code
>  	movl %eax, ORIG_EAX(%esp)
>  	movl %ecx, ES(%esp)
> -	movl $(__KERNEL_DS), %ecx
> +	movl $(KERNEL_DS), %ecx
>  	movl %ecx, %ds
>  	movl %ecx, %es
>  	movl %esp,%eax			# pt_regs pointer
> @@ -112,6 +117,7 @@ ret_from_exception:
>      addl $8,%esp
>      RESTORE_ALL
>  
> +#ifdef CONFIG_PARAVIRT
>  # A note on the "critical region" in our callback handler.
>  # We want to avoid stacking callback handlers due to events occurring
>  # during handling of the last event. To do this, we keep events disabled
> @@ -189,6 +195,15 @@ critical_fixup_table:
>          .byte 0x28                            # iret
>          .byte 0x00,0x00,0x00,0x00             # movb $1,1(%esi)
>          .byte 0x00,0x00                       # jmp  11b
> +
> +#else
> +
> +ENTRY(hypervisor_callback)
> +	pushl $0
> +	pushl $do_hypervisor_callback
> +	jmp do_exception
> +
> +#endif
>         
>  # Hypervisor uses this for application faults while it executes.
>  ENTRY(failsafe_callback)
> diff --git a/arch/x86/x86_64.S b/arch/x86/x86_64.S
> index e725c63..17a9ead 100644
> --- a/arch/x86/x86_64.S
> +++ b/arch/x86/x86_64.S
> @@ -78,9 +78,11 @@ KERNEL_CS_MASK = 0xfc
>  
>  /* Macros */
>  .macro zeroentry sym
> +#ifdef CONFIG_PARAVIRT
>  	movq (%rsp),%rcx
>  	movq 8(%rsp),%r11
>  	addq $0x10,%rsp /* skip rcx and r11 */
> +#endif
>  	pushq $0	/* push error code/oldrax */
>  	pushq %rax	/* push real oldrax to the rdi slot */
>  	leaq  \sym(%rip),%rax
> @@ -88,9 +90,11 @@ KERNEL_CS_MASK = 0xfc
>  .endm
>  
>  .macro errorentry sym
> +#ifdef CONFIG_PARAVIRT
>  	movq (%rsp),%rcx
>  	movq 8(%rsp),%r11
>  	addq $0x10,%rsp /* rsp points to the error code */
> +#endif
>  	pushq %rax
>  	leaq  \sym(%rip),%rax
>  	jmp error_entry
> @@ -133,11 +137,11 @@ KERNEL_CS_MASK = 0xfc
>  #ifdef CONFIG_PARAVIRT
>  	testl $NMI_MASK,2*8(%rsp)
>  	jnz   2f
> -#endif
>  
>  	/* Direct iret to kernel space. Correct CS and SS. */
>  	orb   $3,1*8(%rsp)
>  	orb   $3,4*8(%rsp)
> +#endif
>  	iretq
>  
>  #ifdef CONFIG_PARAVIRT
> @@ -182,6 +186,7 @@ error_call_handler:
>  	jmp error_exit
>  
>  
> +#ifdef CONFIG_PARAVIRT
>  /*
>   * Xen event (virtual interrupt) entry point.
>   */
> @@ -285,11 +290,26 @@ critical_region_fixup:
>  	andb $KERNEL_CS_MASK,CS(%rsp)      # CS might have changed
>  	jmp  11b
>  
> +#else
> +error_exit:
> +	RESTORE_REST
> +	RESTORE_ALL
> +	HYPERVISOR_IRET 0
>  
> +/*
> + * Xen event (virtual interrupt) entry point.
> + */
> +ENTRY(hypervisor_callback)
> +	zeroentry do_hypervisor_callback
> +
> +
> +#endif
>  
>  ENTRY(failsafe_callback)
> +#ifdef CONFIG_PARAVIRT
>          popq  %rcx
>          popq  %r11
> +#endif
>          iretq
>  
>  
> diff --git a/include/x86/os.h b/include/x86/os.h
> index 6826b9f..1083328 100644
> --- a/include/x86/os.h
> +++ b/include/x86/os.h
> @@ -31,6 +31,8 @@
>  #define X86_CR4_PAE       0x00000020    /* enable physical address extensions */
>  #define X86_CR4_OSFXSR    0x00000200    /* enable fast FPU save and restore */
>  
> +#define X86_EFLAGS_IF     0x00000200
> +
>  #define __KERNEL_CS  FLAT_KERNEL_CS
>  #define __KERNEL_DS  FLAT_KERNEL_DS
>  #define __KERNEL_SS  FLAT_KERNEL_SS
> @@ -70,7 +72,7 @@ void arch_fini(void);
>  
>  
>  
> -
> +#ifdef CONFIG_PARAVIRT
>  
>  /* 
>   * The use of 'barrier' in the following reflects their use as local-lock
> @@ -129,15 +131,57 @@ do {									\
>  	barrier();							\
>  } while (0)
>  
> +#define irqs_disabled()			\
> +    HYPERVISOR_shared_info->vcpu_info[smp_processor_id()].evtchn_upcall_mask
> +
> +#else
> +
> +#if defined(__i386__)
> +#define __SZ "l"
> +#define __REG "e"
> +#else
> +#define __SZ "q"
> +#define __REG "r"
> +#endif
> +
> +#define __cli() asm volatile ( "cli" : : : "memory" )
> +#define __sti() asm volatile ( "sti" : : : "memory" )
> +
> +#define __save_flags(x)                                                 \
> +do {                                                                    \
> +    unsigned long __f;                                                  \
> +    asm volatile ( "pushf" __SZ " ; pop" __SZ " %0" : "=g" (__f));      \
> +    x = (__f & X86_EFLAGS_IF) ? 1 : 0;                                  \
> +} while (0)
> +
> +#define __restore_flags(x)                                              \
> +do {                                                                    \
> +    if (x) __sti();                                                     \
> +    else __cli();                                                       \
> +} while (0)
> +
> +#define __save_and_cli(x)                                               \
> +do {                                                                    \
> +    __save_flags(x);                                                    \
> +    __cli();                                                            \
> +} while (0)
> +
> +static inline int irqs_disabled(void)
> +{
> +    int flag;
> +
> +    __save_flags(flag);
> +    return !flag;
> +}
> +
> +#endif
> +
>  #define local_irq_save(x)	__save_and_cli(x)
>  #define local_irq_restore(x)	__restore_flags(x)
>  #define local_save_flags(x)	__save_flags(x)
>  #define local_irq_disable()	__cli()
>  #define local_irq_enable()	__sti()
>  
> -#define irqs_disabled()			\
> -    HYPERVISOR_shared_info->vcpu_info[smp_processor_id()].evtchn_upcall_mask
> -
>  /* This is a barrier for the compiler only, NOT the processor! */
>  #define barrier() __asm__ __volatile__("": : :"memory")
>  
> @@ -586,5 +630,20 @@ static inline void cpuid(uint32_t leaf,
>  
>  #undef ADDR
>  
> +#ifdef CONFIG_PARAVIRT
> +static inline unsigned long read_cr2(void)
> +{
> +    return HYPERVISOR_shared_info->vcpu_info[smp_processor_id()].arch.cr2;
> +}
> +#else
> +static inline unsigned long read_cr2(void)
> +{
> +    unsigned long cr2;
> +
> +    asm volatile ( "mov %%cr2,%0\n\t" : "=r" (cr2) );
> +    return cr2;
> +}
> +#endif
> +
>  #endif /* not assembly */
>  #endif /* _OS_H_ */
> -- 
> 2.6.6
> 

-- 
Samuel
Tu as lu les docs. Tu es devenu un informaticien. Que tu le veuilles
ou non. Lire la doc, c'est le Premier et Unique Commandement de
l'informaticien.
-+- TP in: Guide du Linuxien pervers - "L'évangile selon St Thomas"

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel

  reply	other threads:[~2016-08-23 22:10 UTC|newest]

Thread overview: 48+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-08-23 15:15 [PATCH 00/22] mini-os: support HVMlite mode Juergen Gross
2016-08-23 15:15 ` [PATCH 01/22] mini-os: resync xen headers Juergen Gross
2016-08-23 19:44   ` Samuel Thibault
2016-08-23 15:15 ` [PATCH 02/22] mini-os: make dump_regs() work in early boot Juergen Gross
2016-08-23 19:44   ` Samuel Thibault
2016-08-23 15:15 ` [PATCH 03/22] mini-os: add CONFIG_PARAVIRT Juergen Gross
2016-08-23 19:54   ` Samuel Thibault
2016-08-23 15:15 ` [PATCH 04/22] mini-os: make some memory management related macros usable from assembler Juergen Gross
2016-08-23 19:46   ` Samuel Thibault
2016-08-23 15:15 ` [PATCH 05/22] mini-os: add boot code for HVMlite support Juergen Gross
2016-08-23 20:51   ` Samuel Thibault
2016-08-24  5:13     ` Juergen Gross
2016-08-23 15:15 ` [PATCH 06/22] mini-os: setup hypercall page for HVMlite Juergen Gross
2016-08-23 21:03   ` Samuel Thibault
2016-08-24  5:10     ` Juergen Gross
2016-08-23 15:15 ` [PATCH 07/22] mini-os: support hvm_op hypercall Juergen Gross
2016-08-23 22:00   ` Samuel Thibault
2016-08-23 15:15 ` [PATCH 08/22] mini-os: initialize trap handling for HVMlite Juergen Gross
2016-08-23 22:05   ` Samuel Thibault
2016-08-23 15:15 ` [PATCH 09/22] mini-os: support HVMlite traps Juergen Gross
2016-08-23 22:10   ` Samuel Thibault [this message]
2016-08-23 15:15 ` [PATCH 10/22] mini-os: make p2m related code depend on CONFIG_PARAVIRT Juergen Gross
2016-08-23 22:20   ` Samuel Thibault
2016-08-23 15:15 ` [PATCH 11/22] mini-os: add static page tables for virtual kernel area for HVMlite Juergen Gross
2016-08-23 22:27   ` Samuel Thibault
2016-08-23 15:15 ` [PATCH 12/22] mini-os: add x86 native page table handling Juergen Gross
2016-08-23 22:40   ` Samuel Thibault
2016-08-23 15:15 ` [PATCH 13/22] mini-os: correct wrong calculation of alloc bitmap size Juergen Gross
2016-08-23 19:49   ` Samuel Thibault
2016-08-23 15:16 ` [PATCH 14/22] mini-os: add map_frame_virt() function Juergen Gross
2016-08-23 22:42   ` Samuel Thibault
2016-08-23 15:16 ` [PATCH 15/22] mini-os: setup console interface parameters Juergen Gross
2016-08-23 22:44   ` Samuel Thibault
2016-08-23 15:16 ` [PATCH 16/22] mini-os: setup xenbus " Juergen Gross
2016-08-23 22:45   ` Samuel Thibault
2016-08-23 15:16 ` [PATCH 17/22] mini-os: add get_cmdline() function Juergen Gross
2016-08-23 23:03   ` [Minios-devel] " Samuel Thibault
2016-08-23 15:16 ` [PATCH 18/22] mini-os: map shared info page for HVMlite Juergen Gross
2016-08-23 22:47   ` Samuel Thibault
2016-08-23 15:16 ` [PATCH 19/22] mini-os: remove using start_info in architecture independent code Juergen Gross
2016-08-23 22:48   ` Samuel Thibault
2016-08-23 15:16 ` [PATCH 20/22] mini-os: print start of day messages depending on domain type Juergen Gross
2016-08-23 22:51   ` Samuel Thibault
2016-08-24  5:09     ` Juergen Gross
2016-08-23 15:16 ` [PATCH 21/22] mini-os: get physical memory map Juergen Gross
2016-08-23 22:58   ` Samuel Thibault
2016-08-23 15:16 ` [PATCH 22/22] mini-os: support idle for HVMlite Juergen Gross
2016-08-23 23:01   ` Samuel Thibault

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20160823221026.GE4401@var.home \
    --to=samuel.thibault@ens-lyon.org \
    --cc=jgross@suse.com \
    --cc=minios-devel@lists.xenproject.org \
    --cc=wei.liu2@citrix.com \
    --cc=xen-devel@lists.xenproject.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).