diff mbox series

[BlueZ,v5,1/2] vhci: Add support to trigger devcoredump and read the dump file

Message ID 20230329230734.BlueZ.v5.1.I21ac5a143b0e42eef4ff71ef04ef0e53a294932a@changeid
State New
Headers show
Series [BlueZ,v5,1/2] vhci: Add support to trigger devcoredump and read the dump file | expand

Commit Message

Manish Mandlik March 30, 2023, 6:08 a.m. UTC
Add vhci support to trigger the hci devcoredump by writing to
force_devcoredump debugfs entry and read the generated devcoredump
file.

---

Changes in v5:
- Refactor vhci_read_devcd()

Changes in v4:
- Split into two patches - vhci patch and mgmt-tester patch

Changes in v3:
- Fix compiler warning for signed comparision in test_hci_devcd()

Changes in v2:
- Rename function names to *_devcd

 emulator/vhci.c | 61 ++++++++++++++++++++++++++++++++++++++++++++++++-
 emulator/vhci.h |  2 ++
 2 files changed, 62 insertions(+), 1 deletion(-)

Comments

bluez.test.bot@gmail.com March 30, 2023, 7:28 a.m. UTC | #1
This is automated email and please do not reply to this email!

Dear submitter,

Thank you for submitting the patches to the linux bluetooth mailing list.
This is a CI test results with your patch series:
PW Link:https://patchwork.kernel.org/project/bluetooth/list/?series=735224

---Test result---

Test Summary:
CheckPatch                    PASS      1.21 seconds
GitLint                       PASS      0.70 seconds
BuildEll                      PASS      27.03 seconds
BluezMake                     PASS      875.35 seconds
MakeCheck                     PASS      11.64 seconds
MakeDistcheck                 PASS      150.61 seconds
CheckValgrind                 PASS      247.98 seconds
CheckSmatch                   PASS      333.21 seconds
bluezmakeextell               PASS      98.98 seconds
IncrementalBuild              PASS      1423.83 seconds
ScanBuild                     PASS      1017.98 seconds



---
Regards,
Linux Bluetooth
diff mbox series

Patch

diff --git a/emulator/vhci.c b/emulator/vhci.c
index a12b11e0f..ecf1db3c7 100644
--- a/emulator/vhci.c
+++ b/emulator/vhci.c
@@ -22,6 +22,7 @@ 
 #include <sys/uio.h>
 #include <fcntl.h>
 #include <unistd.h>
+#include <dirent.h>
 
 #include "lib/bluetooth.h"
 #include "lib/hci.h"
@@ -32,6 +33,7 @@ 
 #include "vhci.h"
 
 #define DEBUGFS_PATH "/sys/kernel/debug/bluetooth"
+#define DEVCORE_PATH "/sys/class/devcoredump"
 
 struct vhci {
 	enum btdev_type type;
@@ -184,7 +186,7 @@  struct btdev *vhci_get_btdev(struct vhci *vhci)
 	return vhci->btdev;
 }
 
-static int vhci_debugfs_write(struct vhci *vhci, char *option, void *data,
+static int vhci_debugfs_write(struct vhci *vhci, char *option, const void *data,
 			      size_t len)
 {
 	char path[64];
@@ -267,3 +269,60 @@  int vhci_set_force_static_address(struct vhci *vhci, bool enable)
 	return vhci_debugfs_write(vhci, "force_static_address", &val,
 							sizeof(val));
 }
+
+int vhci_force_devcd(struct vhci *vhci, const void *data, size_t len)
+{
+	return vhci_debugfs_write(vhci, "force_devcoredump", data, len);
+}
+
+int vhci_read_devcd(struct vhci *vhci, void *buf, size_t size)
+{
+	DIR *dir;
+	struct dirent *entry;
+	char filename[PATH_MAX];
+	int fd;
+	int ret;
+
+	dir = opendir(DEVCORE_PATH);
+	if (dir == NULL)
+		return -errno;
+
+	while ((entry = readdir(dir)) != NULL) {
+		if (strstr(entry->d_name, "devcd"))
+			break;
+	}
+
+	if (entry == NULL) {
+		ret = -ENOENT;
+		goto close_dir;
+	}
+
+	sprintf(filename, DEVCORE_PATH "/%s/data", entry->d_name);
+	fd  = open(filename, O_RDWR);
+	if (fd < 0) {
+		ret = -errno;
+		goto close_dir;
+	}
+
+	ret = read(fd, buf, size);
+	if (ret < 0) {
+		ret = -errno;
+		goto close_file;
+	}
+
+	/* Once the devcoredump is read, write anything to it to mark it for
+	 * cleanup.
+	 */
+	if (write(fd, "0", 1) < 0) {
+		ret = -errno;
+		goto close_file;
+	}
+
+close_file:
+	close(fd);
+
+close_dir:
+	closedir(dir);
+
+	return ret;
+}
diff --git a/emulator/vhci.h b/emulator/vhci.h
index 6da56cb58..68eae4c4a 100644
--- a/emulator/vhci.h
+++ b/emulator/vhci.h
@@ -29,3 +29,5 @@  int vhci_set_msft_opcode(struct vhci *vhci, uint16_t opcode);
 int vhci_set_aosp_capable(struct vhci *vhci, bool enable);
 int vhci_set_emu_opcode(struct vhci *vhci, uint16_t opcode);
 int vhci_set_force_static_address(struct vhci *vhci, bool enable);
+int vhci_force_devcd(struct vhci *vhci, const void *data, size_t len);
+int vhci_read_devcd(struct vhci *vhci, void *buf, size_t size);