lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20210529200029.205306-34-jim.cromie@gmail.com>
Date:   Sat, 29 May 2021 14:00:28 -0600
From:   Jim Cromie <jim.cromie@...il.com>
To:     jbaron@...mai.com, gregkh@...uxfoundation.org,
        linux-kernel@...r.kernel.org
Cc:     Jim Cromie <jim.cromie@...il.com>
Subject: [RFC PATCH v6 33/34] dyndbg: pack pr-debug site-recs in builtin modules

This extends HEAD~1 by packing not just into the each module's
sub-vector (slice of builtin dyndbg_sites[] vector), but into
the whole vector.

__ddebug_add_module() gets 2 new parameters to enable this; it
re-writes the packed_sites[] vector with each unique site record, and
tracks index of the last record written in packed_base.

Signed-off-by: Jim Cromie <jim.cromie@...il.com>
---
 lib/dynamic_debug.c | 36 ++++++++++++++++++++++++------------
 1 file changed, 24 insertions(+), 12 deletions(-)

diff --git a/lib/dynamic_debug.c b/lib/dynamic_debug.c
index 43f4c82d24c3..66b48f1cb2d0 100644
--- a/lib/dynamic_debug.c
+++ b/lib/dynamic_debug.c
@@ -1069,13 +1069,16 @@ static const struct proc_ops proc_fops = {
  */
 static int __ddebug_add_module(struct _ddebug *tab, struct _ddebug_site *sites,
 			       unsigned int numdbgs, unsigned int base,
-			       const char *modname)
+			       const char *modname,
+			       struct _ddebug_site *packed_sites,
+			       unsigned int *packed_base)
 {
 	struct ddebug_table *dt;
 	union _ddebug_header *dh = (union _ddebug_header *) &tab[0];
 	int i, j;
 
-	v3pr_info("add-module: %s.%d sites\n", modname, numdbgs);
+	v3pr_info("add-module: %s.%d sites, to %d->%d\n", modname, numdbgs,
+		  base, *packed_base);
 
 	if (numdbgs && is_dyndbg_header_pair(dh, sites)) {
 
@@ -1116,12 +1119,13 @@ static int __ddebug_add_module(struct _ddebug *tab, struct _ddebug_site *sites,
 	for (i = j = 0; i < numdbgs; i++) {
 		tab[i]._back = base + i; /* index back to header */
 
-		/* find 1st row with new fn, copy it to stack on j */
-		if (sites[i].function != sites[j].function)
-			memcpy((void *) &sites[++j], (void *) &sites[i],
-			       sizeof(struct _ddebug_site));
-
-		tab[i]._map = base + j;
+		/* find 1st row with new fn, copy it to stack on packed_base */
+		if (sites[i].function != packed_sites[*packed_base].function) {
+			j++;
+			memcpy((void *) &packed_sites[++(*packed_base)],
+			       (void *) &sites[i], sizeof(struct _ddebug_site));
+		}
+		tab[i]._map = *packed_base;
 
 		v3pr_info(" %d %d %d %d %s.%s.%d\n", i, j, tab[i]._back, tab[i]._map,
 			  modname, sites[i].function, tab[i].lineno);
@@ -1140,7 +1144,10 @@ static int __ddebug_add_module(struct _ddebug *tab, struct _ddebug_site *sites,
 int ddebug_add_module(struct _ddebug *tab, struct _ddebug_site *sites,
 		      unsigned int numdbgs, const char *modname)
 {
-	return __ddebug_add_module(tab, sites, numdbgs, 0, modname);
+	unsigned int packed_base = 0;	/* skip the header */
+
+	return __ddebug_add_module(tab, sites, numdbgs, 0, modname,
+				   sites, &packed_base);
 }
 
 /* helper for ddebug_dyndbg_(boot|module)_param_cb */
@@ -1253,10 +1260,12 @@ static int __init dynamic_debug_init(void)
 {
 	struct _ddebug *iter, *iter_mod_start;
 	struct _ddebug_site *site, *site_mod_start;
+
 	const char *modname = NULL;
 	char *cmdline;
 	int ret = 0;
 	int i, site_ct = 0, modct = 0, mod_index = 0;
+	unsigned int site_base;
 
 	if (&__start___dyndbg == &__stop___dyndbg) {
 		if (IS_ENABLED(CONFIG_DYNAMIC_DEBUG)) {
@@ -1272,7 +1281,7 @@ static int __init dynamic_debug_init(void)
 	site = site_mod_start = __start___dyndbg_sites;
 	modname = site->modname;
 
-	for (i = 0; iter < __stop___dyndbg; iter++, site++, i++) {
+	for (site_base = i = 0; iter < __stop___dyndbg; iter++, site++, i++) {
 
 		SITE_CHK_(BUG_ON(site != iter->site));
 
@@ -1280,7 +1289,8 @@ static int __init dynamic_debug_init(void)
 			modct++;
 
 			ret = __ddebug_add_module(iter_mod_start, site_mod_start,
-						  site_ct, mod_index, modname);
+						  site_ct, mod_index, modname,
+						  __start___dyndbg_sites, &site_base);
 			if (ret)
 				goto out_err;
 
@@ -1292,7 +1302,9 @@ static int __init dynamic_debug_init(void)
 		}
 		site_ct++;
 	}
-	ret = __ddebug_add_module(iter_mod_start, site_mod_start, site_ct, mod_index, modname);
+	ret = __ddebug_add_module(iter_mod_start, site_mod_start,
+				  site_ct, mod_index, modname,
+				  __start___dyndbg_sites, &site_base);
 	if (ret)
 		goto out_err;
 
-- 
2.31.1

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