68fce2926ac031f46c25460569296f66620e9d52vboxsync/* $Id$ */
68fce2926ac031f46c25460569296f66620e9d52vboxsync/** @file
68fce2926ac031f46c25460569296f66620e9d52vboxsync * IPRT R0 Testcase - Debug kernel information.
68fce2926ac031f46c25460569296f66620e9d52vboxsync */
68fce2926ac031f46c25460569296f66620e9d52vboxsync
68fce2926ac031f46c25460569296f66620e9d52vboxsync/*
68fce2926ac031f46c25460569296f66620e9d52vboxsync * Copyright (C) 2012 Oracle Corporation
68fce2926ac031f46c25460569296f66620e9d52vboxsync *
68fce2926ac031f46c25460569296f66620e9d52vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
68fce2926ac031f46c25460569296f66620e9d52vboxsync * available from http://www.virtualbox.org. This file is free software;
68fce2926ac031f46c25460569296f66620e9d52vboxsync * you can redistribute it and/or modify it under the terms of the GNU
68fce2926ac031f46c25460569296f66620e9d52vboxsync * General Public License (GPL) as published by the Free Software
68fce2926ac031f46c25460569296f66620e9d52vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
68fce2926ac031f46c25460569296f66620e9d52vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
68fce2926ac031f46c25460569296f66620e9d52vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
68fce2926ac031f46c25460569296f66620e9d52vboxsync *
68fce2926ac031f46c25460569296f66620e9d52vboxsync * The contents of this file may alternatively be used under the terms
68fce2926ac031f46c25460569296f66620e9d52vboxsync * of the Common Development and Distribution License Version 1.0
68fce2926ac031f46c25460569296f66620e9d52vboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
68fce2926ac031f46c25460569296f66620e9d52vboxsync * VirtualBox OSE distribution, in which case the provisions of the
68fce2926ac031f46c25460569296f66620e9d52vboxsync * CDDL are applicable instead of those of the GPL.
68fce2926ac031f46c25460569296f66620e9d52vboxsync *
68fce2926ac031f46c25460569296f66620e9d52vboxsync * You may elect to license modified versions of this file under the
68fce2926ac031f46c25460569296f66620e9d52vboxsync * terms and conditions of either the GPL or the CDDL or both.
68fce2926ac031f46c25460569296f66620e9d52vboxsync */
68fce2926ac031f46c25460569296f66620e9d52vboxsync
68fce2926ac031f46c25460569296f66620e9d52vboxsync/*******************************************************************************
68fce2926ac031f46c25460569296f66620e9d52vboxsync* Header Files *
68fce2926ac031f46c25460569296f66620e9d52vboxsync*******************************************************************************/
68fce2926ac031f46c25460569296f66620e9d52vboxsync#include <iprt/thread.h>
68fce2926ac031f46c25460569296f66620e9d52vboxsync
68fce2926ac031f46c25460569296f66620e9d52vboxsync#include <iprt/asm-amd64-x86.h>
68fce2926ac031f46c25460569296f66620e9d52vboxsync#include <iprt/err.h>
68fce2926ac031f46c25460569296f66620e9d52vboxsync#include <iprt/time.h>
68fce2926ac031f46c25460569296f66620e9d52vboxsync#include <iprt/string.h>
68fce2926ac031f46c25460569296f66620e9d52vboxsync#include <VBox/sup.h>
68fce2926ac031f46c25460569296f66620e9d52vboxsync#include <iprt/dbg.h>
68fce2926ac031f46c25460569296f66620e9d52vboxsync#include "tstRTR0DbgKrnlInfo.h"
68fce2926ac031f46c25460569296f66620e9d52vboxsync#include "tstRTR0Common.h"
68fce2926ac031f46c25460569296f66620e9d52vboxsync
68fce2926ac031f46c25460569296f66620e9d52vboxsync
68fce2926ac031f46c25460569296f66620e9d52vboxsync/**
68fce2926ac031f46c25460569296f66620e9d52vboxsync * Service request callback function.
68fce2926ac031f46c25460569296f66620e9d52vboxsync *
68fce2926ac031f46c25460569296f66620e9d52vboxsync * @returns VBox status code.
68fce2926ac031f46c25460569296f66620e9d52vboxsync * @param pSession The caller's session.
68fce2926ac031f46c25460569296f66620e9d52vboxsync * @param u64Arg 64-bit integer argument.
68fce2926ac031f46c25460569296f66620e9d52vboxsync * @param pReqHdr The request header. Input / Output. Optional.
68fce2926ac031f46c25460569296f66620e9d52vboxsync */
68fce2926ac031f46c25460569296f66620e9d52vboxsyncDECLEXPORT(int) TSTR0DbgKrnlInfoSrvReqHandler(PSUPDRVSESSION pSession, uint32_t uOperation,
68fce2926ac031f46c25460569296f66620e9d52vboxsync uint64_t u64Arg, PSUPR0SERVICEREQHDR pReqHdr)
68fce2926ac031f46c25460569296f66620e9d52vboxsync{
68fce2926ac031f46c25460569296f66620e9d52vboxsync NOREF(pSession);
68fce2926ac031f46c25460569296f66620e9d52vboxsync if (u64Arg)
68fce2926ac031f46c25460569296f66620e9d52vboxsync return VERR_INVALID_PARAMETER;
68fce2926ac031f46c25460569296f66620e9d52vboxsync if (!VALID_PTR(pReqHdr))
68fce2926ac031f46c25460569296f66620e9d52vboxsync return VERR_INVALID_PARAMETER;
68fce2926ac031f46c25460569296f66620e9d52vboxsync char *pszErr = (char *)(pReqHdr + 1);
68fce2926ac031f46c25460569296f66620e9d52vboxsync size_t cchErr = pReqHdr->cbReq - sizeof(*pReqHdr);
68fce2926ac031f46c25460569296f66620e9d52vboxsync if (cchErr < 32 || cchErr >= 0x10000)
68fce2926ac031f46c25460569296f66620e9d52vboxsync return VERR_INVALID_PARAMETER;
68fce2926ac031f46c25460569296f66620e9d52vboxsync *pszErr = '\0';
68fce2926ac031f46c25460569296f66620e9d52vboxsync
68fce2926ac031f46c25460569296f66620e9d52vboxsync /*
68fce2926ac031f46c25460569296f66620e9d52vboxsync * The big switch.
68fce2926ac031f46c25460569296f66620e9d52vboxsync */
68fce2926ac031f46c25460569296f66620e9d52vboxsync switch (uOperation)
68fce2926ac031f46c25460569296f66620e9d52vboxsync {
68fce2926ac031f46c25460569296f66620e9d52vboxsync case TSTRTR0DBGKRNLINFO_SANITY_OK:
68fce2926ac031f46c25460569296f66620e9d52vboxsync break;
68fce2926ac031f46c25460569296f66620e9d52vboxsync
68fce2926ac031f46c25460569296f66620e9d52vboxsync case TSTRTR0DBGKRNLINFO_SANITY_FAILURE:
68fce2926ac031f46c25460569296f66620e9d52vboxsync RTStrPrintf(pszErr, cchErr, "!42failure42%1024s", "");
68fce2926ac031f46c25460569296f66620e9d52vboxsync break;
68fce2926ac031f46c25460569296f66620e9d52vboxsync
68fce2926ac031f46c25460569296f66620e9d52vboxsync case TSTRTR0DBGKRNLINFO_BASIC:
68fce2926ac031f46c25460569296f66620e9d52vboxsync {
68fce2926ac031f46c25460569296f66620e9d52vboxsync RTDBGKRNLINFO hKrnlInfo;
68fce2926ac031f46c25460569296f66620e9d52vboxsync RTR0TESTR0_CHECK_RC_BREAK(RTR0DbgKrnlInfoOpen(&hKrnlInfo, 1), VERR_INVALID_PARAMETER);
68fce2926ac031f46c25460569296f66620e9d52vboxsync RTR0TESTR0_CHECK_RC_BREAK(RTR0DbgKrnlInfoOpen(NULL, 0), VERR_INVALID_PARAMETER);
68fce2926ac031f46c25460569296f66620e9d52vboxsync RTR0TESTR0_CHECK_RC_BREAK(RTR0DbgKrnlInfoOpen(&hKrnlInfo, 0), VINF_SUCCESS);
68fce2926ac031f46c25460569296f66620e9d52vboxsync
68fce2926ac031f46c25460569296f66620e9d52vboxsync size_t offMemb;
68fce2926ac031f46c25460569296f66620e9d52vboxsync RTR0TESTR0_CHECK_RC_BREAK(RTR0DbgKrnlInfoQueryMember(NULL, "Test", "Test", &offMemb), VERR_INVALID_HANDLE);
68fce2926ac031f46c25460569296f66620e9d52vboxsync RTR0TESTR0_CHECK_RC_BREAK(RTR0DbgKrnlInfoQueryMember(hKrnlInfo, NULL, "Test", &offMemb), VERR_INVALID_PARAMETER);
68fce2926ac031f46c25460569296f66620e9d52vboxsync RTR0TESTR0_CHECK_RC_BREAK(RTR0DbgKrnlInfoQueryMember(hKrnlInfo, "Test", NULL, &offMemb), VERR_INVALID_PARAMETER);
68fce2926ac031f46c25460569296f66620e9d52vboxsync RTR0TESTR0_CHECK_RC_BREAK(RTR0DbgKrnlInfoQueryMember(hKrnlInfo, "Test", "Test", NULL), VERR_INVALID_PARAMETER);
68fce2926ac031f46c25460569296f66620e9d52vboxsync
68fce2926ac031f46c25460569296f66620e9d52vboxsync void *pvSymbol;
68fce2926ac031f46c25460569296f66620e9d52vboxsync RTR0TESTR0_CHECK_RC_BREAK(RTR0DbgKrnlInfoQuerySymbol(NULL, "Test", "Test", &pvSymbol), VERR_INVALID_HANDLE);
68fce2926ac031f46c25460569296f66620e9d52vboxsync RTR0TESTR0_CHECK_RC_BREAK(RTR0DbgKrnlInfoQuerySymbol(hKrnlInfo, "TestModule", "Test", &pvSymbol), VERR_MODULE_NOT_FOUND);
68fce2926ac031f46c25460569296f66620e9d52vboxsync RTR0TESTR0_CHECK_RC_BREAK(RTR0DbgKrnlInfoQuerySymbol(hKrnlInfo, NULL, NULL, &pvSymbol), VERR_INVALID_PARAMETER);
68fce2926ac031f46c25460569296f66620e9d52vboxsync break;
68fce2926ac031f46c25460569296f66620e9d52vboxsync }
68fce2926ac031f46c25460569296f66620e9d52vboxsync
68fce2926ac031f46c25460569296f66620e9d52vboxsync /** @todo check member retreival based on target platform. */
68fce2926ac031f46c25460569296f66620e9d52vboxsync /** @todo check symbol lookups based on target platform. */
68fce2926ac031f46c25460569296f66620e9d52vboxsync
68fce2926ac031f46c25460569296f66620e9d52vboxsync default:
68fce2926ac031f46c25460569296f66620e9d52vboxsync RTStrPrintf(pszErr, cchErr, "!Unknown test #%d", uOperation);
68fce2926ac031f46c25460569296f66620e9d52vboxsync break;
68fce2926ac031f46c25460569296f66620e9d52vboxsync }
68fce2926ac031f46c25460569296f66620e9d52vboxsync
68fce2926ac031f46c25460569296f66620e9d52vboxsync /* The error indicator is the '!' in the message buffer. */
68fce2926ac031f46c25460569296f66620e9d52vboxsync return VINF_SUCCESS;
68fce2926ac031f46c25460569296f66620e9d52vboxsync}
68fce2926ac031f46c25460569296f66620e9d52vboxsync