xref: /minix3/minix/lib/libc/sys/kernel_utils.c (revision 20054ae93f6e47654fed4974be64f313fdd85de6)
1594df55eSDavid van Moolenbroek /*
2594df55eSDavid van Moolenbroek  * This file contains the main routine for retrieval of the kernel information
3*20054ae9SDavid van Moolenbroek  * page, as well as abstraction routines for retrieval of specific values from
4*20054ae9SDavid van Moolenbroek  * this kernel-mapped user information structure.  These routines may be used
5*20054ae9SDavid van Moolenbroek  * from both userland and system services, and their accesses are considered to
6*20054ae9SDavid van Moolenbroek  * establish part of the userland ABI.  Do not add routines here that are not
7*20054ae9SDavid van Moolenbroek  * for retrieval of userland ABI fields (e.g., clock information)!  Also, since
8*20054ae9SDavid van Moolenbroek  * these functions are MINIX3 specific, their names should contain - preferably
9*20054ae9SDavid van Moolenbroek  * be prefixed with - "minix_".
10594df55eSDavid van Moolenbroek  */
11594df55eSDavid van Moolenbroek 
12594df55eSDavid van Moolenbroek #define _MINIX_SYSTEM
13594df55eSDavid van Moolenbroek 
14594df55eSDavid van Moolenbroek #include <sys/cdefs.h>
15594df55eSDavid van Moolenbroek #include "namespace.h"
16594df55eSDavid van Moolenbroek #include <lib.h>
17*20054ae9SDavid van Moolenbroek #include <minix/param.h>
18594df55eSDavid van Moolenbroek #include <assert.h>
19594df55eSDavid van Moolenbroek 
20594df55eSDavid van Moolenbroek extern struct minix_kerninfo *_minix_kerninfo;
21594df55eSDavid van Moolenbroek 
22594df55eSDavid van Moolenbroek /*
23594df55eSDavid van Moolenbroek  * Get a pointer to the kernel information page.
24594df55eSDavid van Moolenbroek  */
25594df55eSDavid van Moolenbroek struct minix_kerninfo *
get_minix_kerninfo(void)26594df55eSDavid van Moolenbroek get_minix_kerninfo(void)
27594df55eSDavid van Moolenbroek {
28594df55eSDavid van Moolenbroek 
29594df55eSDavid van Moolenbroek 	assert(_minix_kerninfo != NULL);
30594df55eSDavid van Moolenbroek 
31594df55eSDavid van Moolenbroek 	return _minix_kerninfo;
32594df55eSDavid van Moolenbroek }
33*20054ae9SDavid van Moolenbroek 
34*20054ae9SDavid van Moolenbroek /*
35*20054ae9SDavid van Moolenbroek  * Obtain the initial stack pointer for a new userland process.  This value
36*20054ae9SDavid van Moolenbroek  * is used by routines that set up the stack when executing a new program.
37*20054ae9SDavid van Moolenbroek  * It is used for userland exec(2) and in various system services.
38*20054ae9SDavid van Moolenbroek  */
39*20054ae9SDavid van Moolenbroek vir_bytes
minix_get_user_sp(void)40*20054ae9SDavid van Moolenbroek minix_get_user_sp(void)
41*20054ae9SDavid van Moolenbroek {
42*20054ae9SDavid van Moolenbroek 	struct minix_kerninfo *ki;
43*20054ae9SDavid van Moolenbroek 
44*20054ae9SDavid van Moolenbroek 	/* All information is obtained from the kernel information page. */
45*20054ae9SDavid van Moolenbroek 	ki = get_minix_kerninfo();
46*20054ae9SDavid van Moolenbroek 
47*20054ae9SDavid van Moolenbroek 	/*
48*20054ae9SDavid van Moolenbroek 	 * Check whether we can retrieve the user stack pointer value from the
49*20054ae9SDavid van Moolenbroek 	 * kuserinfo structure.  In general, this test is the correct one to
50*20054ae9SDavid van Moolenbroek 	 * see whether the kuserinfo structure has a certain field.
51*20054ae9SDavid van Moolenbroek 	 */
52*20054ae9SDavid van Moolenbroek 	if ((ki->ki_flags & MINIX_KIF_USERINFO) &&
53*20054ae9SDavid van Moolenbroek 	    KUSERINFO_HAS_FIELD(ki->kuserinfo, kui_user_sp)) {
54*20054ae9SDavid van Moolenbroek 		return ki->kuserinfo->kui_user_sp;
55*20054ae9SDavid van Moolenbroek 	}
56*20054ae9SDavid van Moolenbroek 
57*20054ae9SDavid van Moolenbroek 	/*
58*20054ae9SDavid van Moolenbroek 	 * Otherwise, fall back to legacy support: retrieve the value from the
59*20054ae9SDavid van Moolenbroek 	 * kinfo structure.  This field will eventually be removed.
60*20054ae9SDavid van Moolenbroek 	 */
61*20054ae9SDavid van Moolenbroek 	return ki->kinfo->user_sp;
62*20054ae9SDavid van Moolenbroek }
63