Blame lkcd_v5.c

Packit Service 501009
/* lkcd_v5.c - core analysis suite
Packit Service 501009
 *
Packit Service 501009
 * Copyright (C) 1999, 2000, 2001, 2002 Mission Critical Linux, Inc.
Packit Service 501009
 * Copyright (C) 2002, 2003, 2004, 2005 David Anderson
Packit Service 501009
 * Copyright (C) 2002, 2003, 2004, 2005 Red Hat, Inc. All rights reserved.
Packit Service 501009
 *
Packit Service 501009
 * This program is free software; you can redistribute it and/or modify
Packit Service 501009
 * it under the terms of the GNU General Public License as published by
Packit Service 501009
 * the Free Software Foundation; either version 2 of the License, or
Packit Service 501009
 * (at your option) any later version.
Packit Service 501009
 *
Packit Service 501009
 * This program is distributed in the hope that it will be useful,
Packit Service 501009
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 501009
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service 501009
 * GNU General Public License for more details.
Packit Service 501009
 */
Packit Service 501009
Packit Service 501009
#define LKCD_COMMON
Packit Service 501009
#include "defs.h"
Packit Service 501009
#include "lkcd_dump_v5.h"
Packit Service 501009
Packit Service 501009
static dump_header_t dump_header_v5 = { 0 };
Packit Service 501009
static dump_page_t dump_page = { 0 };
Packit Service 501009
static void mclx_cache_page_headers_v5(void);
Packit Service 501009
Packit Service 501009
/*
Packit Service 501009
 *  Verify and initialize the LKCD environment, storing the common data
Packit Service 501009
 *  in the global lkcd_environment structure.
Packit Service 501009
 */
