Date: Mon, 5 Apr 1999 18:34:16 +1000 From: Peter Jeremy <peter.jeremy@auss2.alcatel.com.au> To: dillon@apollo.backplane.com Cc: andreas@klemm.gtn.com, freebsd-current@FreeBSD.ORG Subject: Re: different systat -vmstat output when using egcs to compile kernel Message-ID: <99Apr5.182120est.40328@border.alcanet.com.au>
next in thread | raw e-mail | index | archive | help
Matthew Dillon <dillon@apollo.backplane.com> wrote:
>:The problem is that cpp (from gcc 2.8.1) _does_not_ remove
>:backslash-newline sequences from string constants (and maybe elsewhere
>:as well). This causes problems with the DEVICE_NAMES macro defined in
>:vector.h and used in vector.s.
...
> I suggest using ANSI string constants instead of K&R string constants.
>
> This is perfectly legal:
>
> char *s = "abcdefghi";
>
> char *s = "abc" "def" "ghi";
>
> char *s = "abc"
> "def"
> "ghi";
Currently we have something like:
#define DEVICE_NAMES "\
clk0 irqnn\0\
rtc0 irqnn\0\
pci irqnn\0\
pci irqnn\0\
pci irqnn\0\
"
.ascii DEVICE_NAMES
Which expands and assembles into something like:
000020: 5c 6e 63 6c 6b 30 20 69 72 71 6e 6e 00 5c 6e 72 |\nclk0 irqnn.\nr|
000030: 74 63 30 20 69 72 71 6e 6e 00 5c 6e 70 63 69 20 |tc0 irqnn.\npci |
000040: 69 72 71 6e 6e 00 5c 6e 70 63 69 20 69 72 71 6e |irqnn.\npci irqn|
Surprisingly, ANSI-C string concatenation _does_ work in gas, so the
following works correctly:
#define DEVICE_NAMES \
"clk0 irqnn\0" \
"rtc0 irqnn\0" \
"pci irqnn\0" \
"pci irqnn\0" \
"pci irqnn\0"
.ascii DEVICE_NAMES
This suggests that what's needed is a patch to config to make it
generate ANSI strings. The following (untested) patch should do it:
Index: mkglue.c
===================================================================
RCS file: /home/CVSROOT/./src/usr.sbin/config/mkglue.c,v
retrieving revision 1.14
diff -u -r1.14 mkglue.c
--- mkglue.c 1998/04/02 04:25:39 1.14
+++ mkglue.c 1999/04/05 08:31:55
@@ -368,17 +368,17 @@
fprintf(fp, " * Macros for interrupt vector routines\n");
fprintf(fp, " * Generated by config program\n");
fprintf(fp, " */\n\n");
- fprintf(fp, "#define\tDEVICE_NAMES \"\\\n");
- fprintf(fp, "clk0 irqnn\\0\\\n");
- fprintf(fp, "rtc0 irqnn\\0\\\n");
- fprintf(fp, "pci irqnn\\0\\\n");
- fprintf(fp, "pci irqnn\\0\\\n");
- fprintf(fp, "pci irqnn\\0\\\n");
- fprintf(fp, "pci irqnn\\0\\\n");
- fprintf(fp, "ipi irqnn\\0\\\n");
- fprintf(fp, "ipi irqnn\\0\\\n");
- fprintf(fp, "ipi irqnn\\0\\\n");
- fprintf(fp, "ipi irqnn\\0\\\n");
+ fprintf(fp, "#define\tDEVICE_NAMES \\\n");
+ fprintf(fp, "\"clk0 irqnn\\0\" \\\n");
+ fprintf(fp, "\"rtc0 irqnn\\0\" \\\n");
+ fprintf(fp, "\"pci irqnn\\0\" \\\n");
+ fprintf(fp, "\"pci irqnn\\0\" \\\n");
+ fprintf(fp, "\"pci irqnn\\0\" \\\n");
+ fprintf(fp, "\"pci irqnn\\0\" \\\n");
+ fprintf(fp, "\"ipi irqnn\\0\" \\\n");
+ fprintf(fp, "\"ipi irqnn\\0\" \\\n");
+ fprintf(fp, "\"ipi irqnn\\0\" \\\n");
+ fprintf(fp, "\"ipi irqnn\\0\" \\\n");
dev_id = 10;
vector_devtab(fp, "bio", &dev_id);
vector_devtab(fp, "tty", &dev_id);
@@ -386,7 +386,7 @@
vector_devtab(fp, "cam", &dev_id);
vector_devtab(fp, "ha", &dev_id);
vector_devtab(fp, "null", &dev_id);
- fprintf(fp, "\"\n\n");
+ fprintf(fp, "\n");
fprintf(fp, "#define\tNR_DEVICES\t%d\n", dev_id);
(void) fclose(fp);
moveifchanged(path("vector.h.new"), path("vector.h"));
@@ -406,7 +406,7 @@
mp = dp->d_conn;
if (mp == NULL || mp == TO_NEXUS || !eq(mp->d_name, "isa"))
continue;
- fprintf(fp, "%s%d irqnn\\0\\\n", dp->d_name, dp->d_unit);
+ fprintf(fp, "\"%s%d irqnn\\0\" \\\n", dp->d_name, dp->d_unit);
(*dev_idp)++;
}
}
Peter
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?99Apr5.182120est.40328>
