Author: andrew
Date: Tue Mar  3 08:28:16 2020
New Revision: 358567
URL: https://svnweb.freebsd.org/changeset/base/358567

Log:
  Store the boot exception level on arm64 so it can be queried later
  
  A hypervisor, e.g. bhyve, will need to know what exception levelthe kernel
  was in when it started booting. If it was EL2 we can then enable said
  hypervisor.
  
  Store the boot exception level and allow the kernel to later query it.
  
  Obtained from:        https://github.com/FreeBSD-UPB/freebsd (earlier version)
  Sponsored by: Innovate UK

Modified:
  head/sys/arm64/arm64/genassym.c
  head/sys/arm64/arm64/locore.S
  head/sys/arm64/arm64/machdep.c
  head/sys/arm64/include/machdep.h

Modified: head/sys/arm64/arm64/genassym.c
==============================================================================
--- head/sys/arm64/arm64/genassym.c     Tue Mar  3 08:24:09 2020        
(r358566)
+++ head/sys/arm64/arm64/genassym.c     Tue Mar  3 08:28:16 2020        
(r358567)
@@ -45,6 +45,7 @@ ASSYM(BP_KERN_L1PT, offsetof(struct arm64_bootparams, 
 ASSYM(BP_KERN_DELTA, offsetof(struct arm64_bootparams, kern_delta));
 ASSYM(BP_KERN_STACK, offsetof(struct arm64_bootparams, kern_stack));
 ASSYM(BP_KERN_L0PT, offsetof(struct arm64_bootparams, kern_l0pt));
+ASSYM(BP_BOOT_EL, offsetof(struct arm64_bootparams, boot_el));
 
 ASSYM(TDF_ASTPENDING, TDF_ASTPENDING);
 ASSYM(TDF_NEEDRESCHED, TDF_NEEDRESCHED);

Modified: head/sys/arm64/arm64/locore.S
==============================================================================
--- head/sys/arm64/arm64/locore.S       Tue Mar  3 08:24:09 2020        
(r358566)
+++ head/sys/arm64/arm64/locore.S       Tue Mar  3 08:28:16 2020        
(r358567)
@@ -165,6 +165,7 @@ virtdone:
        adr     x25, initstack
        str     x25, [x0, #BP_KERN_STACK]
        str     x24, [x0, #BP_KERN_L0PT]
+       str     x23, [x0, #BP_BOOT_EL]
 
        /* trace back starts here */
        mov     fp, #0
@@ -227,9 +228,9 @@ END(mpentry)
  * registers and drop to EL1.
  */
 drop_to_el1:
-       mrs     x1, CurrentEL
-       lsr     x1, x1, #2
-       cmp     x1, #0x2
+       mrs     x23, CurrentEL
+       lsr     x23, x23, #2
+       cmp     x23, #0x2
        b.eq    1f
        ret
 1:

Modified: head/sys/arm64/arm64/machdep.c
==============================================================================
--- head/sys/arm64/arm64/machdep.c      Tue Mar  3 08:24:09 2020        
(r358566)
+++ head/sys/arm64/arm64/machdep.c      Tue Mar  3 08:28:16 2020        
(r358567)
@@ -109,6 +109,7 @@ static struct trapframe proc0_tf;
 
 int early_boot = 1;
 int cold = 1;
+static int boot_el;
 
 struct kva_md_info kmi;
 
@@ -162,6 +163,13 @@ pan_enable(void)
        }
 }
 
+bool
+has_hyp(void)
+{
+
+       return (boot_el == 2);
+}
+
 static void
 cpu_startup(void *dummy)
 {
@@ -1089,6 +1097,8 @@ initarm(struct arm64_bootparams *abp)
        vm_offset_t lastaddr;
        caddr_t kmdp;
        bool valid;
+
+       boot_el = abp->boot_el;
 
        /* Parse loader or FDT boot parametes. Determine last used address. */
        lastaddr = parse_boot_param(abp);

Modified: head/sys/arm64/include/machdep.h
==============================================================================
--- head/sys/arm64/include/machdep.h    Tue Mar  3 08:24:09 2020        
(r358566)
+++ head/sys/arm64/include/machdep.h    Tue Mar  3 08:28:16 2020        
(r358567)
@@ -35,6 +35,8 @@ struct arm64_bootparams {
        uint64_t        kern_delta;
        vm_offset_t     kern_stack;
        vm_offset_t     kern_l0pt;      /* L1 page table for the kernel */
+       int             boot_el;        /* EL the kernel booted from */
+       int             pad;
 };
 
 enum arm64_bus {
@@ -46,6 +48,7 @@ enum arm64_bus {
 extern enum arm64_bus arm64_bus_method;
 
 void dbg_init(void);
+bool has_hyp(void);
 void initarm(struct arm64_bootparams *);
 vm_offset_t parse_boot_param(struct arm64_bootparams *abp);
 #ifdef FDT
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to