Provide an s390 specific __stackleak_poison() implementation which is faster than the generic variant. For the original implementation with an enforced 4kb stackframe for the getpid() system call the system call overhead increases by a factor of 3 if the stackleak feature is enabled. Using the s390 mvc based variant this is reduced to an increase of 25% instead. This is within the expected area, since the mvc based implementation is more or less a memset64() variant which comes with similar results. See commit 0b77d6701cf8 ("s390: implement memset16, memset32 & memset64").
Unified · Split
| @@ -118,6 +118,41 @@ unsigned long vdso_size(void); · 117 unmodified lines | ||
| 118 | 118 | |
| 119 | 119 | #define HAVE_ARCH_PICK_MMAP_LAYOUT |
| 120 | 120 | |
| 121 | +#define __stackleak_poison __stackleak_poison | |
| 122 | +static __always_inline void __stackleak_poison(unsigned long erase_low, | |
| 123 | + unsigned long erase_high, | |
| 124 | + unsigned long poison) | |
| 125 | +{ | |
| 126 | + unsigned long tmp, count; | |
| 127 | + | |
| 128 | + count = erase_high - erase_low; | |
| 129 | + if (!count) | |
| 130 | + return; | |
| 131 | + asm volatile( | |
| 132 | + " cghi %[count],8\n" | |
| 133 | + " je 2f\n" | |
| 134 | + " aghi %[count],-(8+1)\n" | |
| 135 | + " srlg %[tmp],%[count],8\n" | |
| 136 | + " ltgr %[tmp],%[tmp]\n" | |
| 137 | + " jz 1f\n" | |
| 138 | + "0: stg %[poison],0(%[addr])\n" | |
| 139 | + " mvc 8(256-8,%[addr]),0(%[addr])\n" | |
| 140 | + " la %[addr],256(%[addr])\n" | |
| 141 | + " brctg %[tmp],0b\n" | |
| 142 | + "1: stg %[poison],0(%[addr])\n" | |
| 143 | + " larl %[tmp],3f\n" | |
| 144 | + " ex %[count],0(%[tmp])\n" | |
| 145 | + " j 4f\n" | |
| 146 | + "2: stg %[poison],0(%[addr])\n" | |
| 147 | + " j 4f\n" | |
| 148 | + "3: mvc 8(1,%[addr]),0(%[addr])\n" | |
| 149 | + "4:\n" | |
| 150 | + : [addr] "+&a" (erase_low), [count] "+&d" (count), [tmp] "=&a" (tmp) | |
| 151 | + : [poison] "d" (poison) | |
| 152 | + : "memory", "cc" | |
| 153 | + ); | |
| 154 | +} | |
| 155 | + | |
| 121 | 156 | /* |
| 122 | 157 | * Thread structure |
| 123 | 158 | */ |