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.
This commit is contained in:
Jan Nieuwenhuizen 2019-03-12 23:58:52 +01:00
parent 89945751d9
commit 9b0009a888
No known key found for this signature in database
GPG key ID: F3C1A0D9C1D65273
6 changed files with 125 additions and 2 deletions

View file

@ -162,6 +162,8 @@ lib/gnu/_read.c
lib/gnu/dir-lookup.c lib/gnu/dir-lookup.c
lib/gnu/fd-read.c lib/gnu/fd-read.c
lib/gnu/io-read.c lib/gnu/io-read.c
lib/gnu/malloc.c
lib/gnu/vm-allocate.c
lib/stub/access.c lib/stub/access.c
lib/stub/brk.c lib/stub/brk.c
lib/stub/chmod.c lib/stub/chmod.c

View file

@ -34,6 +34,7 @@
enum enum
{ {
SYS__task_terminate = 2008, SYS__task_terminate = 2008,
SYS__vm_allocate = 2021,
SYS__vm_statistics = 2030, SYS__vm_statistics = 2030,
SYS__task_get_special_port = 2058, 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 // mach.defs
kern_return_t __task_terminate (mach_port_t task); 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 __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); kern_return_t __vm_statistics (mach_port_t task, vm_statistics_data_t *vm_stats);
// process.defs // process.defs

34
lib/gnu/malloc.c Normal file
View file

@ -0,0 +1,34 @@
/* -*-comment-start: "//";comment-end:""-*-
* GNU Mes --- Maxwell Equations of Software
* Copyright © 2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
*
* 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 <http://www.gnu.org/licenses/>.
*/
#include <mes/lib.h>
#include <gnu/syscall.h>
#include <mach/mach-init.h>
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;
}

76
lib/gnu/vm-allocate.c Normal file
View file

@ -0,0 +1,76 @@
/* -*-comment-start: "//";comment-end:""-*-
* GNU Mes --- Maxwell Equations of Software
* Copyright © 2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
*
* 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 <http://www.gnu.org/licenses/>.
*/
#include <gnu/syscall.h>
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;
}

View file

@ -37,8 +37,7 @@ _start ()
__stdin = 0; __stdin = 0;
__stdout = 1; __stdout = 1;
__stderr = 2; __stderr = 2;
int argc = _hurd_startup_data.arg_count; int r = main (__argc, __argv, environ);
int r = main (argc, __argv, environ);
_exit (r); _exit (r);
asm ("hlt"); asm ("hlt");
} }

View file

@ -21,6 +21,15 @@
#include <mes/lib.h> #include <mes/lib.h>
#include <string.h> #include <string.h>
/* 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; char *__brk = 0;
void * void *
@ -34,3 +43,4 @@ malloc (size_t size)
__brk += size; __brk += size;
return p; return p;
} }
#endif /* !__GNU__ */