Quellcode durchsuchen

Kernel+LibC: Add a dbgputch() syscall and use it for userspace dbgprintf().

The "stddbg" stream was a cute idea but we never ended up using it in
practice, so let's simplify this and implement userspace dbgprintf() on top
of a simple dbgputch() syscall instead.

This makes debugging LibC startup a little bit easier. :^)
Andreas Kling vor 6 Jahren
Ursprung
Commit
3fce2fb205
6 geänderte Dateien mit 18 neuen und 15 gelöschten Zeilen
  1. 6 0
      Kernel/Process.cpp
  2. 1 0
      Kernel/Process.h
  3. 2 0
      Kernel/Syscall.cpp
  4. 2 1
      Kernel/Syscall.h
  5. 6 13
      Libraries/LibC/stdio.cpp
  6. 1 1
      Libraries/LibC/stdio.h

+ 6 - 0
Kernel/Process.cpp

@@ -2716,3 +2716,9 @@ int Process::sys$dump_backtrace()
     dump_backtrace();
     return 0;
 }
+
+int Process::sys$dbgputch(u8 ch)
+{
+    IO::out8(0xe9, ch);
+    return 0;
+}

+ 1 - 0
Kernel/Process.h

@@ -104,6 +104,7 @@ public:
     void die();
     void finalize();
 
+    int sys$dbgputch(u8);
     int sys$dump_backtrace();
     int sys$gettid();
     int sys$donate(int tid);

+ 2 - 0
Kernel/Syscall.cpp

@@ -70,6 +70,8 @@ static u32 handle(RegisterDump& regs, u32 function, u32 arg1, u32 arg2, u32 arg3
     case Syscall::SC_putch:
         Console::the().put_char(arg1 & 0xff);
         break;
+    case Syscall::SC_dbgputch:
+        return current->process().sys$dbgputch((u8)arg1);
     case Syscall::SC_sleep:
         return current->process().sys$sleep((unsigned)arg1);
     case Syscall::SC_usleep:

+ 2 - 1
Kernel/Syscall.h

@@ -116,7 +116,8 @@ struct timeval;
     __ENUMERATE_SYSCALL(fchown)                 \
     __ENUMERATE_SYSCALL(halt)                   \
     __ENUMERATE_SYSCALL(reboot)                 \
-    __ENUMERATE_SYSCALL(dump_backtrace)
+    __ENUMERATE_SYSCALL(dump_backtrace)         \
+    __ENUMERATE_SYSCALL(dbgputch)
 
 namespace Syscall {
 

+ 6 - 13
Libraries/LibC/stdio.cpp

@@ -18,7 +18,6 @@ static FILE __default_streams[4];
 FILE* stdin;
 FILE* stdout;
 FILE* stderr;
-FILE* stddbg;
 
 void init_FILE(FILE& fp, int fd, int mode)
 {
@@ -41,16 +40,9 @@ void __stdio_init()
     stdin = &__default_streams[0];
     stdout = &__default_streams[1];
     stderr = &__default_streams[2];
-    stddbg = &__default_streams[3];
     init_FILE(*stdin, 0, isatty(0) ? _IOLBF : _IOFBF);
     init_FILE(*stdout, 1, isatty(1) ? _IOLBF : _IOFBF);
     init_FILE(*stderr, 2, _IONBF);
-    int fd = open("/dev/debuglog", O_WRONLY | O_CLOEXEC);
-    if (fd < 0) {
-        perror("open /dev/debuglog");
-        ASSERT_NOT_REACHED();
-    }
-    init_FILE(*stddbg, fd, _IOLBF);
 }
 
 int setvbuf(FILE* stream, char* buf, int mode, size_t size)
@@ -337,14 +329,10 @@ void rewind(FILE* stream)
 
 int dbgprintf(const char* fmt, ...)
 {
-    // if this fails, you're printing too early.
-    ASSERT(stddbg);
-    int errno_backup = errno;
     va_list ap;
     va_start(ap, fmt);
-    int ret = vfprintf(stddbg, fmt, ap);
+    int ret = printf_internal([](char*&, char ch) { dbgputch(ch); }, nullptr, fmt, ap);
     va_end(ap);
-    errno = errno_backup;
     return ret;
 }
 
@@ -495,6 +483,11 @@ int rename(const char* oldpath, const char* newpath)
     __RETURN_WITH_ERRNO(rc, rc, -1);
 }
 
+void dbgputch(char ch)
+{
+    syscall(SC_dbgputch, ch);
+}
+
 char* tmpnam(char*)
 {
     ASSERT_NOT_REACHED();

+ 1 - 1
Libraries/LibC/stdio.h

@@ -43,7 +43,6 @@ typedef struct __STDIO_FILE FILE;
 extern FILE* stdin;
 extern FILE* stdout;
 extern FILE* stderr;
-extern FILE* stddbg;
 
 typedef size_t fpos_t;
 
@@ -79,6 +78,7 @@ int vsnprintf(char* buffer, size_t, const char* fmt, va_list);
 int fprintf(FILE*, const char* fmt, ...);
 int printf(const char* fmt, ...);
 int dbgprintf(const char* fmt, ...);
+void dbgputch(char);
 int sprintf(char* buffer, const char* fmt, ...);
 int snprintf(char* buffer, size_t, const char* fmt, ...);
 int putchar(int ch);