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 Moolenbroekget_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 Moolenbroekminix_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