From c6ddc76fd9c1c143ce72f52545e210de858c363d Mon Sep 17 00:00:00 2001 From: Scott Wood Date: Sat, 4 Aug 2007 22:22:52 -0500 Subject: [PATCH] GCC 4.2.1 fixes, plus a couple library functions. --- kernel/arch/x86/descriptors.cc | 8 +++---- kernel/core/thread.cc | 2 +- kernel/include/kern/console.h | 2 +- kernel/include/kern/libc.h | 2 ++ kernel/include/kern/sched.h | 2 +- kernel/io/console/misc.cc | 2 +- kernel/lib/libc.cc | 38 +++++++++++++++++++++++++++++++--- 7 files changed, 45 insertions(+), 11 deletions(-) diff --git a/kernel/arch/x86/descriptors.cc b/kernel/arch/x86/descriptors.cc index 65b146e..35e11f9 100644 --- a/kernel/arch/x86/descriptors.cc +++ b/kernel/arch/x86/descriptors.cc @@ -37,7 +37,7 @@ Descriptor x86_gdt[1024] = { user: 1, dpl: 0, present: 1, - limit_high: 0xff, + limit_high: 0xf, sw: 0, reserved: 0, opsize: 1, @@ -52,7 +52,7 @@ Descriptor x86_gdt[1024] = { user: 1, dpl: 0, present: 1, - limit_high: 0xff, + limit_high: 0xf, sw: 0, reserved: 0, opsize: 1, @@ -82,7 +82,7 @@ Descriptor x86_gdt[1024] = { user: 1, dpl: 3, present: 1, - limit_high: 0x7f, + limit_high: 0x7, sw: 0, reserved: 0, opsize: 1, @@ -97,7 +97,7 @@ Descriptor x86_gdt[1024] = { user: 1, dpl: 3, present: 1, - limit_high: 0x7f, + limit_high: 0x7, sw: 0, reserved: 0, opsize: 1, diff --git a/kernel/core/thread.cc b/kernel/core/thread.cc index 80451c0..3358f0f 100644 --- a/kernel/core/thread.cc +++ b/kernel/core/thread.cc @@ -245,7 +245,7 @@ namespace Threads { } Thread *Sched::new_thread(thread_func func, void *arg1, - void *arg2, char *name) + void *arg2, const char *name) { // Allocate a page for the thread's stack, and stick the thread // struct at the top of the stack. It's placed at the top rather diff --git a/kernel/include/kern/console.h b/kernel/include/kern/console.h index 34683a4..9da6977 100644 --- a/kernel/include/kern/console.h +++ b/kernel/include/kern/console.h @@ -12,7 +12,7 @@ namespace Console { } virtual void write(Array buf, u64 *len) = 0; - void write(char *data, size_t len); + void write(const char *data, size_t len); }; extern Console *primary_console; diff --git a/kernel/include/kern/libc.h b/kernel/include/kern/libc.h index 8bca620..05f398b 100644 --- a/kernel/include/kern/libc.h +++ b/kernel/include/kern/libc.h @@ -25,6 +25,8 @@ extern "C" { char *strcpy(char *dest, const char *src); char *strncpy(char *dest, const char *src, size_t len); + char *strcat(char *dest, const char *src); + char *strncat(char *dest, const char *src, size_t len); void bzero(void *b, size_t len); diff --git a/kernel/include/kern/sched.h b/kernel/include/kern/sched.h index 4d74338..6921621 100644 --- a/kernel/include/kern/sched.h +++ b/kernel/include/kern/sched.h @@ -82,7 +82,7 @@ namespace Threads { typedef void (*thread_func)(void *arg1, void *arg2); Thread *new_thread(thread_func func, void *arg1, void *arg2 = NULL, - char *name = NULL); + const char *name = NULL); void schedule(); void sched_new_thread(); diff --git a/kernel/io/console/misc.cc b/kernel/io/console/misc.cc index 518e38b..09f8623 100644 --- a/kernel/io/console/misc.cc +++ b/kernel/io/console/misc.cc @@ -18,7 +18,7 @@ namespace IO { namespace Console { - void Console::write(char *data, size_t len) + void Console::write(const char *data, size_t len) { u64 len64 = len; write(Array((octet *)data, len), &len64); diff --git a/kernel/lib/libc.cc b/kernel/lib/libc.cc index e571384..9c45857 100644 --- a/kernel/lib/libc.cc +++ b/kernel/lib/libc.cc @@ -15,6 +15,7 @@ #include #include +#include #include #include @@ -39,7 +40,7 @@ static const int num_signed = 0x4000; static const int has_precision = 0x8000; static void printf_string(char *buf, size_t &opos, size_t limit, - char *src, size_t len) + const char *src, size_t len) { if (opos < limit) { size_t olen = opos + len <= limit ? len : limit - opos; @@ -356,7 +357,7 @@ size_t vsnprintf(char *buf, size_t size, const char *str, va_list args) break; case 's': { - char *arg = va_arg(args, char *); + const char *arg = va_arg(args, const char *); if (!arg) arg = "(null)"; @@ -368,7 +369,7 @@ size_t vsnprintf(char *buf, size_t size, const char *str, va_list args) } case 'p': { - void *arg = va_arg(args, void *); + const void *arg = va_arg(args, const void *); printf_num(buf, opos, size, (ulong)arg, 16, fieldwidth, precision, flags); @@ -515,6 +516,37 @@ char *strncpy(char *dest, const char *src, size_t len) return orig; } +char *strcat(char *dest, const char *src) +{ + char *orig = dest; + dest += strlen(dest); + + do { + *dest = *src++; + } while (*dest++); + + return orig; +} + +char *strncat(char *dest, const char *src, size_t len) +{ + char *orig = dest; + int orig_len = strlen(dest); + + len -= orig_len; + dest += orig_len; + + while (len--) { + *dest = *src++; + + if (!*dest++) + break; + } + + bzero(dest, len); + return orig; +} + void bzero(void *b, size_t len) { char *c = static_cast(b); -- 2.39.2