[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Minios-devel] [UNIKRAFT PATCH 1/6] arch/x86: Move `struct __regs` definition to <uk/arch/lcpu.h>
Expose `struct __regs` as part of the architecture headers. This is inline with what we did for Arm64 and useful for multiple things: - `dump_regs()` could be moved to libukdebug - A syscall-ABI-independent interface could be defined for registering syscall handler libraries. A syscall handler would get handed over a reference to the saved registers state in order to let it handle the system call arguments according to the target ABI. Signed-off-by: Simon Kuenzer <simon.kuenzer@xxxxxxxxx> --- arch/x86/x86_64/include/uk/asm/lcpu.h | 64 +++++++++++++++ include/uk/arch/lcpu.h | 4 + plat/common/include/uk/plat/common/trace.h | 6 +- plat/common/include/x86/regs.h | 94 ---------------------- plat/common/include/x86/traps.h | 2 +- plat/kvm/x86/cpu_vectors_x86_64.S | 11 ++- plat/xen/x86/entry64.S | 84 +++++++++---------- 7 files changed, 117 insertions(+), 148 deletions(-) delete mode 100644 plat/common/include/x86/regs.h diff --git a/arch/x86/x86_64/include/uk/asm/lcpu.h b/arch/x86/x86_64/include/uk/asm/lcpu.h index 8c70540a..6a471a15 100644 --- a/arch/x86/x86_64/include/uk/asm/lcpu.h +++ b/arch/x86/x86_64/include/uk/asm/lcpu.h @@ -32,6 +32,69 @@ #error Do not include this header directly #endif +#ifndef __ASSEMBLY__ +struct __regs { + unsigned long pad; /* 8 bytes to make struct size multiple of 16 */ + unsigned long r15; + unsigned long r14; + unsigned long r13; + unsigned long r12; + unsigned long rbp; + unsigned long rbx; +/* arguments: non interrupts/non tracing syscalls only save upto here*/ + unsigned long r11; + unsigned long r10; + unsigned long r9; + unsigned long r8; + unsigned long rax; + unsigned long rcx; + unsigned long rdx; + unsigned long rsi; + unsigned long rdi; + unsigned long orig_rax; +/* end of arguments */ +/* cpu exception frame or undefined */ + unsigned long rip; + unsigned long cs; + unsigned long eflags; + unsigned long rsp; + unsigned long ss; +/* top of stack page */ +}; +#endif /* !__ASSEMBLY__ */ + +#define __REGS_OFFSETOF_PAD 0 +#define __REGS_OFFSETOF_R15 8 +#define __REGS_OFFSETOF_R14 16 +#define __REGS_OFFSETOF_R13 24 +#define __REGS_OFFSETOF_R12 32 +#define __REGS_OFFSETOF_RBP 40 +#define __REGS_OFFSETOF_RBX 48 +#define __REGS_OFFSETOF_R11 56 +#define __REGS_OFFSETOF_R10 64 +#define __REGS_OFFSETOF_R9 72 +#define __REGS_OFFSETOF_R8 80 +#define __REGS_OFFSETOF_RAX 88 +#define __REGS_OFFSETOF_RCX 96 +#define __REGS_OFFSETOF_RDX 104 +#define __REGS_OFFSETOF_RSI 112 +#define __REGS_OFFSETOF_RDI 120 +#define __REGS_OFFSETOF_ORIG_RAX 128 +#define __REGS_OFFSETOF_RIP 136 +#define __REGS_OFFSETOF_CS 144 +#define __REGS_OFFSETOF_EFLAGS 152 +#define __REGS_OFFSETOF_RSP 160 +#define __REGS_OFFSETOF_SS 168 + +#define __REGS_PAD_SIZE __REGS_OFFSETOF_R15 +#define __REGS_SIZEOF 176 + +/* sanity check */ +#if __REGS_SIZEOF & 0xf +#error "__regs structure size should be multiple of 16." +#endif + +#ifndef __ASSEMBLY__ #ifndef mb #define mb() __asm__ __volatile__ ("mfence" : : : "memory") #endif @@ -55,3 +118,4 @@ static inline unsigned long ukarch_read_sp(void) __asm__ __volatile__("mov %%rsp, %0" : "=r"(sp)); return sp; } +#endif /* !__ASSEMBLY__ */ diff --git a/include/uk/arch/lcpu.h b/include/uk/arch/lcpu.h index 83ea6ecc..c5216287 100644 --- a/include/uk/arch/lcpu.h +++ b/include/uk/arch/lcpu.h @@ -36,7 +36,9 @@ #ifndef __UKARCH_LCPU_H__ #define __UKARCH_LCPU_H__ +#ifndef __ASSEMBLY__ #include <uk/arch/types.h> +#endif /* !__ASSEMBLY__ */ #ifdef __cplusplus extern "C" { @@ -44,6 +46,7 @@ extern "C" { #include <uk/asm/lcpu.h> +#ifndef __ASSEMBLY__ #ifndef likely #define likely(x) (__builtin_expect((!!(x)), 1)) #endif @@ -67,6 +70,7 @@ extern "C" { #ifndef wmb #define wmb() barrier() #endif +#endif /* !__ASSEMBLY__ */ #ifdef __cplusplus } diff --git a/plat/common/include/uk/plat/common/trace.h b/plat/common/include/uk/plat/common/trace.h index a423153e..bc3b6de8 100644 --- a/plat/common/include/uk/plat/common/trace.h +++ b/plat/common/include/uk/plat/common/trace.h @@ -34,11 +34,7 @@ #ifndef __PLAT_CMN_TRACE_H__ #define __PLAT_CMN_TRACE_H__ -#ifdef __X86_64__ -#include <x86/regs.h> /* TODO include a generic header */ -#else -#error "Create regs.h for current architecture" -#endif +#include <uk/arch/lcpu.h> void dump_regs(struct __regs *regs); void dump_mem(unsigned long addr); diff --git a/plat/common/include/x86/regs.h b/plat/common/include/x86/regs.h deleted file mode 100644 index a6a847e4..00000000 --- a/plat/common/include/x86/regs.h +++ /dev/null @@ -1,94 +0,0 @@ -/* SPDX-License-Identifier: BSD-2-Clause */ -/* - * Copyright (c) 2005, Grzegorz Milos, Intel Research Cambridge - * Copyright (c) 2018, NEC Europe Ltd., NEC Corporation. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ -#ifndef __UKARCH_REGS_H__ -#define __UKARCH_REGS_H__ - -#ifndef __ASSEMBLY__ -struct __regs { - unsigned long pad; /* for 16 bytes alignment */ - unsigned long r15; - unsigned long r14; - unsigned long r13; - unsigned long r12; - unsigned long rbp; - unsigned long rbx; -/* arguments: non interrupts/non tracing syscalls only save upto here*/ - unsigned long r11; - unsigned long r10; - unsigned long r9; - unsigned long r8; - unsigned long rax; - unsigned long rcx; - unsigned long rdx; - unsigned long rsi; - unsigned long rdi; - unsigned long orig_rax; -/* end of arguments */ -/* cpu exception frame or undefined */ - unsigned long rip; - unsigned long cs; - unsigned long eflags; - unsigned long rsp; - unsigned long ss; -/* top of stack page */ -}; -#endif - -#define OFFSETOF_REGS_PAD 0 -#define OFFSETOF_REGS_R15 8 -#define OFFSETOF_REGS_R14 16 -#define OFFSETOF_REGS_R13 24 -#define OFFSETOF_REGS_R12 32 -#define OFFSETOF_REGS_RBP 40 -#define OFFSETOF_REGS_RBX 48 -#define OFFSETOF_REGS_R11 56 -#define OFFSETOF_REGS_R10 64 -#define OFFSETOF_REGS_R9 72 -#define OFFSETOF_REGS_R8 80 -#define OFFSETOF_REGS_RAX 88 -#define OFFSETOF_REGS_RCX 96 -#define OFFSETOF_REGS_RDX 104 -#define OFFSETOF_REGS_RSI 112 -#define OFFSETOF_REGS_RDI 120 -#define OFFSETOF_REGS_ORIG_RAX 128 -#define OFFSETOF_REGS_RIP 136 -#define OFFSETOF_REGS_CS 144 -#define OFFSETOF_REGS_EFLAGS 152 -#define OFFSETOF_REGS_RSP 160 -#define OFFSETOF_REGS_SS 168 - -#define REGS_PAD_SIZE OFFSETOF_REGS_R15 -#define SIZEOF_REGS 176 - -#if SIZEOF_REGS & 0xf -#error "__regs structure size should be multiple of 16." -#endif - -/* This should be better defined in the thread header */ -#define OFFSETOF_UKTHREAD_REGS 16 - -#endif /* __UKARCH_REGS_H__ */ diff --git a/plat/common/include/x86/traps.h b/plat/common/include/x86/traps.h index b217b34a..da90f2ea 100644 --- a/plat/common/include/x86/traps.h +++ b/plat/common/include/x86/traps.h @@ -36,7 +36,7 @@ #ifndef __UKARCH_TRAPS_X86_64_H__ #define __UKARCH_TRAPS_X86_64_H__ -#include <x86/regs.h> +#include <uk/arch/lcpu.h> #define TRAP_divide_error 0 #define TRAP_debug 1 diff --git a/plat/kvm/x86/cpu_vectors_x86_64.S b/plat/kvm/x86/cpu_vectors_x86_64.S index 1af2fd00..35aa58d2 100644 --- a/plat/kvm/x86/cpu_vectors_x86_64.S +++ b/plat/kvm/x86/cpu_vectors_x86_64.S @@ -25,7 +25,6 @@ /* Taken from solo5 */ #include <x86/traps.h> -#include <x86/regs.h> #define ENTRY(X) .global X ; .type X, @function ; X: @@ -73,13 +72,13 @@ ENTRY(ASM_TRAP_SYM(\trapname)) pushq $0 /* no error code, pass 0 */ .endif PUSH_CALLER_SAVE - subq $REGS_PAD_SIZE, %rsp /* we have some padding */ + subq $__REGS_PAD_SIZE, %rsp /* we have some padding */ movq %rsp, %rdi - movq OFFSETOF_REGS_ORIG_RAX(%rsp), %rsi + movq __REGS_OFFSETOF_ORIG_RAX(%rsp), %rsi call do_\trapname - addq $REGS_PAD_SIZE, %rsp /* we have some padding */ + addq $__REGS_PAD_SIZE, %rsp /* we have some padding */ POP_CALLER_SAVE addq $8, %rsp /* discard error code */ @@ -92,12 +91,12 @@ ENTRY(cpu_irq_\irqno) pushq $0 /* no error code */ PUSH_CALLER_SAVE - subq $REGS_PAD_SIZE, %rsp /* we have some padding */ + subq $__REGS_PAD_SIZE, %rsp /* we have some padding */ movq $\irqno, %rdi call _ukplat_irq_handle - addq $REGS_PAD_SIZE, %rsp /* we have some padding */ + addq $__REGS_PAD_SIZE, %rsp /* we have some padding */ POP_CALLER_SAVE addq $8, %rsp diff --git a/plat/xen/x86/entry64.S b/plat/xen/x86/entry64.S index d34181be..ae118e1d 100644 --- a/plat/xen/x86/entry64.S +++ b/plat/xen/x86/entry64.S @@ -183,44 +183,44 @@ ENTRY(ASM_TRAP_SYM(\trapname)) .endm .macro RESTORE_ALL - movq OFFSETOF_REGS_R15(%rsp), %r15 - movq OFFSETOF_REGS_R14(%rsp), %r14 - movq OFFSETOF_REGS_R13(%rsp), %r13 - movq OFFSETOF_REGS_R12(%rsp), %r12 - movq OFFSETOF_REGS_RBP(%rsp), %rbp - movq OFFSETOF_REGS_RBX(%rsp), %rbx - movq OFFSETOF_REGS_R11(%rsp), %r11 - movq OFFSETOF_REGS_R10(%rsp), %r10 - movq OFFSETOF_REGS_R9(%rsp), %r9 - movq OFFSETOF_REGS_R8(%rsp), %r8 - movq OFFSETOF_REGS_RAX(%rsp), %rax - movq OFFSETOF_REGS_RCX(%rsp), %rcx - movq OFFSETOF_REGS_RDX(%rsp), %rdx - movq OFFSETOF_REGS_RSI(%rsp), %rsi - movq OFFSETOF_REGS_RDI(%rsp), %rdi - addq $OFFSETOF_REGS_RIP,%rsp + movq __REGS_OFFSETOF_R15(%rsp), %r15 + movq __REGS_OFFSETOF_R14(%rsp), %r14 + movq __REGS_OFFSETOF_R13(%rsp), %r13 + movq __REGS_OFFSETOF_R12(%rsp), %r12 + movq __REGS_OFFSETOF_RBP(%rsp), %rbp + movq __REGS_OFFSETOF_RBX(%rsp), %rbx + movq __REGS_OFFSETOF_R11(%rsp), %r11 + movq __REGS_OFFSETOF_R10(%rsp), %r10 + movq __REGS_OFFSETOF_R9(%rsp), %r9 + movq __REGS_OFFSETOF_R8(%rsp), %r8 + movq __REGS_OFFSETOF_RAX(%rsp), %rax + movq __REGS_OFFSETOF_RCX(%rsp), %rcx + movq __REGS_OFFSETOF_RDX(%rsp), %rdx + movq __REGS_OFFSETOF_RSI(%rsp), %rsi + movq __REGS_OFFSETOF_RDI(%rsp), %rdi + addq $__REGS_OFFSETOF_RIP,%rsp .endm .macro SAVE_ALL /* rdi slot contains rax, oldrax contains error code */ cld - subq $OFFSETOF_REGS_RDI, %rsp - movq %rsi, OFFSETOF_REGS_RSI(%rsp) - movq OFFSETOF_REGS_RDI(%rsp), %rsi /* load rax from rdi slot */ - movq %rdx, OFFSETOF_REGS_RDX(%rsp) - movq %rcx, OFFSETOF_REGS_RCX(%rsp) - movq %rsi, OFFSETOF_REGS_RAX(%rsp) /* store rax */ - movq %r8, OFFSETOF_REGS_R8(%rsp) - movq %r9, OFFSETOF_REGS_R9(%rsp) - movq %r10, OFFSETOF_REGS_R10(%rsp) - movq %r11, OFFSETOF_REGS_R11(%rsp) - movq %rbx, OFFSETOF_REGS_RBX(%rsp) - movq %rbp, OFFSETOF_REGS_RBP(%rsp) - movq %r12, OFFSETOF_REGS_R12(%rsp) - movq %r13, OFFSETOF_REGS_R13(%rsp) - movq %r14, OFFSETOF_REGS_R14(%rsp) - movq %r15, OFFSETOF_REGS_R15(%rsp) - movq %rdi, OFFSETOF_REGS_RDI(%rsp) /* put rdi into the slot */ + subq $__REGS_OFFSETOF_RDI, %rsp + movq %rsi, __REGS_OFFSETOF_RSI(%rsp) + movq __REGS_OFFSETOF_RDI(%rsp), %rsi /* load rax from rdi slot */ + movq %rdx, __REGS_OFFSETOF_RDX(%rsp) + movq %rcx, __REGS_OFFSETOF_RCX(%rsp) + movq %rsi, __REGS_OFFSETOF_RAX(%rsp) /* store rax */ + movq %r8, __REGS_OFFSETOF_R8(%rsp) + movq %r9, __REGS_OFFSETOF_R9(%rsp) + movq %r10, __REGS_OFFSETOF_R10(%rsp) + movq %r11, __REGS_OFFSETOF_R11(%rsp) + movq %rbx, __REGS_OFFSETOF_RBX(%rsp) + movq %rbp, __REGS_OFFSETOF_RBP(%rsp) + movq %r12, __REGS_OFFSETOF_R12(%rsp) + movq %r13, __REGS_OFFSETOF_R13(%rsp) + movq %r14, __REGS_OFFSETOF_R14(%rsp) + movq %r15, __REGS_OFFSETOF_R15(%rsp) + movq %rdi, __REGS_OFFSETOF_RDI(%rsp) /* put rdi into the slot */ .endm .macro HYPERVISOR_IRET @@ -251,8 +251,8 @@ error_entry: SAVE_ALL movq %rsp,%rdi - movq OFFSETOF_REGS_ORIG_RAX(%rsp),%rsi # get error code - movq $-1,OFFSETOF_REGS_ORIG_RAX(%rsp) + movq __REGS_OFFSETOF_ORIG_RAX(%rsp),%rsi # get error code + movq $-1,__REGS_OFFSETOF_ORIG_RAX(%rsp) call *%rax jmp error_exit @@ -268,7 +268,7 @@ hypervisor_callback2: movq %rdi, %rsp /* check against event re-entrant */ - movq OFFSETOF_REGS_RIP(%rsp),%rax + movq __REGS_OFFSETOF_RIP(%rsp),%rax cmpq $scrit,%rax jb 11f cmpq $ecrit,%rax @@ -283,7 +283,7 @@ hypervisor_callback2: decl %gs:0 error_exit: - movl OFFSETOF_REGS_EFLAGS(%rsp), %eax + movl __REGS_OFFSETOF_EFLAGS(%rsp), %eax shr $9, %eax # EAX[0] == IRET_RFLAGS.IF XEN_GET_VCPU_INFO(%rsi) andb evtchn_upcall_mask(%rsi),%al @@ -329,11 +329,11 @@ hypervisor_prologue: critical_region_fixup: # Set up source and destination region pointers - leaq OFFSETOF_REGS_RIP(%rsp),%rsi # esi points at end of src region + leaq __REGS_OFFSETOF_RIP(%rsp),%rsi # esi points at end of src region # Acquire interrupted rsp which was saved-on-stack. This points to # the end of dst region. Note that it is not necessarily current rsp # plus 0xb0, because the second interrupt might align the stack frame. - movq OFFSETOF_REGS_RSP(%rsp),%rdi # edi points at end of dst region + movq __REGS_OFFSETOF_RSP(%rsp),%rdi # edi points at end of dst region cmpq $restore_end,%rax jae 13f @@ -341,11 +341,11 @@ critical_region_fixup: # If interrupted rip is before restore_end # then rax hasn't been restored yet movq (%rdi),%rax - movq %rax, OFFSETOF_REGS_RAX(%rsp) # save rax + movq %rax, __REGS_OFFSETOF_RAX(%rsp) # save rax addq $RSP_OFFSET,%rdi # Set up the copy -13: movq $OFFSETOF_REGS_RIP,%rcx +13: movq $__REGS_OFFSETOF_RIP,%rcx shr $3,%rcx # convert bytes into count of 64-bit entities 15: subq $8,%rsi # pre-decrementing copy loop subq $8,%rdi @@ -353,7 +353,7 @@ critical_region_fixup: movq %rax,(%rdi) loop 15b 16: movq %rdi,%rsp # final rdi is top of merged stack - andb $KERNEL_CS_MASK,OFFSETOF_REGS_CS(%rsp) # CS might have changed + andb $KERNEL_CS_MASK,__REGS_OFFSETOF_CS(%rsp) # CS might have changed jmp 11b #else -- 2.20.1 _______________________________________________ Minios-devel mailing list Minios-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/minios-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |