summaryrefslogtreecommitdiff
path: root/boot-proxy-exc/mach_host_impl.c~
diff options
context:
space:
mode:
authorroot <root@(null).(none)>2009-05-03 17:20:00 +0200
committerroot <root@(null).(none)>2009-05-03 17:20:00 +0200
commite0faf22f31c48fb27b43c1825897d26e58feafc4 (patch)
tree65a09372b31e08a3a865bd0a88cd2718bafcd643 /boot-proxy-exc/mach_host_impl.c~
This is my initial working version.
There is a bug in boot in this version: subhurd sometimes cannot boot.
Diffstat (limited to 'boot-proxy-exc/mach_host_impl.c~')
-rw-r--r--boot-proxy-exc/mach_host_impl.c~545
1 files changed, 545 insertions, 0 deletions
diff --git a/boot-proxy-exc/mach_host_impl.c~ b/boot-proxy-exc/mach_host_impl.c~
new file mode 100644
index 00000000..0ce0d0b6
--- /dev/null
+++ b/boot-proxy-exc/mach_host_impl.c~
@@ -0,0 +1,545 @@
+/*
+ Copyright (C) 2009 Free Software Foundation, Inc.
+ Written by Zheng Da.
+
+ This file is part of the GNU Hurd.
+
+ The GNU Hurd 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 2, or (at your option)
+ any later version.
+
+ The GNU Hurd 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 the GNU Hurd; see the file COPYING. If not, write to
+ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+/* This file implements the server-side RPC functions of mach_host. */
+
+#include <stdio.h>
+#include <assert.h>
+
+#include <mach.h>
+#include <hurd.h>
+#include <hurd/ports.h>
+
+#include "util.h"
+#include "list.h"
+#include "mach_proxy.h"
+
+extern mach_port_t privileged_host_port;
+
+/* Set task priority. */
+kern_return_t
+S_task_priority (mach_port_t task, int priority, boolean_t change_threads)
+{
+ struct task_info *task_pi;
+ error_t err;
+
+ task_pi = ports_lookup_port (port_bucket, task, task_portclass);
+ if (task_pi == NULL)
+ return EOPNOTSUPP;
+ err = task_priority (task_pi->task_port, priority, change_threads);
+ debug ("%s", strerror (err));
+ ports_port_deref (task_pi);
+ return err;
+}
+
+/* Routine processor_set_tasks */
+kern_return_t
+S_processor_set_tasks (mach_port_t processor_set, task_array_t *task_list,
+ mach_msg_type_number_t *task_listCnt)
+{
+ error_t err = 0;
+ mach_port_t *subhurd_tasks = NULL;
+ int size = 0;
+ /* no pseudo task port is created for the kernel task. */
+ int num = 0;
+ int tot_nbtasks = ports_count_class (task_portclass) + num;
+
+ size = tot_nbtasks * sizeof (mach_port_t);
+ err = vm_allocate (mach_task_self (),
+ (vm_address_t *) (void *) &subhurd_tasks,
+ size, 1);
+ if (err)
+ goto out;
+
+ int get_pseudo_task_port (struct task_info *task_pi)
+ {
+ assert (num < tot_nbtasks);
+ subhurd_tasks[num++] = ports_get_right (task_pi);
+ return 0;
+ }
+
+ foreach_task (get_pseudo_task_port);
+ assert (num == tot_nbtasks);
+ debug ("get %d tasks", tot_nbtasks);
+ *task_list = subhurd_tasks;
+ *task_listCnt = tot_nbtasks;
+
+out:
+ /* I enable the class here,
+ * so no pseudo task port can be created when I count the number of tasks. */
+ ports_enable_class (task_portclass);
+ /* The array will be deallocated after it is sent,
+ * but the task ports in it don't need to,
+ * because I only call ports_get_right()
+ * and the reference count isn't increased. */
+ return err;
+}
+
+/* Get control port for a processor set. */
+kern_return_t
+S_host_processor_set_priv (mach_port_t host_priv, mach_port_t set_name,
+ mach_port_t *set, mach_msg_type_name_t *setPoly)
+{
+ extern struct port_class *other_portclass;
+ struct port_info *pi;
+ kern_return_t ret = 0;
+
+ // TODO create a port for each processor set
+ debug ("");
+ // TODO I should create the port for the processor set only once.
+ ret = ports_create_port (other_portclass, port_bucket,
+ sizeof (*pi), &pi);
+ debug ("%s", strerror (ret));
+ if (ret)
+ return ret;
+ *set = ports_get_right (pi);
+ *setPoly = MACH_MSG_TYPE_MAKE_SEND;
+ ports_port_deref (pi);
+ return ret;
+}
+
+/* Routine host_reboot */
+kern_return_t
+S_host_reboot (mach_port_t host_priv, int options)
+{
+ debug ("");
+ assert (0);
+ // TODO
+ return EOPNOTSUPP;
+}
+
+/* Routine vm_wire */
+kern_return_t
+S_vm_wire (mach_port_t host_priv, mach_port_t task,
+ vm_address_t address, vm_size_t size, vm_prot_t access)
+{
+ debug ("");
+ assert (0);
+ // TODO
+ return EOPNOTSUPP;
+}
+
+/* Routine thread_wire */
+kern_return_t
+S_thread_wire (mach_port_t host_priv, mach_port_t thread, boolean_t wired)
+{
+ debug ("");
+ assert (0);
+ // TODO
+ return EOPNOTSUPP;
+}
+
+//////////the request to the host isn't forwarded by the proxy//////////
+
+/* Routine host_processor_sets */
+kern_return_t
+S_host_processor_sets (mach_port_t host,
+ processor_set_name_array_t *processor_sets,
+ mach_msg_type_number_t *processor_setsCnt)
+{
+ debug ("");
+ assert (0);
+ // the request to the host isn't forwarded.
+ return EOPNOTSUPP;
+}
+
+/* Routine host_get_time */
+kern_return_t
+S_host_get_time (mach_port_t host, time_value_t *current_time)
+{
+ debug ("");
+ assert (0);
+ // the request to the host isn't forwarded.
+ return EOPNOTSUPP;
+}
+
+/* Routine host_info */
+kern_return_t
+S_host_info (mach_port_t host, int flavor, host_info_t host_info_out,
+ mach_msg_type_number_t *host_info_outCnt)
+{
+ debug ("");
+ assert (0);
+ // the request to the host isn't forwarded.
+ return EOPNOTSUPP;
+}
+
+/* Get string describing current kernel version. */
+kern_return_t
+S_host_kernel_version (mach_port_t host, kernel_version_t kernel_version)
+{
+ debug ("");
+ assert (0);
+ // the proxy doesn't forward the request to the host port.
+ return EOPNOTSUPP;
+}
+
+///////////////////the RPCs not used by Hurd//////////////////////
+
+/* Get list of processors on this host. */
+kern_return_t
+S_host_processors (mach_port_t host_priv,
+ processor_array_t *processor_list,
+ mach_msg_type_number_t *processor_listCnt)
+{
+ debug ("");
+ assert (0);
+ // Hurd currently doesn't use it.
+ return EOPNOTSUPP;
+}
+
+/* Start processor. */
+kern_return_t
+S_processor_start (mach_port_t processor)
+{
+ debug ("");
+ assert (0);
+ // Hurd currently doesn't use it.
+ return EOPNOTSUPP;
+}
+
+/* Exit processor -- may not be restartable. */
+kern_return_t
+S_processor_exit (mach_port_t processor)
+{
+ debug ("");
+ assert (0);
+ // Hurd currently doesn't use it.
+ return EOPNOTSUPP;
+}
+
+/* Get default processor set for host. */
+kern_return_t
+S_processor_set_default (mach_port_t host, mach_port_t *default_set)
+{
+ debug ("");
+ assert (0);
+ // Hurd currently doesn't use it.
+ return EOPNOTSUPP;
+}
+
+/*
+ * Create new processor set. Returns real port for manipulations,
+ * and name port for obtaining information.
+ */
+kern_return_t
+S_processor_set_create (mach_port_t host, mach_port_t *new_set,
+ mach_port_t *new_name)
+{
+ debug ("");
+ assert (0);
+ // Hurd currently doesn't use it.
+ return EOPNOTSUPP;
+}
+
+/* Destroy processor set. */
+kern_return_t
+S_processor_set_destroy (mach_port_t set)
+{
+ debug ("");
+ assert (0);
+ // Hurd currently doesn't use it.
+ return EOPNOTSUPP;
+}
+
+/* Assign processor to processor set. */
+kern_return_t
+S_processor_assign (mach_port_t processor, mach_port_t new_set, boolean_t wait)
+{
+ debug ("");
+ assert (0);
+ // Hurd currently doesn't use it.
+ return EOPNOTSUPP;
+}
+
+/* Get current assignment for thread. */
+kern_return_t
+S_processor_get_assignment (mach_port_t processor, mach_port_t *assigned_set)
+{
+ debug ("");
+ assert (0);
+ // Hurd currently doesn't use it.
+ return EOPNOTSUPP;
+}
+
+/* Assign task to processor set. */
+kern_return_t
+S_task_assign (mach_port_t task, mach_port_t new_set, boolean_t assign_threads)
+{
+ debug ("");
+ assert (0);
+ // Hurd currently doesn't use it.
+ return EOPNOTSUPP;
+}
+
+/* Assign task to default set. */
+kern_return_t
+S_task_assign_default (mach_port_t task, boolean_t assign_threads)
+{
+ debug ("");
+ assert (0);
+ // Hurd currently doesn't use it.
+ return EOPNOTSUPP;
+}
+
+/* Get current assignment for task. */
+kern_return_t
+S_task_get_assignment (mach_port_t task, mach_port_t *assigned_set)
+{
+ debug ("");
+ assert (0);
+ // Hurd currently doesn't use it.
+ return EOPNOTSUPP;
+}
+
+/* Set max priority for processor_set. */
+kern_return_t
+S_processor_set_max_priority (mach_port_t processor_set, int max_priority,
+ boolean_t change_threads)
+{
+ debug ("");
+ assert (0);
+ // Hurd currently doesn't use it.
+ return EOPNOTSUPP;
+}
+
+/* Routine processor_set_policy_enable */
+kern_return_t
+S_processor_set_policy_enable (mach_port_t processor_set, int policy)
+{
+ debug ("");
+ assert (0);
+ // Hurd currently doesn't use it.
+ return EOPNOTSUPP;
+}
+
+/* Routine processor_set_policy_disable */
+kern_return_t
+S_processor_set_policy_disable (mach_port_t processor_set, int policy,
+ boolean_t change_threads)
+{
+ debug ("");
+ assert (0);
+ // Hurd currently doesn't use it.
+ return EOPNOTSUPP;
+}
+
+/* Routine processor_set_threads */
+kern_return_t
+S_processor_set_threads (mach_port_t processor_set,
+ thread_array_t *thread_list,
+ mach_msg_type_number_t *thread_listCnt)
+{
+ debug ("");
+ assert (0);
+ // Hurd currently doesn't use it.
+ return EOPNOTSUPP;
+}
+
+/* Routine host_set_time */
+kern_return_t
+S_host_set_time (mach_port_t host_priv, time_value_t new_time)
+{
+ debug ("");
+ assert (0);
+ // Hurd currently doesn't use it.
+ return EOPNOTSUPP;
+}
+
+/* Routine host_adjust_time */
+kern_return_t
+S_host_adjust_time (mach_port_t host_priv, time_value_t new_adjustment,
+ time_value_t *old_adjustment)
+{
+ debug ("");
+ assert (0);
+ // Hurd currently doesn't use it.
+ return EOPNOTSUPP;
+}
+
+/* Routine processor_info */
+kern_return_t
+S_processor_info (mach_port_t processor, int flavor, mach_port_t *host,
+ processor_info_t processor_info_out,
+ mach_msg_type_number_t *processor_info_outCnt)
+{
+ debug ("");
+ assert (0);
+ // Hurd currently doesn't use it.
+ return EOPNOTSUPP;
+}
+
+/* Routine processor_set_info */
+kern_return_t
+S_processor_set_info (mach_port_t set_name, int flavor, mach_port_t *host,
+ processor_set_info_t info_out,
+ mach_msg_type_number_t *info_outCnt)
+{
+ debug ("");
+ assert (0);
+ // Hurd currently doesn't use it.
+ return EOPNOTSUPP;
+}
+
+/* Routine processor_control */
+kern_return_t
+S_processor_control (mach_port_t processor, processor_info_t processor_cmd,
+ mach_msg_type_number_t processor_cmdCnt)
+{
+ debug ("");
+ assert (0);
+ // Hurd currently doesn't use it.
+ return EOPNOTSUPP;
+}
+
+/* Routine host_get_boot_info */
+kern_return_t
+S_host_get_boot_info (mach_port_t host_priv, kernel_boot_info_t boot_info)
+{
+ debug ("");
+ assert (0);
+ // Hurd currently doesn't use it.
+ return EOPNOTSUPP;
+}
+
+///////////////////it's not a proxy for thread requests///////////////////
+
+/* Assign thread to processor set. */
+kern_return_t
+S_thread_assign (mach_port_t thread, mach_port_t new_set)
+{
+ debug ("");
+ assert (0);
+ return EOPNOTSUPP;
+}
+
+/* Assign thread to default set. */
+kern_return_t
+S_thread_assign_default (mach_port_t thread)
+{
+ debug ("");
+ assert (0);
+ return EOPNOTSUPP;
+}
+
+/* Get current assignment for thread. */
+kern_return_t
+S_thread_get_assignment (mach_port_t thread, mach_port_t *assigned_set)
+{
+ debug ("");
+ assert (0);
+ return EOPNOTSUPP;
+}
+
+/* Set priority for thread. */
+kern_return_t S_thread_priority (mach_port_t thread, int priority,
+ boolean_t set_max)
+{
+ debug ("");
+ assert (0);
+ return thread_priority (thread, priority, set_max);
+}
+
+/* Set max priority for thread. */
+kern_return_t S_thread_max_priority (mach_port_t thread,
+ mach_port_t processor_set,
+ int max_priority)
+{
+ debug ("");
+ assert (0);
+ return thread_max_priority (thread, processor_set, max_priority);
+}
+
+/* Routine thread_depress_abort */
+kern_return_t S_thread_depress_abort (mach_port_t thread)
+{
+ debug ("");
+ assert (0);
+ return EOPNOTSUPP;
+}
+
+/* Set policy for thread */
+kern_return_t S_thread_policy (mach_port_t thread, int policy, int data)
+{
+ debug ("");
+ assert (0);
+ return EOPNOTSUPP;
+}
+
+////////////////////don't support obsolete requests///////////////////////
+
+/* Routine yyy_host_info */
+/* obsolete */
+kern_return_t
+S_yyy_host_info (mach_port_t host, int flavor, host_info_t host_info_out,
+ mach_msg_type_number_t *host_info_outCnt)
+{
+ debug ("");
+ assert (0);
+ return EOPNOTSUPP;
+}
+
+/* Routine yyy_processor_info */
+/* obsolete */
+kern_return_t
+S_yyy_processor_info (mach_port_t processor, int flavor, mach_port_t *host,
+ processor_info_t processor_info_out,
+ mach_msg_type_number_t *processor_info_outCnt)
+{
+ debug ("");
+ assert (0);
+ return EOPNOTSUPP;
+}
+
+/* Routine yyy_processor_control */
+/* obsolete */
+kern_return_t
+S_yyy_processor_control (mach_port_t processor,
+ processor_info_t processor_cmd,
+ mach_msg_type_number_t processor_cmdCnt)
+{
+ debug ("");
+ assert (0);
+ return EOPNOTSUPP;
+}
+
+/*
+ * Get rights to default processor set for host.
+ * Replaced by host_processor_set_priv.
+ */
+kern_return_t
+S_xxx_processor_set_default_priv (mach_port_t host, mach_port_t *default_set)
+{
+ debug ("");
+ assert (0);
+ return EOPNOTSUPP;
+}
+
+/* Routine yyy_processor_set_info */
+/* obsolete */
+kern_return_t
+S_yyy_processor_set_info (mach_port_t set_name, int flavor,
+ mach_port_t *host, processor_set_info_t info_out,
+ mach_msg_type_number_t *info_outCnt)
+{
+ debug ("");
+ assert (0);
+ return EOPNOTSUPP;
+}