📄 tickadj.c
字号:
ktick,#ifdef K_TICK_NAME K_TICK_NAME#else "<this can't happen>"#endif ); }#ifdef PRESET_TICK (void) printf("PRESET tick = %d usec\n", tick);#endif /* PRESET_TICK */ if (tickadj_offset != 0) { (void) printf("KERNEL tickadj = %d usec (from %s kernel variable)\n", ktickadj,#ifdef K_TICKADJ_NAME K_TICKADJ_NAME#else "<this can't happen>"#endif ); }#ifdef PRESET_TICKADJ (void) printf("PRESET tickadj = %d usec\n", tickadj);#endif /* PRESET_TICKADJ */ if (dosync_offset != 0) { (void) printf("dosynctodr is %s\n", dosynctodr ? "on" : "off"); } if (noprintf_offset != 0) { (void) printf("kernel level printf's: %s\n", noprintf ? "off" : "on"); } } if (tick <= 0) { (void) fprintf(stderr, "%s: the value of tick is silly!\n", progname); exit(1); } hz_int = (int)(1000000L / (long)tick); hz_hundredths = (int)((100000000L / (long)tick) - ((long)hz_int * 100L)); if (!quiet) { (void) printf("KERNEL hz = %d\n", hz); (void) printf("calculated hz = %d.%02d Hz\n", hz_int, hz_hundredths); }#if defined SCO5_CLOCK recommend_tickadj = 100;#else /* SCO5_CLOCK */ tmp = (long) tick * 500L; recommend_tickadj = (int)(tmp / 1000000L); if (tmp % 1000000L > 0) { recommend_tickadj++; }#ifdef MIN_REC_TICKADJ if (recommend_tickadj < MIN_REC_TICKADJ) { recommend_tickadj = MIN_REC_TICKADJ; }#endif /* MIN_REC_TICKADJ */#endif /* SCO5_CLOCK */ if ((!quiet) && (tickadj_offset != 0)) { (void) printf("recommended value of tickadj = %d us\n", recommend_tickadj); } if ( writetickadj == 0 && !writeopttickadj && !unsetdosync && writetick == 0 && !setnoprintf) { exit(errflg ? 1 : 0); } if (writetickadj == 0 && writeopttickadj) { writetickadj = recommend_tickadj; } fd = openfile(file, O_WRONLY); if (setnoprintf && (noprintf_offset != 0)) { if (!quiet) { (void) fprintf(stderr, "setting noprintf: "); (void) fflush(stderr); } writevar(fd, noprintf_offset, 1); if (!quiet) { (void) fprintf(stderr, "done!\n"); } } if ((writetick > 0) && (tick_offset != 0)) { if (!quiet) { (void) fprintf(stderr, "writing tick, value %d: ", writetick); (void) fflush(stderr); } writevar(fd, tick_offset, writetick); if (!quiet) { (void) fprintf(stderr, "done!\n"); } } if ((writetickadj > 0) && (tickadj_offset != 0)) { if (!quiet) { (void) fprintf(stderr, "writing tickadj, value %d: ", writetickadj); (void) fflush(stderr); }#ifdef SCO5_CLOCK /* scale from usec/tick to nsec/sec */ writetickadj *= (1000L * HZ);#endif /* SCO5_CLOCK */ writevar(fd, tickadj_offset, writetickadj); if (!quiet) { (void) fprintf(stderr, "done!\n"); } } if (unsetdosync && (dosync_offset != 0)) { if (!quiet) { (void) fprintf(stderr, "zeroing dosynctodr: "); (void) fflush(stderr); } writevar(fd, dosync_offset, 0); if (!quiet) { (void) fprintf(stderr, "done!\n"); } } (void) close(fd); return(errflg ? 1 : 0);}/* * getoffsets - read the magic offsets from the specified file */static voidgetoffsets( off_t *tick_off, off_t *tickadj_off, off_t *dosync_off, off_t *noprintf_off ){#ifndef NOKMEM# ifndef HAVE_KVM_OPEN const char **kname;# endif#endif#ifndef NOKMEM# ifdef NLIST_NAME_UNION# define NL_B {{# define NL_E }}# else# define NL_B {# define NL_E }# endif#endif#define K_FILLER_NAME "DavidLetterman"#ifdef NLIST_EXTRA_INDIRECTION int i;#endif#ifndef NOKMEM static struct nlist nl[] = { NL_B#ifdef K_TICKADJ_NAME#define N_TICKADJ 0 K_TICKADJ_NAME#else K_FILLER_NAME#endif NL_E, NL_B#ifdef K_TICK_NAME#define N_TICK 1 K_TICK_NAME#else K_FILLER_NAME#endif NL_E, NL_B#ifdef K_DOSYNCTODR_NAME#define N_DOSYNC 2 K_DOSYNCTODR_NAME#else K_FILLER_NAME#endif NL_E, NL_B#ifdef K_NOPRINTF_NAME#define N_NOPRINTF 3 K_NOPRINTF_NAME#else K_FILLER_NAME#endif NL_E, NL_B "" NL_E, };#ifndef HAVE_KVM_OPEN static const char *kernels[] = {#ifdef HAVE_GETBOOTFILE NULL, /* *** SEE BELOW! *** */#endif "/kernel/unix", "/kernel", "/vmunix", "/unix", "/mach", "/hp-ux", "/386bsd", "/netbsd", "/stand/vmunix", "/bsd", NULL };#endif /* not HAVE_KVM_OPEN */#ifdef HAVE_KVM_OPEN /* * Solaris > 2.5 doesn't have a kernel file. Use the kvm_* interface * to read the kernel name list. -- stolcke 3/4/96 */ kvm_t *kvm_handle = kvm_open(NULL, NULL, NULL, O_RDONLY, progname); if (kvm_handle == NULL) { (void) fprintf(stderr, "%s: kvm_open failed\n", progname); exit(1); } if (kvm_nlist(kvm_handle, nl) == -1) { (void) fprintf(stderr, "%s: kvm_nlist failed\n", progname); exit(1); } kvm_close(kvm_handle);#else /* not HAVE_KVM_OPEN */#ifdef HAVE_GETBOOTFILE /* *** SEE HERE! *** */ if (kernels[0] == NULL) { char * cp = (char *)getbootfile(); if (cp) { kernels[0] = cp; } else { kernels[0] = "/Placeholder"; } }#endif /* HAVE_GETBOOTFILE */ for (kname = kernels; *kname != NULL; kname++) { struct stat stbuf; if (stat(*kname, &stbuf) == -1) { continue; } if (nlist(*kname, nl) >= 0) { break; } else { (void) fprintf(stderr, "%s: nlist didn't find needed symbols from <%s>: %s\n", progname, *kname, strerror(errno)); } } if (*kname == NULL) { (void) fprintf(stderr, "%s: Couldn't find the kernel\n", progname); exit(1); }#endif /* HAVE_KVM_OPEN */ if (dokmem) { file = kmem; fd = openfile(file, O_RDONLY);#ifdef NLIST_EXTRA_INDIRECTION /* * Go one more round of indirection. */ for (i = 0; i < (sizeof(nl) / sizeof(struct nlist)); i++) { if ((nl[i].n_value) && (nl[i].n_sclass == 0x6b)) { readvar(fd, nl[i].n_value, &nl[i].n_value); } }#endif /* NLIST_EXTRA_INDIRECTION */ }#endif /* not NOKMEM */ *tickadj_off = 0; *tick_off = 0; *dosync_off = 0; *noprintf_off = 0;#if defined(N_TICKADJ) *tickadj_off = nl[N_TICKADJ].n_value;#endif#if defined(N_TICK) *tick_off = nl[N_TICK].n_value;#endif#if defined(N_DOSYNC) *dosync_off = nl[N_DOSYNC].n_value;#endif#if defined(N_NOPRINTF) *noprintf_off = nl[N_NOPRINTF].n_value;#endif return;}#undef N_TICKADJ#undef N_TICK#undef N_DOSYNC#undef N_NOPRINTF/* * openfile - open the file, check for errors */static intopenfile( const char *name, int mode ){ int ifd; ifd = open(name, mode); if (ifd < 0) { (void) fprintf(stderr, "%s: open %s: ", progname, name); perror(""); exit(1); } return ifd;}/* * writevar - write a variable into the file */static voidwritevar( int ofd, off_t off, int var ){ if (lseek(ofd, off, L_SET) == -1) { (void) fprintf(stderr, "%s: lseek fails: ", progname); perror(""); exit(1); } if (write(ofd, (char *)&var, sizeof(int)) != sizeof(int)) { (void) fprintf(stderr, "%s: write fails: ", progname); perror(""); exit(1); } return;}/* * readvar - read a variable from the file */static voidreadvar( int ifd, off_t off, int *var ){ int i; if (lseek(ifd, off, L_SET) == -1) { (void) fprintf(stderr, "%s: lseek fails: ", progname); perror(""); exit(1); } i = read(ifd, (char *)var, sizeof(int)); if (i < 0) { (void) fprintf(stderr, "%s: read fails: ", progname); perror(""); exit(1); } if (i != sizeof(int)) { (void) fprintf(stderr, "%s: read expected %d, got %d\n", progname, (int)sizeof(int), i); exit(1); } return;}#endif /* not Linux */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -