Print this page
11787 Kernel needs to be built with retpolines
11788 Kernel needs to generally use RSB stuffing
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
Reviewed by: John Levon <john.levon@joyent.com>

@@ -22,11 +22,13 @@
 /*
  * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
-#pragma ident   "%Z%%M% %I%     %E% SMI"
+/*
+ * Copyright 2019 Joyent, Inc.
+ */
 
 #if defined(lint) || defined(__lint)
 #include <sys/types.h>
 #include <sys/sunddi.h>
 #else

@@ -287,11 +289,12 @@
         cmpl    $_CONST(DDI_ACCATTR_CPU_VADDR|DDI_ACCATTR_DIRECT), %edx
         jne     2f
         movzbq  (%rsi), %rax
         ret
 2:
-        jmp     *ACC_GETB(%rdi)
+        movq    ACC_GETB(%rdi), %rax
+        INDIRECT_JMP_REG(rax)
         SET_SIZE(ddi_get8)
         SET_SIZE(ddi_getb)
         SET_SIZE(ddi_mem_getb)
         SET_SIZE(ddi_mem_get8)
         SET_SIZE(ddi_io_getb)

@@ -349,11 +352,12 @@
         cmpl    $_CONST(DDI_ACCATTR_CPU_VADDR|DDI_ACCATTR_DIRECT), %edx
         jne     4f
         movzwq  (%rsi), %rax
         ret
 4:
-        jmp     *ACC_GETW(%rdi)
+        movq    ACC_GETW(%rdi), %rax
+        INDIRECT_JMP_REG(rax)
         SET_SIZE(ddi_get16)
         SET_SIZE(ddi_getw)
         SET_SIZE(ddi_mem_getw)
         SET_SIZE(ddi_mem_get16)
         SET_SIZE(ddi_io_getw)

@@ -410,11 +414,12 @@
         cmpl    $_CONST(DDI_ACCATTR_CPU_VADDR|DDI_ACCATTR_DIRECT), %edx
         jne     6f
         movl    (%rsi), %eax
         ret
 6:
-        jmp     *ACC_GETL(%rdi)
+        movq    ACC_GETL(%rdi), %rax
+        INDIRECT_JMP_REG(rax)
         SET_SIZE(ddi_get32)
         SET_SIZE(ddi_getl)
         SET_SIZE(ddi_mem_getl)
         SET_SIZE(ddi_mem_get32)
         SET_SIZE(ddi_io_getl)

@@ -456,11 +461,12 @@
 
         ENTRY(ddi_get64)
         ALTENTRY(ddi_getll)
         ALTENTRY(ddi_mem_getll)
         ALTENTRY(ddi_mem_get64)
-        jmp     *ACC_GETLL(%rdi)
+        movq    ACC_GETLL(%rdi), %rax
+        INDIRECT_JMP_REG(rax)
         SET_SIZE(ddi_get64)
         SET_SIZE(ddi_getll)
         SET_SIZE(ddi_mem_getll)
         SET_SIZE(ddi_mem_get64)
 

@@ -498,11 +504,12 @@
         cmpl    $_CONST(DDI_ACCATTR_CPU_VADDR|DDI_ACCATTR_DIRECT), %ecx
         jne     8f
         movb    %dl, (%rsi)
         ret
 8:
-        jmp     *ACC_PUTB(%rdi)
+        movq    ACC_PUTB(%rdi), %rax
+        INDIRECT_JMP_REG(rax)
         SET_SIZE(ddi_put8)
         SET_SIZE(ddi_putb)
         SET_SIZE(ddi_mem_putb)
         SET_SIZE(ddi_mem_put8)
         SET_SIZE(ddi_io_putb)

@@ -561,11 +568,12 @@
         cmpl    $_CONST(DDI_ACCATTR_CPU_VADDR|DDI_ACCATTR_DIRECT), %ecx
         jne     9f
         movw    %dx, (%rsi)
         ret
 9:
-        jmp     *ACC_PUTW(%rdi)
+        movq    ACC_PUTW(%rdi), %rax
+        INDIRECT_JMP_REG(rax)
         SET_SIZE(ddi_put16)
         SET_SIZE(ddi_putw)
         SET_SIZE(ddi_mem_putw)
         SET_SIZE(ddi_mem_put16)
         SET_SIZE(ddi_io_putw)

@@ -624,11 +632,12 @@
         cmpl    $_CONST(DDI_ACCATTR_CPU_VADDR|DDI_ACCATTR_DIRECT), %ecx
         jne     9f
         movl    %edx, (%rsi)
         ret
 9:
-        jmp     *ACC_PUTL(%rdi)
+        movq    ACC_PUTL(%rdi), %rax
+        INDIRECT_JMP_REG(rax)
         SET_SIZE(ddi_put32)
         SET_SIZE(ddi_putl)
         SET_SIZE(ddi_mem_putl)
         SET_SIZE(ddi_mem_put32)
         SET_SIZE(ddi_io_putl)

@@ -672,11 +681,12 @@
 
         ENTRY(ddi_put64)
         ALTENTRY(ddi_putll)
         ALTENTRY(ddi_mem_putll)
         ALTENTRY(ddi_mem_put64)
-        jmp     *ACC_PUTLL(%rdi)
+        movq    ACC_PUTLL(%rdi), %rax
+        INDIRECT_JMP_REG(rax)
         SET_SIZE(ddi_put64)
         SET_SIZE(ddi_putll)
         SET_SIZE(ddi_mem_putll)
         SET_SIZE(ddi_mem_put64)
 

