void SYS_NetBSD_Initialise(void) { static struct nlist nl[] = { {"_tickadj"}, {"_bigadj"}, {NULL} }; kvm_t *kt; FILE *fp; kt = kvm_open(NULL, NULL, NULL, O_RDONLY, NULL); if (!kt) { LOG_FATAL(LOGF_SysNetBSD, "Cannot open kvm"); } if (kvm_nlist(kt, nl) < 0) { LOG_FATAL(LOGF_SysNetBSD, "Cannot read kernel symbols"); } if (kvm_read(kt, nl[0].n_value, (char *)(&kern_tickadj), sizeof(int)) < 0) { LOG_FATAL(LOGF_SysNetBSD, "Cannot read from _tickadj"); } if (kvm_read(kt, nl[1].n_value, (char *)(&kern_bigadj), sizeof(long)) < 0) { /* kernel doesn't have the symbol, use one second instead */ kern_bigadj = 1000000; } kvm_close(kt); clock_initialise(); lcl_RegisterSystemDrivers(read_frequency, set_frequency, accrue_offset, apply_step_offset, get_offset_correction, NULL /* set_leap */); }
void SYS_Generic_CompleteFreqDriver(double max_set_freq_ppm, double max_set_freq_delay, lcl_ReadFrequencyDriver sys_read_freq, lcl_SetFrequencyDriver sys_set_freq, lcl_ApplyStepOffsetDriver sys_apply_step_offset, double min_fastslew_offset, double max_fastslew_rate, lcl_AccrueOffsetDriver sys_accrue_offset, lcl_OffsetCorrectionDriver sys_get_offset_correction, lcl_SetLeapDriver sys_set_leap, lcl_SetSyncStatusDriver sys_set_sync_status) { max_freq = max_set_freq_ppm; max_freq_change_delay = max_set_freq_delay * (1.0 + max_freq / 1.0e6); drv_read_freq = sys_read_freq; drv_set_freq = sys_set_freq; drv_accrue_offset = sys_accrue_offset; drv_get_offset_correction = sys_get_offset_correction; drv_set_sync_status = sys_set_sync_status; base_freq = (*drv_read_freq)(); slew_freq = 0.0; offset_register = 0.0; max_corr_freq = CNF_GetMaxSlewRate() / 1.0e6; fastslew_min_offset = min_fastslew_offset; fastslew_max_rate = max_fastslew_rate / 1.0e6; fastslew_active = 0; lcl_RegisterSystemDrivers(read_frequency, set_frequency, accrue_offset, sys_apply_step_offset ? sys_apply_step_offset : apply_step_offset, offset_convert, sys_set_leap, set_sync_status); LCL_AddParameterChangeHandler(handle_step, NULL); }