diff options
| author | 项小羽 <[email protected]> | 2022-05-28 03:41:26 +0000 |
|---|---|---|
| committer | 项小羽 <[email protected]> | 2022-05-28 03:41:26 +0000 |
| commit | 6015080e9ea64f9304f17f610d736cb1ed52924f (patch) | |
| tree | 3a69519f31176a17aa53d238dcfbfe851b7a583c | |
| parent | af5f4bfb7200fc7cc2c1de5f19173500ecfbe527 (diff) | |
modify xstate.c, modify some exsample
| -rw-r--r-- | arch/x86/kernel/fpu/xstate.c | 4 | ||||
| -rw-r--r-- | tools/uintr/sample/asm.c | 95 | ||||
| -rwxr-xr-x | tools/uintr/sample/direct | bin | 1496104 -> 0 bytes | |||
| -rw-r--r-- | tools/uintr/sample/uintr.S | 24 | ||||
| -rwxr-xr-x | tools/uintr/sample/uipi_sample | bin | 1496160 -> 0 bytes | |||
| -rw-r--r-- | tools/uintr/sample/uipi_sample.c | 28 |
6 files changed, 134 insertions, 17 deletions
diff --git a/arch/x86/kernel/fpu/xstate.c b/arch/x86/kernel/fpu/xstate.c index ab19403effb0..17e51ea5007f 100644 --- a/arch/x86/kernel/fpu/xstate.c +++ b/arch/x86/kernel/fpu/xstate.c @@ -867,7 +867,9 @@ static void *__raw_xsave_addr(struct xregs_state *xsave, int xfeature_nr) WARN_ON_FPU(1); return NULL; } - + if(XFEATURE_UINTR == xfeature_nr){ // 改 + printk("the uintr xsave offset ===== 0x%x",xstate_comp_offsets[xfeature_nr]); + } return (void *)xsave + xstate_comp_offsets[xfeature_nr]; } /* diff --git a/tools/uintr/sample/asm.c b/tools/uintr/sample/asm.c new file mode 100644 index 000000000000..8d7315601ba5 --- /dev/null +++ b/tools/uintr/sample/asm.c @@ -0,0 +1,95 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright (c) 2020, Intel Corporation. + * + * Sohil Mehta <[email protected]> + */ +#define _GNU_SOURCE +#include <pthread.h> +#include <stdio.h> +#include <stdlib.h> +#include <syscall.h> +#include <unistd.h> +#include <x86gprintrin.h> + +#define __NR_uintr_register_handler 449 +#define __NR_uintr_unregister_handler 450 +#define __NR_uintr_create_fd 451 +#define __NR_uintr_register_sender 452 +#define __NR_uintr_unregister_sender 453 + +/* For simiplicity, until glibc support is added */ +#define uintr_register_handler(handler, flags) syscall(__NR_uintr_register_handler, handler, flags) +#define uintr_unregister_handler(flags) syscall(__NR_uintr_unregister_handler, flags) +#define uintr_create_fd(vector, flags) syscall(__NR_uintr_create_fd, vector, flags) +#define uintr_register_sender(fd, flags) syscall(__NR_uintr_register_sender, fd, flags) +#define uintr_unregister_sender(fd, flags) syscall(__NR_uintr_unregister_sender, fd, flags) + +unsigned int uintr_received; +unsigned int uintr_fd; + +void __attribute__ ((interrupt)) uintr_handler(struct __uintr_frame *ui_frame, + unsigned long long vector) +{ + static const char print[] = "\t-- User Interrupt handler --\n"; + + write(STDOUT_FILENO, print, sizeof(print) - 1); + printf("- - - - user: now in the handler function\n"); + uintr_received = 1; +} + +void *sender_thread(void *arg) +{ + int uipi_index; + + uipi_index = uintr_register_sender(uintr_fd, 0); + if (uipi_index < 0) { + printf("Sender register error\n"); + exit(EXIT_FAILURE); + } + + printf("- - - - Sending IPI from sender thread index:%d \n", uipi_index); + _senduipi(uipi_index); + + uintr_unregister_sender(uintr_fd, 0); + + return NULL; +} + +int main(int argc, char *argv[]) +{ + printf("%p \n",main); + pthread_t pt; + int ret; + + int ret1 = uintr_register_handler(uintr_handler, 0); + + printf("regeister returned %d\n",ret1); + // exit(EXIT_FAILURE); + + ret = uintr_create_fd(0, 0); + printf("create fd returned %d\n",ret); + // exit(EXIT_FAILURE); + + uintr_fd = ret; + + _stui(); + printf("- - - - Receiver enabled interrupts\n"); + + if (pthread_create(&pt, NULL, &sender_thread, NULL)) { + printf("Error creating sender thread\n"); + exit(EXIT_FAILURE); + } + + /* Do some other work */ + while (!uintr_received) + usleep(100); + + printf("- - - - user receive uintr, joining thread\n"); + pthread_join(pt, NULL); + close(uintr_fd); + uintr_unregister_handler(0); + + printf("Success\n"); + exit(EXIT_SUCCESS); +} diff --git a/tools/uintr/sample/direct b/tools/uintr/sample/direct Binary files differdeleted file mode 100755 index 925cbcccbec1..000000000000 --- a/tools/uintr/sample/direct +++ /dev/null diff --git a/tools/uintr/sample/uintr.S b/tools/uintr/sample/uintr.S new file mode 100644 index 000000000000..7f507e3c47ce --- /dev/null +++ b/tools/uintr/sample/uintr.S @@ -0,0 +1,24 @@ +.section .text +.global senduipi +_senduipi: + movq %rdi, %rax + .byte 0xf3 + .byte 0x0f + .byte 0xc7 + .byte 0xf0 + ret +.global uiret +_uiret: + .byte 0xf3 + .byte 0x0f + .byte 0x01 + .byte 0xec + ret +.global stui +_stui: + .byte 0xf3 + .byte 0x0f + .byte 0x01 + .byte 0xef + ret + diff --git a/tools/uintr/sample/uipi_sample b/tools/uintr/sample/uipi_sample Binary files differdeleted file mode 100755 index 371b1ca01a34..000000000000 --- a/tools/uintr/sample/uipi_sample +++ /dev/null diff --git a/tools/uintr/sample/uipi_sample.c b/tools/uintr/sample/uipi_sample.c index cc950c5359d0..d6757820ffc3 100644 --- a/tools/uintr/sample/uipi_sample.c +++ b/tools/uintr/sample/uipi_sample.c @@ -1,9 +1,3 @@ -// SPDX-License-Identifier: GPL-2.0+ -/* - * Copyright (c) 2020, Intel Corporation. - * - * Sohil Mehta <[email protected]> - */ #define _GNU_SOURCE #include <pthread.h> #include <stdio.h> @@ -47,7 +41,7 @@ void *sender_thread(void *arg) exit(EXIT_FAILURE); } - printf("Sending IPI from sender thread index:%d \n", uipi_index); + printf("Sending IPI from sender thread\n"); _senduipi(uipi_index); uintr_unregister_sender(uintr_fd, 0); @@ -60,14 +54,16 @@ int main(int argc, char *argv[]) pthread_t pt; int ret; - int ret1 = uintr_register_handler(uintr_handler, 0); - - printf("regeister returned %d\n",ret1); - // exit(EXIT_FAILURE); + if (uintr_register_handler(uintr_handler, 0)) { + printf("Interrupt handler register error\n"); + exit(EXIT_FAILURE); + } ret = uintr_create_fd(0, 0); - printf("create fd returned %d\n",ret); - // exit(EXIT_FAILURE); + if (ret < 0) { + printf("Interrupt vector allocation error\n"); + exit(EXIT_FAILURE); + } uintr_fd = ret; @@ -80,8 +76,8 @@ int main(int argc, char *argv[]) } /* Do some other work */ - //while (!uintr_received) - usleep(10); + while (!uintr_received) + usleep(1); pthread_join(pt, NULL); close(uintr_fd); @@ -89,4 +85,4 @@ int main(int argc, char *argv[]) printf("Success\n"); exit(EXIT_SUCCESS); -} +}
\ No newline at end of file |
