diff options
author | Justus Winter <4winter@informatik.uni-hamburg.de> | 2014-04-04 18:17:54 +0200 |
---|---|---|
committer | Justus Winter <4winter@informatik.uni-hamburg.de> | 2014-04-05 13:40:08 +0200 |
commit | e27425e63392683b85101961489a83e0abef133b (patch) | |
tree | 19f3df8c48ab61a069fa661c5973af8ee6925678 /libdiskfs | |
parent | f274c66b2141aca0f332e272b77cd0a048cef7f6 (diff) |
libdiskfs: fix receiver lookup
* libdiskfs/Makefile (exec_startup-MIGSFLAGS): New variable.
* libdiskfs/diskfs.h (struct bootinfo): New struct declaration.
(diskfs_begin_using_bootinfo_port): New function.
(diskfs_end_using_bootinfo): Likewise.
* libdiskfs/fsmutations.h: Add mutators for exec_startup_t.
* libdiskfs/priv.h (bootinfo_t): New type declaration to appease mig.
* libdiskfs/boot-start.c (S_exec_startup_get_info): Fix receiver lookup.
Diffstat (limited to 'libdiskfs')
-rw-r--r-- | libdiskfs/Makefile | 1 | ||||
-rw-r--r-- | libdiskfs/boot-start.c | 9 | ||||
-rw-r--r-- | libdiskfs/diskfs.h | 23 | ||||
-rw-r--r-- | libdiskfs/fsmutations.h | 7 | ||||
-rw-r--r-- | libdiskfs/priv.h | 1 |
5 files changed, 35 insertions, 6 deletions
diff --git a/libdiskfs/Makefile b/libdiskfs/Makefile index aeebe4e9..996e86a0 100644 --- a/libdiskfs/Makefile +++ b/libdiskfs/Makefile @@ -68,6 +68,7 @@ fsys-MIGSFLAGS = -imacros $(srcdir)/fsmutations.h -DREPLY_PORTS fs-MIGSFLAGS = -imacros $(srcdir)/fsmutations.h io-MIGSFLAGS = -imacros $(srcdir)/fsmutations.h ifsock-MIGSFLAGS = -imacros $(srcdir)/fsmutations.h +exec_startup-MIGSFLAGS = -imacros $(srcdir)/fsmutations.h MIGCOMSFLAGS = -prefix diskfs_ include ../Makeconf diff --git a/libdiskfs/boot-start.c b/libdiskfs/boot-start.c index 7b8a84f5..9dd2751f 100644 --- a/libdiskfs/boot-start.c +++ b/libdiskfs/boot-start.c @@ -299,7 +299,7 @@ diskfs_start_bootstrap () call (as does any task) to get its state. We can't give it all of its ports (we'll provide those with a later call to exec_init). */ kern_return_t -diskfs_S_exec_startup_get_info (mach_port_t port, +diskfs_S_exec_startup_get_info (struct bootinfo *upt, vm_address_t *user_entry, vm_address_t *phdr_data, vm_size_t *phdr_size, @@ -322,12 +322,10 @@ diskfs_S_exec_startup_get_info (mach_port_t port, error_t err; mach_port_t *portarray, *dtable; mach_port_t rootport; - struct ufsport *upt; struct protid *rootpi; struct peropen *rootpo; - if (!(upt = ports_lookup_port (diskfs_port_bucket, port, - diskfs_execboot_class))) + if (! upt) return EOPNOTSUPP; *user_entry = 0; @@ -368,13 +366,12 @@ diskfs_S_exec_startup_get_info (mach_port_t port, portarray[INIT_PORT_AUTH] = MACH_PORT_NULL; portarray[INIT_PORT_PROC] = MACH_PORT_NULL; portarray[INIT_PORT_CTTYID] = MACH_PORT_NULL; - portarray[INIT_PORT_BOOTSTRAP] = port; /* use the same port */ + portarray[INIT_PORT_BOOTSTRAP] = upt->pi.port_right; /* use the same port */ *portarraypoly = MACH_MSG_TYPE_MAKE_SEND; *dtablepoly = MACH_MSG_TYPE_COPY_SEND; - ports_port_deref (upt); return 0; } diff --git a/libdiskfs/diskfs.h b/libdiskfs/diskfs.h index 359b11b8..8151ddc1 100644 --- a/libdiskfs/diskfs.h +++ b/libdiskfs/diskfs.h @@ -126,6 +126,11 @@ struct diskfs_control struct port_info pi; }; +struct bootinfo +{ + struct port_info pi; +}; + /* Possibly lookup types for diskfs_lookup call */ enum lookup_type { @@ -801,9 +806,11 @@ void diskfs_finish_protid (struct protid *cred, struct iouser *user); extern struct protid * diskfs_begin_using_protid_port (file_t port); extern struct diskfs_control * diskfs_begin_using_control_port (fsys_t port); +extern struct bootinfo *diskfs_begin_using_bootinfo_port (exec_startup_t port); extern void diskfs_end_using_protid_port (struct protid *cred); extern void diskfs_end_using_control_port (struct diskfs_control *cred); +extern void diskfs_end_using_bootinfo (struct bootinfo *upt); #if defined(__USE_EXTERN_INLINES) || defined(DISKFS_DEFINE_EXTERN_INLINE) @@ -823,6 +830,14 @@ diskfs_begin_using_control_port (fsys_t port) return ports_lookup_port (diskfs_port_bucket, port, NULL); } +/* And for the exec_startup interface. */ +DISKFS_EXTERN_INLINE struct bootinfo * +diskfs_begin_using_bootinfo_port (exec_startup_t port) +{ + return ports_lookup_port (diskfs_port_bucket, port, diskfs_execboot_class); +} + + /* Called by MiG after server routines have been run; this balances begin_using_protid_port, and is arranged for the io and fs interfaces by fsmutations.h. */ @@ -841,6 +856,14 @@ diskfs_end_using_control_port (struct diskfs_control *cred) ports_port_deref (cred); } +/* And for the exec_startup interface. */ +DISKFS_EXTERN_INLINE void +diskfs_end_using_bootinfo (struct bootinfo *b) +{ + if (b) + ports_port_deref (b); +} + #endif /* Use extern inlines. */ /* Called when a protid CRED has no more references. (Because references\ diff --git a/libdiskfs/fsmutations.h b/libdiskfs/fsmutations.h index 68b6ae3c..6248708e 100644 --- a/libdiskfs/fsmutations.h +++ b/libdiskfs/fsmutations.h @@ -30,3 +30,10 @@ #define IO_IMPORTS import "priv.h"; #define FSYS_IMPORTS import "priv.h"; #define IFSOCK_IMPORTS import "priv.h"; + +#define EXEC_STARTUP_INTRAN \ + bootinfo_t diskfs_begin_using_bootinfo_port (exec_startup_t) +#define EXEC_STARTUP_DESTRUCTOR \ + diskfs_end_using_bootinfo (bootinfo_t) +#define EXEC_STARTUP_IMPORTS \ + import "priv.h"; diff --git a/libdiskfs/priv.h b/libdiskfs/priv.h index b41fa43e..4363a00a 100644 --- a/libdiskfs/priv.h +++ b/libdiskfs/priv.h @@ -74,6 +74,7 @@ extern int _diskfs_diskdirty; /* Needed for MiG. */ typedef struct protid *protid_t; typedef struct diskfs_control *control_t; +typedef struct bootinfo *bootinfo_t; /* Actually read or write a file. The file size must already permit the requested access. NP is the file to read/write. DATA is a buffer |