Packit Service 501009
int
Packit Service 501009
lkcd_dump_init_v5(FILE *fp, int fd)
Packit Service 501009
{
Packit Service 501009
	int i; 
Packit Service 501009
	int eof;
Packit Service 501009
	uint32_t pgcnt;
Packit Service 501009
	dump_header_t *dh;
Packit Service 501009
	dump_page_t *dp;
Packit Service 501009
Packit Service 501009
	lkcd->fd = fd;
Packit Service 501009
	lkcd->fp = fp;
Packit Service 501009
Packit Service 501009
	lseek(lkcd->fd, 0, SEEK_SET);
Packit Service 501009
Packit Service 501009
	dh = &dump_header_v5;
Packit Service 501009
	dp = &dump_page;
Packit Service 501009
Packit Service 501009
	if (read(lkcd->fd, dh, sizeof(dump_header_t)) !=
Packit Service 501009
	    sizeof(dump_header_t))
Packit Service 501009
		return FALSE;
Packit Service 501009
Packit Service 501009
        lkcd->dump_page = dp;
Packit Service 501009
        lkcd->dump_header = dh;
Packit Service 501009
	if (lkcd->debug) 
Packit Service 501009
		dump_lkcd_environment(LKCD_DUMP_HEADER_ONLY);
Packit Service 501009
Packit Service 501009
	/*
Packit Service 501009
	 *  Allocate and clear the benchmark offsets, one per megabyte.
Packit Service 501009
	 */
Packit Service 501009
        lkcd->page_size = dh->dh_page_size;
Packit Service 501009
	lkcd->page_shift = ffs(lkcd->page_size) - 1;
Packit Service 501009
	lkcd->bits = sizeof(long) * 8;
Packit Service 501009
        lkcd->benchmark_pages = (dh->dh_num_pages/LKCD_PAGES_PER_MEGABYTE())+1;
Packit Service 501009
	lkcd->total_pages = dh->dh_num_pages;
Packit Service 501009
Packit Service 501009
	lkcd->zone_shift = ffs(ZONE_SIZE) - 1;
Packit Service 501009
	lkcd->zone_mask = ~(ZONE_SIZE - 1);
Packit Service 501009
	lkcd->num_zones = 0;
Packit Service 501009
	lkcd->max_zones = 0;
Packit Service 501009
	lkcd->zoned_offsets = 0;
Packit Service 501009
Packit Service 501009
	lkcd->get_dp_flags = get_dp_flags_v5;
Packit Service 501009
	lkcd->get_dp_address = get_dp_address_v5;
Packit Service 501009
   	lkcd->compression = dh->dh_dump_compress; 
Packit Service 501009
        lkcd->page_header_size = sizeof(dump_page_t);
Packit Service 501009
	lkcd->get_dp_size = get_dp_size_v5;
Packit Service 501009
Packit Service 501009
        lseek(lkcd->fd, LKCD_OFFSET_TO_FIRST_PAGE, SEEK_SET);
Packit Service 501009
Packit Service 501009
	for (pgcnt = 0, eof = FALSE; !eof; pgcnt++) {
Packit Service 501009
Packit Service 501009
		switch (lkcd_load_dump_page_header(dp, pgcnt))
Packit Service 501009
		{
Packit Service 501009
		case LKCD_DUMPFILE_OK:
Packit Service 501009
		case LKCD_DUMPFILE_END:
Packit Service 501009
			break;
Packit Service 501009
		
Packit Service 501009
		case LKCD_DUMPFILE_EOF:
Packit Service 501009
			lkcd_print("reached EOF\n");
Packit Service 501009
			eof = TRUE;
Packit Service 501009
			continue;
Packit Service 501009
		}
Packit Service 501009
Packit Service 501009
		if (dp->dp_flags & 
Packit Service 501009
              ~(DUMP_DH_COMPRESSED|DUMP_DH_RAW|DUMP_DH_END|LKCD_DUMP_MCLX_V0)) {
Packit Service 501009
			lkcd_print("unknown page flag in dump: %lx\n",
Packit Service 501009
				dp->dp_flags);
Packit Service 501009
		}
Packit Service 501009
		if (dp->dp_flags & (LKCD_DUMP_MCLX_V0|LKCD_DUMP_MCLX_V1))
Packit Service 501009
			lkcd->flags |= LKCD_MCLX;
Packit Service 501009
Packit Service 501009
		if (dp->dp_size > 4096) {
Packit Service 501009
			lkcd_print("dp_size > 4096: %d\n", dp->dp_size);
Packit Service 501009
			dump_lkcd_environment(LKCD_DUMP_PAGE_ONLY);
Packit Service 501009
		}
Packit Service 501009
Packit Service 501009
		if (dp->dp_flags & DUMP_DH_END) {
Packit Service 501009
			lkcd_print("found DUMP_DH_END\n");
Packit Service 501009
			break;
Packit Service 501009
		}
Packit Service 501009
Packit Service 501009
        	lseek(lkcd->fd, dp->dp_size, SEEK_CUR);
Packit Service 501009
Packit Service 501009
		if (!LKCD_DEBUG(2)) 
Packit Service 501009
			break; 
Packit Service 501009
	}
Packit Service 501009
Packit Service 501009
        /*
Packit Service 501009
         *  Allocate space for LKCD_CACHED_PAGES data pages plus one to
Packit Service 501009
         *  contain a copy of the compressed data of the current page.
Packit Service 501009
         */
Packit Service 501009
	if ((lkcd->page_cache_buf = (char *)malloc
Packit Service 501009
	    (dh->dh_page_size * (LKCD_CACHED_PAGES))) == NULL)
Packit Service 501009
		return FALSE;
Packit Service 501009
Packit Service 501009
	/*
Packit Service 501009
	 *  Clear the page data areas.
Packit Service 501009
	 */
Packit Service 501009
	lkcd_free_memory();
Packit Service 501009
	for (i = 0; i < LKCD_CACHED_PAGES; i++) {
Packit Service 501009
		lkcd->page_cache_hdr[i].pg_bufptr = 
Packit Service 501009
			&lkcd->page_cache_buf[i * dh->dh_page_size];
Packit Service 501009
	}
Packit Service 501009
Packit Service 501009
	if ((lkcd->compressed_page = (char *)malloc(dh->dh_page_size)) == NULL)
Packit Service 501009
                return FALSE;
Packit Service 501009
Packit Service 501009
	if ((lkcd->page_hash = (struct page_hash_entry *)calloc
Packit Service 501009
	    	(LKCD_PAGE_HASH, sizeof(struct page_hash_entry))) == NULL)
Packit Service 501009
		return FALSE;
Packit Service 501009
Packit Service 501009
	lkcd->total_pages = eof || (pgcnt > dh->dh_num_pages) ?
Packit Service 501009
		pgcnt : dh->dh_num_pages;
Packit Service 501009
	lkcd->panic_task = (ulong)dh->dh_current_task;
Packit Service 501009
	lkcd->panic_string = (char *)&dh->dh_panic_string[0];
Packit Service 501009
Packit Service 501009
	if (dh->dh_version & LKCD_DUMP_MCLX_V1) 
Packit Service 501009
		mclx_cache_page_headers_v5();
Packit Service 501009
Packit Service 501009
        if (!fp)
Packit Service 501009
                lkcd->flags |= LKCD_REMOTE;
Packit Service 501009
	lkcd->flags |= LKCD_VALID;
Packit Service 501009
Packit Service 501009
	return TRUE;
Packit Service 501009
}
Packit Service 501009
Packit Service 501009
Packit Service 501009
/*
Packit Service 501009
 *  Return the current page's dp_size.
Packit Service 501009
 */
Packit Service 501009
uint32_t 
Packit Service 501009
get_dp_size_v5(void) 
Packit Service 501009
{
Packit Service 501009
        dump_page_t *dp;
Packit Service 501009
Packit Service 501009
        dp = (dump_page_t *)lkcd->dump_page;
Packit Service 501009
Packit Service 501009
        return(dp->dp_size);
Packit Service 501009
}
Packit Service 501009
Packit Service 501009
/*
Packit Service 501009
 *  Return the current page's dp_flags.
Packit Service 501009
 */
Packit Service 501009
uint32_t 
Packit Service 501009
get_dp_flags_v5(void) 
Packit Service 501009
{
Packit Service 501009
        dump_page_t *dp;
Packit Service 501009
Packit Service 501009
        dp = (dump_page_t *)lkcd->dump_page;
Packit Service 501009
Packit Service 501009
        return(dp->dp_flags);
Packit Service 501009
}
Packit Service 501009
Packit Service 501009
/*
Packit Service 501009
 *  Return the current page's dp_address.
Packit Service 501009
 */
Packit Service 501009
uint64_t 
Packit Service 501009
get_dp_address_v5(void)
Packit Service 501009
{
Packit Service 501009
        dump_page_t *dp;
Packit Service 501009
Packit Service 501009
        dp = (dump_page_t *)lkcd->dump_page;
Packit Service 501009
Packit Service 501009
        return(dp->dp_address);
Packit Service 501009
}    
Packit Service 501009
Packit Service 501009
/*
Packit Service 501009
 *  help -S output, or as specified by arg.
Packit Service 501009
 */
Packit Service 501009
void
Packit Service 501009
dump_lkcd_environment_v5(ulong arg)
Packit Service 501009
{
Packit Service 501009
	int others;
Packit Service 501009
        dump_header_t *dh;
Packit Service 501009
        dump_page_t *dp;
Packit Service 501009
Packit Service 501009
        dh = (dump_header_t *)lkcd->dump_header;
Packit Service 501009
        dp = (dump_page_t *)lkcd->dump_page;
Packit Service 501009
Packit Service 501009
	if (arg == LKCD_DUMP_HEADER_ONLY)
Packit Service 501009
		goto dump_header_only;
Packit Service 501009
	if (arg == LKCD_DUMP_PAGE_ONLY)
Packit Service 501009
		goto dump_page_only;
Packit Service 501009
Packit Service 501009
dump_header_only:
Packit Service 501009
Packit Service 501009
	lkcd_print("     dump_header:\n");
Packit Service 501009
        lkcd_print(" dh_magic_number: ");
Packit Service 501009
	lkcd_print(BITS32() ? "%llx  " : "%lx  ", dh->dh_magic_number);
Packit Service 501009
        if (dh->dh_magic_number == DUMP_MAGIC_NUMBER)
Packit Service 501009
                lkcd_print("(DUMP_MAGIC_NUMBER)\n");
Packit Service 501009
        else if (dh->dh_magic_number == DUMP_MAGIC_LIVE)
Packit Service 501009
                lkcd_print("(DUMP_MAGIC_LIVE)\n");
Packit Service 501009
        else
Packit Service 501009
                lkcd_print("(?)\n");
Packit Service 501009
	others = 0;
Packit Service 501009
	lkcd_print("      dh_version: ");
Packit Service 501009
        lkcd_print(BITS32() ? "%lx (" : "%x (", dh->dh_version);
Packit Service 501009
        switch (dh->dh_version & LKCD_DUMP_VERSION_NUMBER_MASK)
Packit Service 501009
        {
Packit Service 501009
        case LKCD_DUMP_V1:
Packit Service 501009
                lkcd_print("%sLKCD_DUMP_V1", others++ ? "|" : "");
Packit Service 501009
		break;
Packit Service 501009
        case LKCD_DUMP_V2:
Packit Service 501009
                lkcd_print("%sLKCD_DUMP_V2", others++ ? "|" : "");
Packit Service 501009
		break;
Packit Service 501009
        case LKCD_DUMP_V3:
Packit Service 501009
                lkcd_print("%sLKCD_DUMP_V3", others++ ? "|" : "");
Packit Service 501009
		break;
Packit Service 501009
        case LKCD_DUMP_V5:
Packit Service 501009
                lkcd_print("%sLKCD_DUMP_V5", others++ ? "|" : "");
Packit Service 501009
		break;
Packit Service 501009
        }
Packit Service 501009
        if (dh->dh_version & LKCD_DUMP_MCLX_V0)
Packit Service 501009
                lkcd_print("%sLKCD_DUMP_MCLX_V0", others++ ? "|" : "");
Packit Service 501009
        if (dh->dh_version & LKCD_DUMP_MCLX_V1)
Packit Service 501009
                lkcd_print("%sLKCD_DUMP_MCLX_V1", others++ ? "|" : "");
Packit Service 501009
        lkcd_print(")\n");
Packit Service 501009
	lkcd_print("  dh_header_size: ");
Packit Service 501009
	lkcd_print(BITS32() ? "%ld\n" : "%d\n", dh->dh_header_size);
Packit Service 501009
        lkcd_print("   dh_dump_level: ");
Packit Service 501009
	lkcd_print(BITS32() ? "%lx  (" : "%x  (", dh->dh_dump_level);
Packit Service 501009
	others = 0;
Packit Service 501009
	if (dh->dh_dump_level & DUMP_LEVEL_HEADER)
Packit Service 501009
                lkcd_print("%sDUMP_LEVEL_HEADER", others++ ? "|" : "");
Packit Service 501009
	if (dh->dh_dump_level & DUMP_LEVEL_KERN)
Packit Service 501009
                lkcd_print("%sDUMP_LEVEL_KERN", others++ ? "|" : "");
Packit Service 501009
	if (dh->dh_dump_level & DUMP_LEVEL_USED)
Packit Service 501009
                lkcd_print("%sDUMP_LEVEL_USED", others++ ? "|" : "");
Packit Service 501009
	if (dh->dh_dump_level & DUMP_LEVEL_ALL)
Packit Service 501009
                lkcd_print("%sDUMP_LEVEL_ALL", others++ ? "|" : "");
Packit Service 501009
	lkcd_print(")\n");
Packit Service 501009
        lkcd_print("    dh_page_size: ");
Packit Service 501009
	lkcd_print(BITS32() ? "%ld\n" : "%d\n", dh->dh_page_size);
Packit Service 501009
        lkcd_print("  dh_memory_size: ");
Packit Service 501009
	lkcd_print(BITS32() ? "%lld\n" : "%ld\n", dh->dh_memory_size);
Packit Service 501009
        lkcd_print(" dh_memory_start: ");
Packit Service 501009
	lkcd_print(BITS32() ? "%llx\n" : "%lx\n", dh->dh_memory_start);
Packit Service 501009
        lkcd_print("   dh_memory_end: ");
Packit Service 501009
	lkcd_print(BITS32() ? "%llx\n" : "%lx\n", dh->dh_memory_end);
Packit Service 501009
	lkcd_print("    dh_num_pages: ");
Packit Service 501009
	lkcd_print(BITS32() ? "%ld\n" : "%d\n", dh->dh_num_pages);
Packit Service 501009
        lkcd_print(" dh_panic_string: %s%s", dh->dh_panic_string,
Packit Service 501009
		dh && dh->dh_panic_string &&
Packit Service 501009
		strstr(dh->dh_panic_string, "\n") ? "" : "\n");
Packit Service 501009
        lkcd_print("         dh_time: %s\n",
Packit Service 501009
                        strip_linefeeds(ctime(&(dh->dh_time.tv_sec))));
Packit Service 501009
Packit Service 501009
	lkcd_print("dh_utsname_sysname: %s\n", dh->dh_utsname_sysname);
Packit Service 501009
	lkcd_print("dh_utsname_nodename: %s\n", dh->dh_utsname_nodename);
Packit Service 501009
	lkcd_print("dh_utsname_release: %s\n", dh->dh_utsname_release);
Packit Service 501009
	lkcd_print("dh_utsname_version: %s\n", dh->dh_utsname_version);
Packit Service 501009
	lkcd_print("dh_utsname_machine: %s\n", dh->dh_utsname_machine);
Packit Service 501009
	lkcd_print("dh_utsname_domainname: %s\n", dh->dh_utsname_domainname);
Packit Service 501009
Packit Service 501009
        lkcd_print(" dh_current_task: %lx\n", dh->dh_current_task);
Packit Service 501009
Packit Service 501009
        lkcd_print(" dh_dump_compress: ");
Packit Service 501009
	lkcd_print(BITS32() ? "%lx  (" : "%x  (", dh->dh_dump_compress);
Packit Service 501009
	others = 0;
Packit Service 501009
	if (dh->dh_dump_compress == DUMP_COMPRESS_NONE)
Packit Service 501009
                lkcd_print("%sDUMP_COMPRESS_NONE", others++ ? "|" : "");
Packit Service 501009
	if (dh->dh_dump_compress & DUMP_COMPRESS_RLE)
Packit Service 501009
                lkcd_print("%sDUMP_COMPRESS_RLE", others++ ? "|" : "");
Packit Service 501009
	if (dh->dh_dump_compress & DUMP_COMPRESS_GZIP)
Packit Service 501009
                lkcd_print("%sDUMP_COMPRESS_GZIP", others++ ? "|" : "");
Packit Service 501009
	lkcd_print(")\n");
Packit Service 501009
Packit Service 501009
        lkcd_print(" dh_dump_flags: ");
Packit Service 501009
	others = 0;
Packit Service 501009
	lkcd_print(BITS32() ? "%lx  (" : "%x  (", dh->dh_dump_flags);
Packit Service 501009
	if (dh->dh_dump_flags & DUMP_FLAGS_NONDISRUPT)
Packit Service 501009
                lkcd_print("%sDUMP_FLAGS_NONDISRUPT", others++ ? "|" : "");
Packit Service 501009
	lkcd_print(")\n");
Packit Service 501009
Packit Service 501009
        lkcd_print(" dh_dump_device: ");
Packit Service 501009
	lkcd_print(BITS32() ? "%lx\n" : "%x\n", dh->dh_dump_device);
Packit Service 501009
Packit Service 501009
        if (arg == LKCD_DUMP_HEADER_ONLY)
Packit Service 501009
                return;
Packit Service 501009
Packit Service 501009
dump_page_only:
Packit Service 501009
Packit Service 501009
	lkcd_print("       dump_page:\n");
Packit Service 501009
        lkcd_print("      dp_address: ");
Packit Service 501009
	lkcd_print(BITS32() ? "%llx\n" : "%lx\n", dp->dp_address);
Packit Service 501009
        lkcd_print("         dp_size: ");
Packit Service 501009
	lkcd_print(BITS32() ? "%ld\n" : "%d\n", dp->dp_size);
Packit Service 501009
        lkcd_print("        dp_flags: ");
Packit Service 501009
	lkcd_print(BITS32() ? "%lx  (" : "%x  (", dp->dp_flags);
Packit Service 501009
Packit Service 501009
	others = 0;
Packit Service 501009
        if (dp->dp_flags & DUMP_DH_COMPRESSED)
Packit Service 501009
                lkcd_print("DUMP_DH_COMPRESSED", others++);
Packit Service 501009
        if (dp->dp_flags & DUMP_DH_RAW)
Packit Service 501009
                lkcd_print("%sDUMP_DH_RAW", others++ ? "|" : "");
Packit Service 501009
        if (dp->dp_flags & DUMP_DH_END)
Packit Service 501009
                lkcd_print("%sDUMP_DH_END", others++ ? "|" : "");
Packit Service 501009
        if (dp->dp_flags & LKCD_DUMP_MCLX_V0)
Packit Service 501009
                lkcd_print("%sLKCD_DUMP_MCLX_V0", others++ ? "|" : "");
Packit Service 501009
        lkcd_print(")\n");
Packit Service 501009
}
Packit Service 501009
Packit Service 501009
void
Packit Service 501009
dump_dump_page_v5(char *s, void *dpp)
Packit Service 501009
{
Packit Service 501009
        dump_page_t *dp;
Packit Service 501009
        uint32_t flags;
Packit Service 501009
        int others;
Packit Service 501009
 
Packit Service 501009
        console(s);
Packit Service 501009
 
Packit Service 501009
        dp = (dump_page_t *)dpp;
Packit Service 501009
        others = 0;
Packit Service 501009
Packit Service 501009
        console(BITS32() ? "dp_address: %llx " : "dp_address: %lx ",
Packit Service 501009
                dp->dp_address);
Packit Service 501009
        console("dp_size: %ld ", dp->dp_size);
Packit Service 501009
        console("dp_flags: %lx (", flags = dp->dp_flags);
Packit Service 501009
Packit Service 501009
        if (flags & DUMP_DH_COMPRESSED)
Packit Service 501009
                console("DUMP_DH_COMPRESSED", others++);
Packit Service 501009
        if (flags & DUMP_DH_RAW)
Packit Service 501009
                console("%sDUMP_DH_RAW", others++ ? "|" : "");
Packit Service 501009
        if (flags & DUMP_DH_END)
Packit Service 501009
                console("%sDUMP_DH_END", others++ ? "|" : "");
Packit Service 501009
        if (flags & LKCD_DUMP_MCLX_V0)
Packit Service 501009
                console("%sLKCD_DUMP_MCLX_V0", others++ ? "|" : "");
Packit Service 501009
        console(")\n");
Packit Service 501009
}
Packit Service 501009
Packit Service 501009
Packit Service 501009
/*
Packit Service 501009
 *  Read the MCLX-enhanced page header cache.  Verify the first one, which
Packit Service 501009
 *  is a pointer to the page header for address 1MB, and take the rest at 
Packit Service 501009
 *  blind faith.  Note that the page headers do not include the 64K dump
Packit Service 501009
 *  header offset, which must be added to the values found.
Packit Service 501009
 */
