This is the mail archive of the newlib@sourceware.org mailing list for the newlib project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: libgloss/arm: monitor_stderr [PATCH]


2005/8/5, Nick Clifton <nickc@redhat.com>:
> Assuming that nobody from the kernel world has a problem with this, then
> I would have no problem recommending that Jeff accepts it - with one
> proviso however:
... 
> I think that you ought to add a comment to the code explaining the
> situation (ie opening the same file name with different modes in order
> to allow the kernel to choose whether to use one or two file
> descriptors).  Otherwise future programmers might come along and think
> that this is a bug.
> 
> Cheers
>    Nick

I've added an explanatory comment.

Cheers,
Shaun

2005-08-04  Shaun Jackman  <sjackman@gmail.com>

	* libgloss/syscalls.c (initialise_monitor_handles): Set
	monitor_stderr to the result of SWI_open(":tt", "a")
	instead of simply duplicating stdout.

Index: libgloss/arm/syscalls.c
===================================================================
RCS file: /cvs/src/src/libgloss/arm/syscalls.c,v
retrieving revision 1.6
diff -u -r1.6 syscalls.c
--- libgloss/arm/syscalls.c	2 Aug 2005 19:17:21 -0000	1.6
+++ libgloss/arm/syscalls.c	15 Aug 2005 23:05:07 -0000
@@ -133,6 +133,16 @@
 {
   int i;
   
+  /* Open the standard file descriptors by opening the special
+   * teletype device, ":tt", read-only to obtain a descritpor for
+   * standard input and write-only to obtain a descriptor for standard
+   * output. Finally, open ":tt" in append mode to obtain a descriptor
+   * for standard error. Since this is a write mode, most kernels will
+   * probably return the same value as for standard output, but the
+   * kernel can differentiate the two using the mode flag and return a
+   * different descriptor for standard error.
+   */
+
 #ifdef ARM_RDI_MONITOR
   int volatile block[3];
   
@@ -144,7 +154,12 @@
   block[0] = (int) ":tt";
   block[2] = 3;     /* length of filename */
   block[1] = 4;     /* mode "w" */
-  monitor_stdout = monitor_stderr = do_AngelSWI
(AngelSWI_Reason_Open, (void *) block);
+  monitor_stdout = do_AngelSWI (AngelSWI_Reason_Open, (void *) block);
+
+  block[0] = (int) ":tt";
+  block[2] = 3;     /* length of filename */
+  block[1] = 8;     /* mode "a" */
+  monitor_stderr = do_AngelSWI (AngelSWI_Reason_Open, (void *) block);
 #else
   int fh;
   const char * name;
@@ -161,7 +176,14 @@
        : "=r"(fh)
        : "i" (SWI_Open),"r"(name)
        : "r0","r1");
-  monitor_stdout = monitor_stderr = fh;
+  monitor_stdout = fh;
+
+  name = ":tt";
+  asm ("mov r0,%2; mov r1, #8; swi %a1; mov %0, r0"
+       : "=r"(fh)
+       : "i" (SWI_Open),"r"(name)
+       : "r0","r1");
+  monitor_stderr = fh;
 #endif
 
   for (i = 0; i < MAX_OPEN_FILES; i ++)
@@ -171,6 +193,8 @@
   openfiles[0].pos = 0;
   openfiles[1].handle = monitor_stdout;
   openfiles[1].pos = 0;
+  openfiles[2].handle = monitor_stderr;
+  openfiles[2].pos = 0;
 }
 
 static int

Attachment: libgloss-stderr.diff
Description: Text document


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]