/*===========================================================================* * privileges_dmp * *===========================================================================*/ void privileges_dmp() { register struct proc *rp; static struct proc *oldrp = BEG_PROC_ADDR; register struct priv *sp; int r, i; /* First obtain a fresh copy of the current process and system table. */ if ((r = sys_getprivtab(priv)) != OK) { printf("IS: warning: couldn't get copy of system privileges table: %d\n", r); return; } if ((r = sys_getproctab(proc)) != OK) { printf("IS: warning: couldn't get copy of process table: %d\n", r); return; } printf("-nr- -id- -name-- -flags- traps grants -ipc_to--" " -kernel calls-\n"); PROCLOOP(rp, oldrp) r = -1; for (sp = &priv[0]; sp < &priv[NR_SYS_PROCS]; sp++) if (sp->s_proc_nr == rp->p_nr) { r ++; break; } if (r == -1 && !isemptyp(rp)) { sp = &priv[USER_PRIV_ID]; } printf("(%02u) %-7.7s %s %s %6d", sp->s_id, rp->p_name, s_flags_str(sp->s_flags), s_traps_str(sp->s_trap_mask), sp->s_grant_entries); for (i=0; i < NR_SYS_PROCS; i += BITCHUNK_BITS) { printf(" %08x", get_sys_bits(sp->s_ipc_to, i)); } printf(" "); for (i=0; i < NR_SYS_CALLS; i += BITCHUNK_BITS) { printf(" %08x", sp->s_k_call_mask[i/BITCHUNK_BITS]); } printf("\n"); }
/*===========================================================================* * update_priv * *===========================================================================*/ PRIVATE int update_priv(struct proc *rp, struct priv *priv) { /* Update the privilege structure of a given process. */ int ipc_to_m, i; /* Copy s_flags and signal managers. */ priv(rp)->s_flags = priv->s_flags; priv(rp)->s_sig_mgr = priv->s_sig_mgr; priv(rp)->s_bak_sig_mgr = priv->s_bak_sig_mgr; /* Copy IRQs. */ if(priv->s_flags & CHECK_IRQ) { if (priv->s_nr_irq < 0 || priv->s_nr_irq > NR_IRQ) return EINVAL; priv(rp)->s_nr_irq= priv->s_nr_irq; for (i= 0; i<priv->s_nr_irq; i++) { priv(rp)->s_irq_tab[i]= priv->s_irq_tab[i]; #if PRIV_DEBUG printf("do_privctl: adding IRQ %d for %d\n", priv(rp)->s_irq_tab[i], rp->p_endpoint); #endif } } /* Copy I/O ranges. */ if(priv->s_flags & CHECK_IO_PORT) { if (priv->s_nr_io_range < 0 || priv->s_nr_io_range > NR_IO_RANGE) return EINVAL; priv(rp)->s_nr_io_range= priv->s_nr_io_range; for (i= 0; i<priv->s_nr_io_range; i++) { priv(rp)->s_io_tab[i]= priv->s_io_tab[i]; #if PRIV_DEBUG printf("do_privctl: adding I/O range [%x..%x] for %d\n", priv(rp)->s_io_tab[i].ior_base, priv(rp)->s_io_tab[i].ior_limit, rp->p_endpoint); #endif } } /* Copy memory ranges. */ if(priv->s_flags & CHECK_MEM) { if (priv->s_nr_mem_range < 0 || priv->s_nr_mem_range > NR_MEM_RANGE) return EINVAL; priv(rp)->s_nr_mem_range= priv->s_nr_mem_range; for (i= 0; i<priv->s_nr_mem_range; i++) { priv(rp)->s_mem_tab[i]= priv->s_mem_tab[i]; #if PRIV_DEBUG printf("do_privctl: adding mem range [%x..%x] for %d\n", priv(rp)->s_mem_tab[i].mr_base, priv(rp)->s_mem_tab[i].mr_limit, rp->p_endpoint); #endif } } /* Copy trap mask. */ priv(rp)->s_trap_mask = priv->s_trap_mask; /* Copy target mask. */ #if PRIV_DEBUG printf("do_privctl: Setting ipc target mask for %d:"); for (i=0; i < NR_SYS_PROCS; i += BITCHUNK_BITS) { printf(" %04x", get_sys_bits(priv->s_ipc_to, i)); } printf("\n"); #endif memcpy(&ipc_to_m, &priv->s_ipc_to, sizeof(ipc_to_m)); fill_sendto_mask(rp, ipc_to_m); #if PRIV_DEBUG printf("do_privctl: Set ipc target mask for %d:"); for (i=0; i < NR_SYS_PROCS; i += BITCHUNK_BITS) { printf(" %04x", get_sys_bits(priv(rp)->s_ipc_to, i)); } printf("\n"); #endif /* Copy kernel call mask. */ memcpy(priv(rp)->s_k_call_mask, priv->s_k_call_mask, sizeof(priv(rp)->s_k_call_mask)); return OK; }