void dumpconf(void) { int nblks, block; if (dumpdev == NODEV || (nblks = (bdevsw[major(dumpdev)].d_psize)(dumpdev)) == 0) return; if (nblks <= ctod(1)) return; dumpsize = physmem; /* Always skip the first CLBYTES, in case there is a label there. */ if (dumplo < ctod(1)) dumplo = ctod(1); /* Put dump at end of partition, and make it fit. */ if (dumpsize + 1 > dtoc(nblks - dumplo)) dumpsize = dtoc(nblks - dumplo) - 1; if (dumplo < nblks - ctod(dumpsize) - 1) dumplo = nblks - ctod(dumpsize) - 1; for (block = 0; block < bootconfig.dramblocks; block++) { cpu_kcore_hdr.ram_segs[block].start = bootconfig.dram[block].address; cpu_kcore_hdr.ram_segs[block].size = ptoa(bootconfig.dram[block].pages); } }
void vsprintf(char *buf, const char *fmt, va_list argp) { char *p; char *p2; int length; int prec; int ladjust; char padc; int n; unsigned int u; int negflag; char c; while (*fmt != '\0') { if (*fmt != '%') { *buf++ = *fmt++; continue; } fmt++; if (*fmt == 'l') fmt++; /* need to use it if sizeof(int) < sizeof(long) */ length = 0; prec = -1; ladjust = FALSE; padc = ' '; if (*fmt == '-') { ladjust = TRUE; fmt++; } if (*fmt == '0') { padc = '0'; fmt++; } if (isdigit (*fmt)) { while (isdigit (*fmt)) length = 10 * length + ctod (*fmt++); } else if (*fmt == '*') { length = va_arg (argp, int); fmt++; if (length < 0) { ladjust = !ladjust; length = -length; } } if (*fmt == '.') { fmt++; if (isdigit (*fmt)) { prec = 0; while (isdigit (*fmt)) prec = 10 * prec + ctod (*fmt++); } else if (*fmt == '*') { prec = va_arg (argp, int); fmt++; }
void dumpconf(void) { int nblks; if (dumpdev == NODEV || (nblks = (bdevsw[major(dumpdev)].d_psize)(dumpdev)) == 0) return; if (nblks <= ctod(1)) return; dumpsize = physmem; if (dumpsize > atop(dbtob(nblks - dumplo))) dumpsize = atop(dbtob(nblks - dumplo)); else if (dumplo == 0) dumplo = nblks - btodb(ptoa(dumpsize)); /* * Don't dump on the first block in case the dump * device includes a disk label. */ if (dumplo < btodb(PAGE_SIZE)) dumplo = btodb(PAGE_SIZE); /* Put dump at the end of partition, and make it fit. */ if (dumpsize + 1 > dtoc(nblks - dumplo)) dumpsize = dtoc(nblks - dumplo) - 1; if (dumplo < nblks - ctod(dumpsize) - 1) dumplo = nblks - ctod(dumpsize) - 1; /* memory is contiguous on vax */ cpu_kcore_hdr.ram_segs[0].start = 0; cpu_kcore_hdr.ram_segs[0].size = ptoa(physmem); cpu_kcore_hdr.sysmap = (vaddr_t)Sysmap; }
/* * This is called by configure to set dumplo and dumpsize. * Dumps always skip the first CLBYTES of disk space * in case there might be a disk label stored there. * If there is extra space, put dump at the end to * reduce the chance that swapping trashes it. */ void dumpconf(void) { extern int dumpsize; int nblks, dumpblks; /* size of dump area */ if (dumpdev == NODEV || (nblks = (bdevsw[major(dumpdev)].d_psize)(dumpdev)) == 0) return; if (nblks <= ctod(1)) return; dumpblks = cpu_dumpsize(); if (dumpblks < 0) return; dumpblks += ctod(physmem); /* If dump won't fit (incl. room for possible label), punt. */ if (dumpblks > (nblks - ctod(1))) return; /* Put dump at end of partition */ dumplo = nblks - dumpblks; /* dumpsize is in page units, and doesn't include headers. */ dumpsize = physmem; }
void dumpconf(void) { cpu_kcore_hdr_t *h = &cpu_kcore_hdr; u_int dumpextra, totaldumpsize; /* in disk blocks */ u_int seg, nblks; if (dumpdev == NODEV || (nblks = (bdevsw[major(dumpdev)].d_psize)(dumpdev)) == 0) return; if (nblks <= ctod(1)) return; dumpsize = 0; for (seg = 0; seg < h->kcore_nsegs; seg++) dumpsize += atop(h->kcore_segs[seg].size); dumpextra = cpu_dumpsize(); /* Always skip the first block, in case there is a label there. */ if (dumplo < btodb(1)) dumplo = btodb(1); /* Put dump at the end of the partition, and make it fit. */ totaldumpsize = ctod(dumpsize) + dumpextra; if (totaldumpsize > nblks - dumplo) { totaldumpsize = dbtob(nblks - dumplo); dumpsize = dtoc(totaldumpsize - dumpextra); } if (dumplo < nblks - totaldumpsize) dumplo = nblks - totaldumpsize; }
void dumpconf() { int nblks; /* size of dump area */ int maj; if (dumpdev == NODEV) return; maj = major(dumpdev); if (maj < 0 || maj >= nblkdev) panic("dumpconf: bad dumpdev=0x%x", dumpdev); if (bdevsw[maj].d_psize == NULL) return; nblks = (*bdevsw[maj].d_psize)(dumpdev); if (nblks <= ctod(1)) return; dumpsize = btoc(IOM_END + ctob(dumpmem_high)); /* Always skip the first CLBYTES, in case there is a label there. */ if (dumplo < ctod(1)) dumplo = ctod(1); /* Put dump at end of partition, and make it fit. */ if (dumpsize > dtoc(nblks - dumplo)) dumpsize = dtoc(nblks - dumplo); if (dumplo < nblks - ctod(dumpsize)) dumplo = nblks - ctod(dumpsize); }
/* * This is called by configure to set dumplo and dumpsize. * Dumps always skip the first PAGE_SIZE of disk space * in case there might be a disk label stored there. * If there is extra space, put dump at the end to * reduce the chance that swapping trashes it. */ void dumpconf(void) { int nblks; /* size of dump area */ if (dumpdev == NODEV || (nblks = (bdevsw[major(dumpdev)].d_psize)(dumpdev)) == 0) return; if (nblks <= ctod(1)) return; dumpsize = physmem; /* aviion only uses a single segment. */ cpu_kcore_hdr.ram_segs[0].start = 0; cpu_kcore_hdr.ram_segs[0].size = ptoa(physmem); cpu_kcore_hdr.cputype = cputyp; /* * Don't dump on the first block * in case the dump device includes a disk label. */ if (dumplo < ctod(1)) dumplo = ctod(1); /* Put dump at end of partition, and make it fit. */ if (dumpsize + 1 > dtoc(nblks - dumplo)) dumpsize = dtoc(nblks - dumplo) - 1; if (dumplo < nblks - ctod(dumpsize) - 1) dumplo = nblks - ctod(dumpsize) - 1; }
/** * Converts a string of numerical digits (0-9) into a signed integer. * @param s The string to convert. * @return The signed integer on success, otherwise 0 is returned. */ int stonum(char *s){ // vars int num = 0; int d; // check if we need to sign it int c = 0; if(s[0] == '-') c = 1; // convert while(s[c]){ d = ctod(*s); if(d < 0) return 0; num += d; c++; } // sign the value if(s[0] == '-') num *= -1; return num; }
/* * This is called by main to set dumplo and dumpsize. * Dumps always skip the first PAGE_SIZE of disk space * in case there might be a disk label stored there. * If there is extra space, put dump at the end to * reduce the chance that swapping trashes it. * * Sparse dumps can't placed as close to the end as possible, because * savecore(8) has to know where to start reading in the dump device * before it has access to any of the crashed system's state. * * Note also that a sparse dump will never be larger than a full one: * in order to add a phys_ram_seg_t to the header, at least one page * must be removed. */ void cpu_dumpconf(void) { const struct bdevsw *bdev; int nblks, dumpblks; /* size of dump area */ if (dumpdev == NODEV) goto bad; bdev = bdevsw_lookup(dumpdev); if (bdev == NULL) { dumpdev = NODEV; goto bad; } if (bdev->d_psize == NULL) goto bad; nblks = (*bdev->d_psize)(dumpdev); if (nblks <= ctod(1)) goto bad; dumpblks = cpu_dumpsize(); if (dumpblks < 0) goto bad; dumpblks += ctod(cpu_dump_mempagecnt()); /* If dump won't fit (incl. room for possible label): */ if (dumpblks > (nblks - ctod(1))) { /* A sparse dump might (and hopefully will) fit. */ dumplo = ctod(1); } else { /* Put dump at end of partition */ dumplo = nblks - dumpblks; } /* dumpsize is in page units, and doesn't include headers. */ dumpsize = cpu_dump_mempagecnt(); /* Now that we've decided this will work, init ancillary stuff. */ dump_misc_init(); return; bad: dumpsize = 0; }
/* * This is called by main to set dumplo and dumpsize. * Dumps always skip the first PAGE_SIZE of disk space * in case there might be a disk label stored there. * If there is extra space, put dump at the end to * reduce the chance that swapping trashes it. */ void dumpconf(void) { const struct bdevsw *bdev; int nblks, dumpblks; /* size of dump area */ if (dumpdev == NODEV) goto bad; bdev = &bdevsw[major(dumpdev)]; if (bdev == NULL) panic("dumpconf: bad dumpdev=0x%x", dumpdev); if (bdev->d_psize == NULL) goto bad; nblks = (*bdev->d_psize)(dumpdev); if (nblks <= ctod(1)) goto bad; dumpblks = cpu_dumpsize(); if (dumpblks < 0) goto bad; dumpblks += ctod(cpu_dump_mempagecnt()); /* If dump won't fit (incl. room for possible label), punt. */ if (dumpblks > (nblks - ctod(1))) goto bad; /* Put dump at end of partition */ dumplo = nblks - dumpblks; /* dumpsize is in page units, and doesn't include headers. */ dumpsize = cpu_dump_mempagecnt(); return; bad: dumpsize = 0; }
/* * Configure swap space and related parameters. */ void swapconf() { struct swdevt *swp; int nblks; for (swp = swdevt; swp->sw_dev != NODEV; swp++) if (bdevsw[major(swp->sw_dev)].d_psize) { nblks = (*bdevsw[major(swp->sw_dev)].d_psize)(swp->sw_dev); if (nblks != -1 && (swp->sw_nblks == 0 || swp->sw_nblks > nblks)) swp->sw_nblks = nblks; swp->sw_nblks = ctod(dtoc(swp->sw_nblks)); } dumpconf(); }
int atoin(const char *source, int *status) { /* * like atoi but only accepts digits */ unsigned int base = 10, num = 0, i = 0; int digit; *status = 1; while(source[i]) { digit = ctod(source[i]); if (digit > base || digit < 0) { *status = 0; break; } num = num * base + digit; ++i; } return num; }
static time_t ascdatetotime(char *string, bool heavy) { bool utc = FALSE; static char *months[] = {"---", "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", "---", "---", "---"}; static unsigned msize[] ={ 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; struct tm tm, *tm2; time_t lsec; char am_pm, flg24; char *ptr = string; char *day="", *month="", *year=""; char *hour="",*minute="",*second=""; /* check - does it start with 'UTC'? */ if ((!strncmp(ptr,"UTC",3))||(!strncmp(ptr,"utc",3))) { utc = TRUE; ptr+=3; } /* change default from 0:0:0 to 59:59:59 if heavy */ if (heavy) { hour = "23"; minute = second = "59"; } else { hour = minute = second = "0"; } /* "dd/mm/yy hh:mm:ss" */ do { SKIP_WHITE(ptr); day = ptr; SKIP_TO_SLASH(ptr); BREAK_ON_END(ptr); month = ptr; SKIP_TO_SLASH(ptr); BREAK_ON_END(ptr); year = ptr; SKIP_TO_WHITE(ptr); BREAK_ON_END(ptr); SKIP_WHITE(ptr); minute = second = NULL; hour = ptr; SKIP_TO_COLON(ptr); BREAK_ON_END(ptr); minute = ptr; SKIP_TO_COLON(ptr); BREAK_ON_END(ptr); second = ptr; SKIP_TO_WHITE(ptr); BREAK_ON_END(ptr); break; } while (FALSE); #ifdef TDIAG fprintf(stderr,"day = '%s'\n",day); fprintf(stderr,"month = '%s'\n",month); fprintf(stderr,"year = '%s'\n",year); fprintf(stderr,"hour = '%s'\n",hour); fprintf(stderr,"minute = '%s'\n",minute); fprintf(stderr,"second = '%s'\n",second); #endif if (!utc) { /* learn whether we are in daylight savings time or not */ lsec = time(NULL); tm2 = localtime(&lsec); tm.tm_isdst = tm2->tm_isdst; } else tm.tm_isdst = 0; tm.tm_min = 0; am_pm = 0; flg24 = 1; tm.tm_sec = ctod(second); if(tm.tm_sec > 59) terminate("Time - Invalid second\n"); tm.tm_min = ctod(minute); if(tm.tm_min > 59) terminate("Time - Invalid minute\n"); tm.tm_hour = ctod(hour); if(tm.tm_hour > 23) terminate("Time - Invalid hour\n"); if(am_pm && !flg24 && tm.tm_hour < 12) tm.tm_hour += 12; if(tm.tm_hour > 11) am_pm = 1; tm.tm_year = ctod(year); if (tm.tm_year>=0 && tm.tm_year<=38) tm.tm_year+=2000; // 00-38 is 2000-2038 if(tm.tm_year >= 1970) tm.tm_year -= 1900; if(tm.tm_year < 70 || tm.tm_year > 155) terminate("Date - Invalid year\n"); if(month[0] >= '0' && month[0] <= '9') { tm.tm_mon = ctod(month) - 1; } else { for(tm.tm_mon = 0; tm.tm_mon < 12; ++tm.tm_mon) if(comp(months[tm.tm_mon + 1], month)) break; } if(tm.tm_mon > 11) terminate("Date - Invalid month\n"); if(tm.tm_mon == 1 && (tm.tm_year % 4) == 2) msize[2] = 29; /* leap years allow feb 29 */ tm.tm_mday = ctod(day); if(tm.tm_mday > msize[tm.tm_mon + 1] || tm.tm_mday == 0) terminate("Date - Invalid day\n"); lsec = mktime(&tm); if (utc) #if defined(__CYGWIN32__) || defined(__MINGW32__) lsec = lsec - _timezone; #else lsec = lsec - timezone; #endif #ifdef TDIAG fprintf(stderr,"lsec = %ld\n",lsec); #endif return(lsec); }
void dumpsys() { cpu_kcore_hdr_t *h = &cpu_kcore_hdr; daddr64_t blkno; int (*dump)(dev_t, daddr64_t, caddr_t, size_t); u_int page = 0; paddr_t dumppa; u_int seg; int rc; extern int msgbufmapped; /* Don't record dump messages in msgbuf. */ msgbufmapped = 0; /* Make sure dump settings are valid. */ if (dumpdev == NODEV) return; if (dumpsize == 0) { dumpconf(); if (dumpsize == 0) return; } if (dumplo <= 0) { printf("\ndump to dev 0x%x not possible, not enough space\n", dumpdev); return; } dump = bdevsw[major(dumpdev)].d_dump; blkno = dumplo; printf("\ndumping to dev 0x%x offset %ld\n", dumpdev, dumplo); #ifdef UVM_SWAP_ENCRYPT uvm_swap_finicrypt_all(); #endif printf("dump "); /* Write dump header */ rc = cpu_dump(dump, &blkno); if (rc != 0) goto bad; for (seg = 0; seg < h->kcore_nsegs; seg++) { u_int pagesleft; pagesleft = atop(h->kcore_segs[seg].size); dumppa = (paddr_t)h->kcore_segs[seg].start; while (pagesleft != 0) { u_int npages; #define NPGMB atop(1024 * 1024) if (page != 0 && (page % NPGMB) == 0) printf("%u ", page / NPGMB); /* do not dump more than 1MB at once */ npages = min(pagesleft, NPGMB); #undef NPGMB npages = min(npages, dumpsize); rc = (*dump)(dumpdev, blkno, (caddr_t)SH3_PHYS_TO_P2SEG(dumppa), ptoa(npages)); if (rc != 0) goto bad; pagesleft -= npages; dumppa += ptoa(npages); page += npages; dumpsize -= npages; if (dumpsize == 0) goto bad; /* if truncated dump */ blkno += ctod(npages); } } bad: switch (rc) { case 0: printf("succeeded\n"); break; case ENXIO: printf("device bad\n"); break; case EFAULT: printf("device not ready\n"); break; case EINVAL: printf("area improper\n"); break; case EIO: printf("I/O error\n"); break; case EINTR: printf("aborted\n"); break; default: printf("error %d\n", rc); break; } /* make sure console can output our last message */ delay(1 * 1000 * 1000); }
void dodumpsys(void) { const struct bdevsw *bdev; int dumpend, psize; int error; if (dumpdev == NODEV) return; bdev = bdevsw_lookup(dumpdev); if (bdev == NULL || bdev->d_psize == NULL) return; /* * For dumps during autoconfiguration, * if dump device has already configured... */ if (dumpsize == 0) cpu_dumpconf(); if (dumplo <= 0 || dumpsize == 0) { printf("\ndump to dev %u,%u not possible\n", major(dumpdev), minor(dumpdev)); return; } printf("\ndumping to dev %u,%u offset %ld\n", major(dumpdev), minor(dumpdev), dumplo); psize = (*bdev->d_psize)(dumpdev); printf("dump "); if (psize == -1) { printf("area unavailable\n"); return; } #if 0 /* XXX this doesn't work. grr. */ /* toss any characters present prior to dump */ while (sget() != NULL); /*syscons and pccons differ */ #endif dump_seg_prep(); dumpend = dumplo + btodb(dump_header_size) + ctod(dump_npages); if (dumpend > psize) { printf("failed: insufficient space (%d < %d)\n", psize, dumpend); goto failed; } dump_header_start(); if ((error = cpu_dump()) != 0) goto err; if ((error = dump_header_finish()) != 0) goto err; if (dump_header_blkno != dumplo + btodb(dump_header_size)) { printf("BAD header size (%ld [written] != %ld [expected])\n", (long)(dump_header_blkno - dumplo), (long)btodb(dump_header_size)); goto failed; } dump_totalbytesleft = roundup(ptoa(dump_npages), BYTES_PER_DUMP); error = dump_seg_iter(dumpsys_seg); if (error == 0 && dump_header_blkno != dumpend) { printf("BAD dump size (%ld [written] != %ld [expected])\n", (long)(dumpend - dumplo), (long)(dump_header_blkno - dumplo)); goto failed; } err: switch (error) { case ENXIO: printf("device bad\n"); break; case EFAULT: printf("device not ready\n"); break; case EINVAL: printf("area improper\n"); break; case EIO: printf("i/o error\n"); break; case EINTR: printf("aborted from console\n"); break; case 0: printf("succeeded\n"); break; default: printf("error %d\n", error); break; } failed: printf("\n\n"); delay(5000000); /* 5 seconds */ }