aboutsummaryrefslogtreecommitdiff
path: root/sim
diff options
context:
space:
mode:
Diffstat (limited to 'sim')
-rw-r--r--sim/ppc/ChangeLog8
-rw-r--r--sim/ppc/emul_netbsd.c5
-rw-r--r--sim/ppc/emul_unix.c5
-rw-r--r--sim/ppc/tree.c45
-rw-r--r--sim/ppc/tree.h4
5 files changed, 65 insertions, 2 deletions
diff --git a/sim/ppc/ChangeLog b/sim/ppc/ChangeLog
index a285c7a..4268294 100644
--- a/sim/ppc/ChangeLog
+++ b/sim/ppc/ChangeLog
@@ -1,3 +1,11 @@
+2006-02-01 Mark Mitchell <mark@codesourcery.com>
+
+ * emul_netbsd.c (emul_netbsd_create): Quote file-name property.
+ * emul_unix.c (emul_unix_create): Likewise.
+ * tree.c (libiberty.h): Include it.
+ (tree_quote_property): New function.
+ * tree.h (tree_quote_property): Declare.
+
2006-01-25 Mark Mitchell <mark@codesourcery.com>
* words.h (natural32): Define as "int".
diff --git a/sim/ppc/emul_netbsd.c b/sim/ppc/emul_netbsd.c
index 0069064..f81c9cb 100644
--- a/sim/ppc/emul_netbsd.c
+++ b/sim/ppc/emul_netbsd.c
@@ -1383,6 +1383,7 @@ emul_netbsd_create(device *root,
int elf_binary;
os_emul_data *bsd_data;
device *vm;
+ char *filename;
/* check that this emulation is really for us */
if (name != NULL && strcmp(name, "netbsd") != 0)
@@ -1417,8 +1418,10 @@ emul_netbsd_create(device *root,
(unsigned long)(top_of_stack - stack_size));
tree_parse(vm, "./nr-bytes 0x%x", stack_size);
+ filename = tree_quote_property (bfd_get_filename(image));
tree_parse(root, "/openprom/vm/map-binary/file-name %s",
- bfd_get_filename(image));
+ filename);
+ free (filename);
/* finish the init */
tree_parse(root, "/openprom/init/register/pc 0x%lx",
diff --git a/sim/ppc/emul_unix.c b/sim/ppc/emul_unix.c
index 1f63435..0fa5d3f 100644
--- a/sim/ppc/emul_unix.c
+++ b/sim/ppc/emul_unix.c
@@ -951,6 +951,7 @@ emul_unix_create(device *root,
int elf_binary;
os_emul_data *data;
device *vm;
+ char *filename;
/* merge any emulation specific entries into the device tree */
@@ -979,8 +980,10 @@ emul_unix_create(device *root,
(unsigned long)(top_of_stack - stack_size));
tree_parse(vm, "./nr-bytes 0x%x", stack_size);
+ filename = tree_quote_property (bfd_get_filename(image));
tree_parse(root, "/openprom/vm/map-binary/file-name %s",
- bfd_get_filename(image));
+ filename);
+ free (filename);
/* finish the init */
tree_parse(root, "/openprom/init/register/pc 0x%lx",
diff --git a/sim/ppc/tree.c b/sim/ppc/tree.c
index d4cfb71..4338cb0 100644
--- a/sim/ppc/tree.c
+++ b/sim/ppc/tree.c
@@ -45,6 +45,7 @@
#include <ctype.h>
+#include "libiberty.h"
/* manipulate/lookup device names */
@@ -625,6 +626,50 @@ parse_integer_property(device *current,
}
}
+/* PROPERTY_VALUE is a raw property value. Quote it as required by
+ parse_string_property. It is the caller's responsibility to free
+ the memory returned. */
+
+EXTERN_TREE\
+(char *)
+tree_quote_property(const char *property_value)
+{
+ char *p;
+ char *ret;
+ const char *chp;
+ int quotees;
+
+ /* Count characters needing quotes in PROPERTY_VALUE. */
+ quotees = 0;
+ for (chp = property_value; *chp; ++chp)
+ if (*chp == '\\' || *chp == '"')
+ ++quotees;
+
+ ret = (char *) xmalloc (strlen (property_value)
+ + 2 /* quotes */
+ + quotees
+ + 1 /* terminator */);
+
+ p = ret;
+ /* Add the opening quote. */
+ *p++ = '"';
+ /* Copy the value. */
+ for (chp = property_value; *chp; ++chp)
+ if (*chp == '\\' || *chp == '"')
+ {
+ /* Quote this character. */
+ *p++ = '\\';
+ *p++ = *chp;
+ }
+ else
+ *p++ = *chp;
+ /* Add the closing quote. */
+ *p++ = '"';
+ /* Terminate the string. */
+ *p++ = '\0';
+
+ return ret;
+}
/* <string> ... */
diff --git a/sim/ppc/tree.h b/sim/ppc/tree.h
index 46590cb..2ed7fd0 100644
--- a/sim/ppc/tree.h
+++ b/sim/ppc/tree.h
@@ -42,6 +42,10 @@
*/
EXTERN_TREE\
+(char*) tree_quote_property
+(const char *property_value);
+
+EXTERN_TREE\
(device *) tree_parse
(device *root,
const char *fmt,