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:
parent
89945751d9
commit
9b0009a888
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
34
lib/gnu/malloc.c
Normal file
34
lib/gnu/malloc.c
Normal 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
76
lib/gnu/vm-allocate.c
Normal 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;
|
||||
}
|
|
@ -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");
|
||||
}
|
||||
|
|
|
@ -21,6 +21,15 @@
|
|||
#include <mes/lib.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;
|
||||
|
||||
void *
|
||||
|
@ -34,3 +43,4 @@ malloc (size_t size)
|
|||
__brk += size;
|
||||
return p;
|
||||
}
|
||||
#endif /* !__GNU__ */
|
||||
|
|
Loading…
Reference in a new issue