summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_dump.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/kern/kern_dump.c')
-rw-r--r--sys/kern/kern_dump.c36
1 files changed, 17 insertions, 19 deletions
diff --git a/sys/kern/kern_dump.c b/sys/kern/kern_dump.c
index 1fd2fdd..e3d338f 100644
--- a/sys/kern/kern_dump.c
+++ b/sys/kern/kern_dump.c
@@ -55,13 +55,11 @@ CTASSERT(sizeof(struct kerneldumpheader) == 512);
*/
#define SIZEOF_METADATA (64*1024)
-#define MD_ALIGN(x) (((off_t)(x) + PAGE_MASK) & ~PAGE_MASK)
-#define DEV_ALIGN(x) (((off_t)(x) + (DEV_BSIZE-1)) & ~(DEV_BSIZE-1))
+#define MD_ALIGN(x) roundup2((off_t)(x), PAGE_SIZE)
off_t dumplo;
/* Handle buffered writes. */
-static char buffer[DEV_BSIZE];
static size_t fragsz;
struct dump_pa dump_map[DUMPSYS_MD_PA_NPAIRS];
@@ -125,19 +123,19 @@ dumpsys_buf_write(struct dumperinfo *di, char *ptr, size_t sz)
int error;
while (sz) {
- len = DEV_BSIZE - fragsz;
+ len = di->blocksize - fragsz;
if (len > sz)
len = sz;
- bcopy(ptr, buffer + fragsz, len);
+ memcpy((char *)di->blockbuf + fragsz, ptr, len);
fragsz += len;
ptr += len;
sz -= len;
- if (fragsz == DEV_BSIZE) {
- error = dump_write(di, buffer, 0, dumplo,
- DEV_BSIZE);
+ if (fragsz == di->blocksize) {
+ error = dump_write(di, di->blockbuf, 0, dumplo,
+ di->blocksize);
if (error)
return (error);
- dumplo += DEV_BSIZE;
+ dumplo += di->blocksize;
fragsz = 0;
}
}
@@ -152,8 +150,8 @@ dumpsys_buf_flush(struct dumperinfo *di)
if (fragsz == 0)
return (0);
- error = dump_write(di, buffer, 0, dumplo, DEV_BSIZE);
- dumplo += DEV_BSIZE;
+ error = dump_write(di, di->blockbuf, 0, dumplo, di->blocksize);
+ dumplo += di->blocksize;
fragsz = 0;
return (error);
}
@@ -174,7 +172,7 @@ dumpsys_cb_dumpdata(struct dump_pa *mdp, int seqnr, void *arg)
error = 0; /* catch case in which chunk size is 0 */
counter = 0; /* Update twiddle every 16MB */
- va = 0;
+ va = NULL;
pgs = mdp->pa_size / PAGE_SIZE;
pa = mdp->pa_start;
maxdumppgs = min(di->maxiosize / PAGE_SIZE, MAXDUMPPGS);
@@ -286,7 +284,7 @@ dumpsys_generic(struct dumperinfo *di)
Elf_Ehdr ehdr;
uint64_t dumpsize;
off_t hdrgap;
- size_t hdrsz;
+ size_t hdrsz, size;
int error;
#ifndef __powerpc__
@@ -324,15 +322,15 @@ dumpsys_generic(struct dumperinfo *di)
hdrsz = ehdr.e_phoff + ehdr.e_phnum * ehdr.e_phentsize;
fileofs = MD_ALIGN(hdrsz);
dumpsize += fileofs;
- hdrgap = fileofs - DEV_ALIGN(hdrsz);
+ hdrgap = fileofs - roundup2((off_t)hdrsz, di->blocksize);
/* Determine dump offset on device. */
- if (di->mediasize < SIZEOF_METADATA + dumpsize + sizeof(kdh) * 2) {
+ if (di->mediasize < SIZEOF_METADATA + dumpsize + di->blocksize * 2) {
error = ENOSPC;
goto fail;
}
dumplo = di->mediaoffset + di->mediasize - dumpsize;
- dumplo -= sizeof(kdh) * 2;
+ dumplo -= di->blocksize * 2;
mkdumpheader(&kdh, KERNELDUMPMAGIC, KERNELDUMP_ARCH_VERSION, dumpsize,
di->blocksize);
@@ -341,10 +339,10 @@ dumpsys_generic(struct dumperinfo *di)
ehdr.e_phnum - DUMPSYS_NUM_AUX_HDRS);
/* Dump leader */
- error = dump_write(di, &kdh, 0, dumplo, sizeof(kdh));
+ error = dump_write_pad(di, &kdh, 0, dumplo, sizeof(kdh), &size);
if (error)
goto fail;
- dumplo += sizeof(kdh);
+ dumplo += size;
/* Dump ELF header */
error = dumpsys_buf_write(di, (char*)&ehdr, sizeof(ehdr));
@@ -375,7 +373,7 @@ dumpsys_generic(struct dumperinfo *di)
goto fail;
/* Dump trailer */
- error = dump_write(di, &kdh, 0, dumplo, sizeof(kdh));
+ error = dump_write_pad(di, &kdh, 0, dumplo, sizeof(kdh), &size);
if (error)
goto fail;
OpenPOWER on IntegriCloud