@@ -699,11 +709,12 @@
 
         ENTRY(ddi_rep_get8)
         ALTENTRY(ddi_rep_getb)
         ALTENTRY(ddi_mem_rep_getb)
         ALTENTRY(ddi_mem_rep_get8)
-        jmp     *ACC_REP_GETB(%rdi)
+        movq    ACC_REP_GETB(%rdi), %rax
+        INDIRECT_JMP_REG(rax)
         SET_SIZE(ddi_rep_get8)
         SET_SIZE(ddi_rep_getb)
         SET_SIZE(ddi_mem_rep_getb)
         SET_SIZE(ddi_mem_rep_get8)
 

@@ -726,11 +737,12 @@
 
         ENTRY(ddi_rep_get16)
         ALTENTRY(ddi_rep_getw)
         ALTENTRY(ddi_mem_rep_getw)
         ALTENTRY(ddi_mem_rep_get16)
-        jmp     *ACC_REP_GETW(%rdi)
+        movq    ACC_REP_GETW(%rdi), %rax
+        INDIRECT_JMP_REG(rax)
         SET_SIZE(ddi_rep_get16)
         SET_SIZE(ddi_rep_getw)
         SET_SIZE(ddi_mem_rep_getw)
         SET_SIZE(ddi_mem_rep_get16)
 

@@ -753,11 +765,12 @@
 
         ENTRY(ddi_rep_get32)
         ALTENTRY(ddi_rep_getl)
         ALTENTRY(ddi_mem_rep_getl)
         ALTENTRY(ddi_mem_rep_get32)
-        jmp     *ACC_REP_GETL(%rdi)
+        movq    ACC_REP_GETL(%rdi), %rax
+        INDIRECT_JMP_REG(rax)
         SET_SIZE(ddi_rep_get32)
         SET_SIZE(ddi_rep_getl)
         SET_SIZE(ddi_mem_rep_getl)
         SET_SIZE(ddi_mem_rep_get32)
 

@@ -780,11 +793,12 @@
 
         ENTRY(ddi_rep_get64)
         ALTENTRY(ddi_rep_getll)
         ALTENTRY(ddi_mem_rep_getll)
         ALTENTRY(ddi_mem_rep_get64)
-        jmp     *ACC_REP_GETLL(%rdi)
+        movq    ACC_REP_GETLL(%rdi), %rax
+        INDIRECT_JMP_REG(rax)
         SET_SIZE(ddi_rep_get64)
         SET_SIZE(ddi_rep_getll)
         SET_SIZE(ddi_mem_rep_getll)
         SET_SIZE(ddi_mem_rep_get64)
 

@@ -807,11 +821,12 @@
 
         ENTRY(ddi_rep_put8)
         ALTENTRY(ddi_rep_putb)
         ALTENTRY(ddi_mem_rep_putb)
         ALTENTRY(ddi_mem_rep_put8)
-        jmp     *ACC_REP_PUTB(%rdi)
+        movq    ACC_REP_PUTB(%rdi), %rax
+        INDIRECT_JMP_REG(rax)
         SET_SIZE(ddi_rep_put8)
         SET_SIZE(ddi_rep_putb)
         SET_SIZE(ddi_mem_rep_putb)
         SET_SIZE(ddi_mem_rep_put8)
 

@@ -834,11 +849,12 @@
 
         ENTRY(ddi_rep_put16)
         ALTENTRY(ddi_rep_putw)
         ALTENTRY(ddi_mem_rep_putw)
         ALTENTRY(ddi_mem_rep_put16)
-        jmp     *ACC_REP_PUTW(%rdi)
+        movq    ACC_REP_PUTW(%rdi), %rax
+        INDIRECT_JMP_REG(rax)
         SET_SIZE(ddi_rep_put16)
         SET_SIZE(ddi_rep_putw)
         SET_SIZE(ddi_mem_rep_putw)
         SET_SIZE(ddi_mem_rep_put16)
 

@@ -861,11 +877,12 @@
 
         ENTRY(ddi_rep_put32)
         ALTENTRY(ddi_rep_putl)
         ALTENTRY(ddi_mem_rep_putl)
         ALTENTRY(ddi_mem_rep_put32)
-        jmp     *ACC_REP_PUTL(%rdi)
+        movq    ACC_REP_PUTL(%rdi), %rax
+        INDIRECT_JMP_REG(rax)
         SET_SIZE(ddi_rep_put32)
         SET_SIZE(ddi_rep_putl)
         SET_SIZE(ddi_mem_rep_putl)
         SET_SIZE(ddi_mem_rep_put32)
 

@@ -888,11 +905,12 @@
 
         ENTRY(ddi_rep_put64)
         ALTENTRY(ddi_rep_putll)
         ALTENTRY(ddi_mem_rep_putll)
         ALTENTRY(ddi_mem_rep_put64)
-        jmp     *ACC_REP_PUTLL(%rdi)
+        movq    ACC_REP_PUTLL(%rdi), %rax
+        INDIRECT_JMP_REG(rax)
         SET_SIZE(ddi_rep_put64)
         SET_SIZE(ddi_rep_putll)
         SET_SIZE(ddi_mem_rep_putll)
         SET_SIZE(ddi_mem_rep_put64)