From 9b0009a8880d5b1c875e6422688905197cbb4265 Mon Sep 17 00:00:00 2001 From: Jan Nieuwenhuizen Date: Tue, 12 Mar 2019 23:58:52 +0100 Subject: [PATCH] hurd: Add malloc. * include/gnu/syscall.h (__vm_allocate): New value. (__vm_allocate): Declare. * lib/gnu/malloc.c: New file. * lib/stdlib/malloc.c[__GNU__]: Disable. See FIXME. * lib/gnu/vm-allocate.c: New file. * build-aux/configure-lib.sh (libc_SOURCES): Add it. --- build-aux/configure-lib.sh | 2 + include/gnu/syscall.h | 2 + lib/gnu/malloc.c | 34 +++++++++++++++++ lib/gnu/vm-allocate.c | 76 ++++++++++++++++++++++++++++++++++++++ lib/gnu/x86-mes-gcc/crt1.c | 3 +- lib/stdlib/malloc.c | 10 +++++ 6 files changed, 125 insertions(+), 2 deletions(-) create mode 100644 lib/gnu/malloc.c create mode 100644 lib/gnu/vm-allocate.c diff --git a/build-aux/configure-lib.sh b/build-aux/configure-lib.sh index 7baef702..ed0e23bb 100644 --- a/build-aux/configure-lib.sh +++ b/build-aux/configure-lib.sh @@ -162,6 +162,8 @@ lib/gnu/_read.c lib/gnu/dir-lookup.c lib/gnu/fd-read.c lib/gnu/io-read.c +lib/gnu/malloc.c +lib/gnu/vm-allocate.c lib/stub/access.c lib/stub/brk.c lib/stub/chmod.c diff --git a/include/gnu/syscall.h b/include/gnu/syscall.h index 26bd52dc..8d20f9da 100644 --- a/include/gnu/syscall.h +++ b/include/gnu/syscall.h @@ -34,6 +34,7 @@ enum { SYS__task_terminate = 2008, + SYS__vm_allocate = 2021, SYS__vm_statistics = 2030, SYS__task_get_special_port = 2058, }; @@ -129,6 +130,7 @@ kern_return_t __syscall_put (mach_port_t port, int sys_call, mach_msg_header_t * // mach.defs kern_return_t __task_terminate (mach_port_t task); kern_return_t __task_get_special_port (mach_port_t task, int which, mach_port_t *port); +kern_return_t __vm_allocate (mach_port_t task, vm_address_t *address, vm_size_t size, boolean_t anywhere); kern_return_t __vm_statistics (mach_port_t task, vm_statistics_data_t *vm_stats); // process.defs diff --git a/lib/gnu/malloc.c b/lib/gnu/malloc.c new file mode 100644 index 00000000..eb228508 --- /dev/null +++ b/lib/gnu/malloc.c @@ -0,0 +1,34 @@ +/* -*-comment-start: "//";comment-end:""-*- + * GNU Mes --- Maxwell Equations of Software + * Copyright © 2019 Jan (janneke) Nieuwenhuizen + * + * This file is part of GNU Mes. + * + * GNU Mes is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or (at + * your option) any later version. + * + * GNU Mes is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNU Mes. If not, see . + */ + +#include +#include +#include + +void * +malloc (size_t size) +{ + vm_address_t where; + vm_size_t amount = size; + kern_return_t e = __vm_allocate (mach_task_self (), &where, (vm_size_t) amount, 1); + if (e) + return 0; + return (void*) where; +} diff --git a/lib/gnu/vm-allocate.c b/lib/gnu/vm-allocate.c new file mode 100644 index 00000000..46095ee6 --- /dev/null +++ b/lib/gnu/vm-allocate.c @@ -0,0 +1,76 @@ +/* -*-comment-start: "//";comment-end:""-*- + * GNU Mes --- Maxwell Equations of Software + * Copyright © 2019 Jan (janneke) Nieuwenhuizen + * + * This file is part of GNU Mes. + * + * GNU Mes is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or (at + * your option) any later version. + * + * GNU Mes is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with GNU Mes. If not, see . + */ + +#include + +struct mach_msg_int_address +{ + mach_msg_header_t header; + mach_msg_type_t type_one; int one; + mach_msg_type_t type_two; vm_address_t two; +}; + +struct mach_msg_address_int_int +{ + mach_msg_header_t header; + mach_msg_type_t type_one; vm_address_t one; + mach_msg_type_t type_two; vm_size_t two; + mach_msg_type_t type_three; boolean_t three; +}; + +const mach_msg_type_t mach_msg_type_boolean = + { + (unsigned char) MACH_MSG_TYPE_BOOLEAN, // msgt_name + 32, // msgt_size + 1, // msgt_number + 1, // msgt_inline + 0, // msgt_longform + 0, // msgt_deallocate + 0 // msgt_unused + }; + +kern_return_t +__vm_allocate (mach_port_t task, vm_address_t *address, vm_size_t size, boolean_t anywhere) +{ + union message + { + struct mach_msg_address_int_int request; + struct mach_msg_int_address reply; + }; + union message message = {0}; + message.request.header.msgh_size = sizeof (message.request); + message.request.type_one = mach_msg_type_int32; + message.request.one = *address; + message.request.type_two = mach_msg_type_int32; + message.request.two = size; + message.request.type_three = mach_msg_type_boolean; + message.request.three = anywhere; + + kern_return_t result = __syscall_get (task, SYS__vm_allocate, + &message.request.header, + sizeof (message.reply)); + + if (message.reply.one != KERN_SUCCESS) + return message.reply.one; + + if (result == KERN_SUCCESS) + *address = message.reply.two; + return result; +} diff --git a/lib/gnu/x86-mes-gcc/crt1.c b/lib/gnu/x86-mes-gcc/crt1.c index bdab8051..18c41bb3 100644 --- a/lib/gnu/x86-mes-gcc/crt1.c +++ b/lib/gnu/x86-mes-gcc/crt1.c @@ -37,8 +37,7 @@ _start () __stdin = 0; __stdout = 1; __stderr = 2; - int argc = _hurd_startup_data.arg_count; - int r = main (argc, __argv, environ); + int r = main (__argc, __argv, environ); _exit (r); asm ("hlt"); } diff --git a/lib/stdlib/malloc.c b/lib/stdlib/malloc.c index 970f9fdb..f4be4de1 100644 --- a/lib/stdlib/malloc.c +++ b/lib/stdlib/malloc.c @@ -21,6 +21,15 @@ #include #include +/* FIXME: We want bin/mes-mescc's x86-linux sha256sum to stay the same. + Therfore we cannot remove stdlib/malloc from libc_SOURCES, which is + what GNU suggests. + + move stdlib/malloc.c to unix/malloc.c and move it from shared + libc_SOURCES to linux-specific list when the checksum of mes.c + changes. */ + +#if !__GNU__ char *__brk = 0; void * @@ -34,3 +43,4 @@ malloc (size_t size) __brk += size; return p; } +#endif /* !__GNU__ */