summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author项小羽 <[email protected]>2022-05-28 03:41:26 +0000
committer项小羽 <[email protected]>2022-05-28 03:41:26 +0000
commit6015080e9ea64f9304f17f610d736cb1ed52924f (patch)
tree3a69519f31176a17aa53d238dcfbfe851b7a583c
parentaf5f4bfb7200fc7cc2c1de5f19173500ecfbe527 (diff)
modify xstate.c, modify some exsample
-rw-r--r--arch/x86/kernel/fpu/xstate.c4
-rw-r--r--tools/uintr/sample/asm.c95
-rwxr-xr-xtools/uintr/sample/directbin1496104 -> 0 bytes
-rw-r--r--tools/uintr/sample/uintr.S24
-rwxr-xr-xtools/uintr/sample/uipi_samplebin1496160 -> 0 bytes
-rw-r--r--tools/uintr/sample/uipi_sample.c28
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
deleted file mode 100755
index 925cbcccbec1..000000000000
--- a/tools/uintr/sample/direct
+++ /dev/null
Binary files differ
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
deleted file mode 100755
index 371b1ca01a34..000000000000
--- a/tools/uintr/sample/uipi_sample
+++ /dev/null
Binary files differ
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