X-Git-Url: https://git.wh0rd.org/?p=ICEs.git;a=blobdiff_plain;f=388835%2Faesni-intel_glue.i.7;fp=388835%2Faesni-intel_glue.i.7;h=7cb9bebf11bf8733e390dfa6edb2ace6b95da565;hp=0000000000000000000000000000000000000000;hb=bd3239d2bbe0de3a200b266503e3330b1e391489;hpb=dbff64cb4b7530861c2309c794efdd4e0cf47a23 diff --git a/388835/aesni-intel_glue.i.7 b/388835/aesni-intel_glue.i.7 new file mode 100644 index 0000000..7cb9beb --- /dev/null +++ b/388835/aesni-intel_glue.i.7 @@ -0,0 +1,163 @@ +struct list_head { +}; +int __static_cpu_has(unsigned short bit) +{ + asm goto ("1: jmp %l[t_no]\n" "2:\n" ".section .altinstructions,\"a\"\n" + " " ".balign 4" " " "\n" " " ".long" " " "1b\n" " " ".long" + " " "0\n" " .word %P0\n" " .byte 2b - 1b\n" " .byte 0\n" + ".previous\n"::"i" (bit)::t_no); + return 1; + t_no:return 0; +} + +struct cpuinfo_x86 { + unsigned int x86_capability[10]; +} __attribute__ ((__aligned__((1 << (6))))); +extern struct cpuinfo_x86 boot_cpu_data; +struct i387_fxsave_struct { + unsigned short swd; +} __attribute__ ((aligned(16))); +struct xsave_hdr_struct { + unsigned long long xstate_bv; +} __attribute__ ((packed)); +struct xsave_struct { + struct xsave_hdr_struct xsave_hdr; +} __attribute__ ((packed, aligned(64))); +union thread_xstate { + struct i387_fxsave_struct fxsave; + struct xsave_struct xsave; +}; +struct fpu { + union thread_xstate *state; +}; +struct cipher_alg { + void (*cia_decrypt) (struct crypto_tfm * tfm, unsigned char *dst, + const unsigned char *src); +}; +struct crypto_alg { + struct list_head cra_list; + union { + struct cipher_alg cipher; + } cra_u; +}; +static __attribute__ ((always_inline)) __attribute__ ((pure)) +int use_xsave(void) +{ + return __builtin_constant_p(constant_test_bit(154, (unsigned long *)((&boot_cpu_data)->x86_capability))) +? +( +( +__builtin_constant_p(((154))) ? constant_test_bit(((154)), ((unsigned long *)((&boot_cpu_data)->x86_capability))) +: variable_test_bit(((154)), ((unsigned long *)((&boot_cpu_data)->x86_capability))))) +: __builtin_constant_p((154)) ? __static_cpu_has((154)) : (__builtin_constant_p((154)) && (((4) == 0 && (1UL << (26) & ((1 << (0 & 31)) | (1 << ((6) & 31)) | (1 << ((8) & 31)) | (1 << ((15) & 31)) | 0))) || ((4) == 1 && (1UL << (26) & 0)) || ((4) == 2 && (1UL << (26) & 0)) || ((4) == 3 && (1UL << (26) & 0)) || ((4) == 4 && (1UL << (26) & 0)) || ((4) == 5 && (1UL << (26) & 0)) || ((4) == 6 && (1UL << (26) & 0)) || ((4) == 7 && (1UL << (26) & 0)) || ((4) == 8 && (1UL << (26) & 0)) || ((4) == 9 && (1UL << (26) & 0))) ? 1 : (__builtin_constant_p(((154))) ? constant_test_bit(((154)), ((unsigned long *)((&boot_cpu_data)->x86_capability))) : variable_test_bit(((154)), ((unsigned long *)((&boot_cpu_data)->x86_capability)))) +); +} + +static inline __attribute__ ((always_inline)) __attribute__ ((always_inline)) + __attribute__ ((pure)) +int use_fxsr(void) +{ + return __builtin_constant_p + (variable_test_bit(24, (unsigned long *)((&boot_cpu_data)->x86_capability))) + ? +variable_test_bit(24, (unsigned long *)((&boot_cpu_data)->x86_capability)) : + __static_cpu_has(24) +; +} + +static inline __attribute__ ((always_inline)) +void fpu_save_init(struct fpu *fpu) +{ + if (__builtin_constant_p(use_xsave())? use_xsave() : use_xsave()) { + if (__builtin_constant_p + (((!(fpu->state->xsave.xsave_hdr. + xstate_bv & 0x1)))) ? ! !((!(fpu->state->xsave. + xsave_hdr. + xstate_bv & 0x1))) : ( { + ! !((!(fpu->state->xsave.xsave_hdr.xstate_bv & 0x1)));} + )) + return; + } else if (use_fxsr()) { + } + if (__builtin_constant_p + ((((__builtin_constant_p(fpu->state->fxsave.swd & (1 << 7)) ? + ! !(fpu->state->fxsave.swd & (1 << 7)) : ( { + __builtin_expect(! ! + (fpu-> + state-> + fxsave. + swd + & (1 + << + 7)), + 1);} + )))))? + ! !(((__builtin_constant_p(fpu->state->fxsave.swd & (1 << 7)) ? + ! !(fpu->state->fxsave.swd & (1 << 7)) : ( { + __builtin_expect(! ! + (fpu-> + state-> + fxsave. + swd + & + (1 + << + 7)), + 1);} + )))): ( { + int ______r; + ______r = + ! !(((__builtin_constant_p(fpu->state->fxsave.swd & (1 << 7)) + ? ! !(fpu->state->fxsave.swd & (1 << 7)) : ( { + ______r = + __builtin_expect + (! ! + (fpu-> + state-> + fxsave. + swd & (1 + << + 7)), + 1);} + ))));} + )) + asm volatile ("fnclex"); +} + +static __attribute__ ((always_inline)) +void __save_init_fpu(void) +{ + fpu_save_init(0); +} + +static __attribute__ ((always_inline)) +void kernel_fpu_begin(void) +{ + __save_init_fpu(); +} + +static void aes_decrypt(void) +{ + if (!irq_fpu_usable()) + crypto_aes_decrypt_x86(0); + else + kernel_fpu_begin(); +} + +static struct crypto_alg aesni_alg = { + .cra_list = { + &aesni_alg.cra_list, &aesni_alg.cra_list} + ,.cra_u = { + .cipher = { + .cia_decrypt = aes_decrypt} + } +}; + +static struct crypto_alg ablk_ecb_alg = { +}; + +int aesni_init(void) +{ + if (! !crypto_register_alg(&aesni_alg)) + crypto_unregister_alg(&ablk_ecb_alg); +}