Packit Service 501009
static void
Packit Service 501009
mclx_cache_page_headers_v5(void)
Packit Service 501009
{
Packit Service 501009
	int i;
Packit Service 501009
	uint64_t physaddr1, physaddr2, page_headers[MCLX_PAGE_HEADERS];
Packit Service 501009
	dump_page_t dump_page, *dp;
Packit Service 501009
	ulong granularity;
Packit Service 501009
Packit Service 501009
	if (LKCD_DEBUG(2))  /* dump headers have all been read */
Packit Service 501009
		return;
Packit Service 501009
Packit Service 501009
	if (lkcd->total_pages > MEGABYTES(1))/* greater than 4G not supported */
Packit Service 501009
		return;
Packit Service 501009
Packit Service 501009
        if (lseek(lkcd->fd, sizeof(dump_header_t), SEEK_SET) == -1)
Packit Service 501009
		return;
Packit Service 501009
Packit Service 501009
        if (read(lkcd->fd, page_headers, MCLX_V1_PAGE_HEADER_CACHE) !=
Packit Service 501009
            MCLX_V1_PAGE_HEADER_CACHE)
Packit Service 501009
                return;
Packit Service 501009
Packit Service 501009
	dp = &dump_page;
Packit Service 501009
Packit Service 501009
	/*
Packit Service 501009
	 *  Determine the granularity between offsets.
Packit Service 501009
	 */
Packit Service 501009
        if (lseek(lkcd->fd, page_headers[0] + LKCD_OFFSET_TO_FIRST_PAGE, 
Packit Service 501009
	    SEEK_SET) == -1) 
Packit Service 501009
		return;
Packit Service 501009
        if (read(lkcd->fd, dp, lkcd->page_header_size) != 
Packit Service 501009
	    lkcd->page_header_size) 
Packit Service 501009
                return;
Packit Service 501009
        physaddr1 = (dp->dp_address - lkcd->kvbase) << lkcd->page_shift;
Packit Service 501009
Packit Service 501009
        if (lseek(lkcd->fd, page_headers[1] + LKCD_OFFSET_TO_FIRST_PAGE,
Packit Service 501009
            SEEK_SET) == -1)
Packit Service 501009
                return;
Packit Service 501009
        if (read(lkcd->fd, dp, lkcd->page_header_size) 
Packit Service 501009
	    != lkcd->page_header_size)
Packit Service 501009
                return;
Packit Service 501009
        physaddr2 = (dp->dp_address - lkcd->kvbase) << lkcd->page_shift;
Packit Service 501009
Packit Service 501009
	if ((physaddr1 % MEGABYTES(1)) || (physaddr2 % MEGABYTES(1)) ||
Packit Service 501009
	     (physaddr2 < physaddr1))
Packit Service 501009
		return;
Packit Service 501009
Packit Service 501009
	granularity = physaddr2 - physaddr1;
Packit Service 501009
Packit Service 501009
	for (i = 0; i < (MCLX_PAGE_HEADERS-1); i++) {
Packit Service 501009
		if (!page_headers[i])
Packit Service 501009
			break;
Packit Service 501009
		lkcd->curhdroffs = page_headers[i] + LKCD_OFFSET_TO_FIRST_PAGE;
Packit Service 501009
		set_mb_benchmark((granularity * (i+1))/lkcd->page_size);
Packit Service 501009
	}
Packit Service 501009
}