/* * Memory Cache Control */ LOCAL INT _ControlCache( void *addr, INT len, UINT mode ) { ER ercd; if ( len <= 0 ) { ercd = E_PAR; goto err_ret; } if ( mode == 0 ) { ercd = E_PAR; goto err_ret; } ercd = ChkSpaceR(addr, len); if ( ercd < E_OK ){ goto err_ret; } ercd = ControlCacheM(addr, len, mode); if( ercd != E_OK ){ goto err_ret; } return len; err_ret: #ifdef DEBUG TM_DEBUG_PRINT(("_ControlCache ercd = %d\n", ercd)); #endif return ercd; }
/* * Set system timezone */ EXPORT ER _dt_setsystz(const struct tzinfo* tz) { ER er; er = ChkSpaceR(tz, sizeof(*tz)); if (er < E_OK) { return er; } systemTimeZone = *tz; return E_OK; }
/* * Get address space information */ LOCAL ER _GetSpaceInfo( VP addr, INT len, T_SPINFO *pk_spinfo ) { T_RSMB rsmb; ER ercd = E_OK; INT cont, sz; VP page, va, pa; if ( len <= 0 ) { ercd = E_PAR; goto err_ret; } ercd = ChkSpaceR(addr, len); if ( ercd < E_OK ){ goto err_ret; } ercd = RefSysMemInfo(&rsmb); if ( ercd < E_OK ) { goto err_ret; } pk_spinfo->paddr = toPhysicalAddress(addr); pk_spinfo->page = (VP)((UW)(pk_spinfo->paddr) & ~(rsmb.blksz-1)); pk_spinfo->pagesz = rsmb.blksz; pk_spinfo->cachesz = GetCacheLineSize(); cont = 0; page = pk_spinfo->page; va = addr; while ( cont < len ) { pa = toPhysicalAddress(va); if ( (pa < page) || ((page + rsmb.blksz) <= pa) ) { break; } sz = rsmb.blksz - (pa - page); cont += sz; page += rsmb.blksz; va += sz; } pk_spinfo->cont = ( cont <= len )? cont: len; return ercd; err_ret: DEBUG_PRINT(("_GetSpaceInfo ercd = %d\n", ercd)); return ercd; }
/* * Memory Cache Flush */ LOCAL ER _FlushMemCache( VP laddr, INT len, UINT mode ) { ER ercd; if ( (mode & ~(TCM_ICACHE|TCM_DCACHE)) != 0 ) { ercd = E_PAR; goto err_ret; } ercd = ChkSpaceR(laddr, len); if ( ercd < E_OK ){ goto err_ret; } FlushCacheM(laddr, len, mode); return E_OK; err_ret: DEBUG_PRINT(("_FlushMemCache ercd = %d\n", ercd)); return ercd; }
int sys_sethostname(struct lwp *l, const struct sys_sethostname_args *uap, register_t *retval) { ER ercd; (void)l; ercd = ChkSpaceR(SCARG(uap, name), SCARG(uap, len)); if ( ercd < E_OK ) { return EFAULT; } if ( SCARG(uap, len) > MAXHOSTNAMELEN ) { *retval = -1; return EINVAL; } strlcpy(sys_hostname, SCARG(uap, name), MAXHOSTNAMELEN); *retval = 0; return 0; }
/* * Get address space information */ LOCAL ER _GetSpaceInfo( CONST void *addr, INT len, T_SPINFO *pk_spinfo ) { T_RSMB rsmb; ER ercd = E_OK; if ( len <= 0 ) { ercd = E_PAR; goto err_ret; } ercd = ChkSpaceR(addr, len); if ( ercd < E_OK ){ goto err_ret; } ercd = RefSysMemInfo(&rsmb); if ( ercd < E_OK ) { goto err_ret; } pk_spinfo->paddr = toPhysicalAddress(addr); pk_spinfo->page = (void*)((UW)(pk_spinfo->paddr) & ~(rsmb.blksz-1)); pk_spinfo->pagesz = rsmb.blksz; pk_spinfo->cachesz = GetCacheLineSize(); /* Assumes here that logical and physical addresses are mapped linear. This assures that physical page addresses are also contiguous if logical page addresses are contiguous. */ pk_spinfo->cont = len; return ercd; err_ret: #ifdef DEBUG TM_DEBUG_PRINT(("_GetSpaceInfo ercd = %d\n", ercd)); #endif return ercd; }
/* * Check address space * Checks to see that the memory area from address to the * len byte is valid. */ EXPORT ER CheckSpaceR( VP address, W len ) { return ChkSpaceR(address, len); }