1 /**********************************************************************
3 * Copyright(c) 2008 Imagination Technologies Ltd. All rights reserved.
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms and conditions of the GNU General Public License,
7 * version 2, as published by the Free Software Foundation.
9 * This program is distributed in the hope it will be useful but, except
10 * as otherwise stated in writing, without any warranty; without even the
11 * implied warranty of merchantability or fitness for a particular purpose.
12 * See the GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
18 * The full GNU General Public License is included in this distribution in
19 * the file called "COPYING".
21 * Contact Information:
22 * Imagination Technologies Ltd. <gpl-support@imgtec.com>
23 * Home Park Estate, Kings Langley, Herts, WD4 8LZ, UK
25 ******************************************************************************/
27 #include <linux/string.h>
29 #include "img_types.h"
30 #include "pvr_debug.h"
36 #define LAST_FRAME_BUF_SIZE 1024
38 struct DBG_LASTFRAME_BUFFER {
39 struct DBG_STREAM *psStream;
40 u8 ui8Buffer[LAST_FRAME_BUF_SIZE];
42 struct DBG_LASTFRAME_BUFFER *psNext;
45 static struct DBG_STREAM *g_psStreamList;
46 static struct DBG_LASTFRAME_BUFFER *g_psLFBufferList;
48 static u32 g_ui32LOff;
49 static u32 g_ui32Line;
50 static u32 g_ui32MonoLines = 25;
52 static IMG_BOOL g_bHotkeyMiddump = IMG_FALSE;
53 static u32 g_ui32HotkeyMiddumpStart = 0xffffffff;
54 static u32 g_ui32HotkeyMiddumpEnd = 0xffffffff;
58 IMG_BOOL gbDumpThisFrame = IMG_FALSE;
60 static u32 SpaceInStream(struct DBG_STREAM *psStream);
61 static IMG_BOOL ExpandStreamBuffer(struct DBG_STREAM *psStream,
63 struct DBG_LASTFRAME_BUFFER *FindLFBuf(struct DBG_STREAM *psStream);
65 struct DBGKM_SERVICE_TABLE g_sDBGKMServices = {
66 sizeof(struct DBGKM_SERVICE_TABLE),
67 ExtDBGDrivCreateStream,
68 ExtDBGDrivDestroyStream,
70 ExtDBGDrivWriteString,
74 ExtDBGDrivSetCaptureMode,
75 ExtDBGDrivSetOutputMode,
76 ExtDBGDrivSetDebugLevel,
79 ExtDBGDrivOverrideMode,
80 ExtDBGDrivDefaultMode,
82 ExtDBGDrivWriteStringCM,
86 ExtDBGDrivStartInitPhase,
87 ExtDBGDrivStopInitPhase,
88 ExtDBGDrivIsCaptureFrame,
91 ExtDBGDrivGetStreamOffset,
92 ExtDBGDrivSetStreamOffset,
93 ExtDBGDrivIsLastCaptureFrame,
94 ExtDBGDrivWaitForEvent
97 void *ExtDBGDrivCreateStream(char *pszName,
105 HostAquireMutex(g_pvAPIMutex);
108 DBGDrivCreateStream(pszName, ui32CapMode, ui32OutMode, ui32Flags,
111 HostReleaseMutex(g_pvAPIMutex);
116 void ExtDBGDrivDestroyStream(struct DBG_STREAM *psStream)
119 HostAquireMutex(g_pvAPIMutex);
121 DBGDrivDestroyStream(psStream);
123 HostReleaseMutex(g_pvAPIMutex);
128 void *ExtDBGDrivFindStream(char *pszName,
129 IMG_BOOL bResetStream)
133 HostAquireMutex(g_pvAPIMutex);
135 pvRet = DBGDrivFindStream(pszName, bResetStream);
137 HostReleaseMutex(g_pvAPIMutex);
142 u32 ExtDBGDrivWriteString(struct DBG_STREAM *psStream,
148 HostAquireMutex(g_pvAPIMutex);
150 ui32Ret = DBGDrivWriteString(psStream, pszString, ui32Level);
152 HostReleaseMutex(g_pvAPIMutex);
157 u32 ExtDBGDrivReadString(struct DBG_STREAM *psStream,
163 HostAquireMutex(g_pvAPIMutex);
165 ui32Ret = DBGDrivReadString(psStream, pszString, ui32Limit);
167 HostReleaseMutex(g_pvAPIMutex);
172 u32 ExtDBGDrivWrite(struct DBG_STREAM *psStream,
179 HostAquireMutex(g_pvAPIMutex);
181 ui32Ret = DBGDrivWrite(psStream, pui8InBuf, ui32InBuffSize, ui32Level);
183 HostReleaseMutex(g_pvAPIMutex);
188 u32 ExtDBGDrivRead(struct DBG_STREAM *psStream,
189 IMG_BOOL bReadInitBuffer,
195 HostAquireMutex(g_pvAPIMutex);
198 DBGDrivRead(psStream, bReadInitBuffer, ui32OutBuffSize, pui8OutBuf);
200 HostReleaseMutex(g_pvAPIMutex);
205 void ExtDBGDrivSetCaptureMode(struct DBG_STREAM *psStream,
212 HostAquireMutex(g_pvAPIMutex);
214 DBGDrivSetCaptureMode(psStream, ui32Mode, ui32Start, ui32End,
217 HostReleaseMutex(g_pvAPIMutex);
222 void ExtDBGDrivSetOutputMode(struct DBG_STREAM *psStream,
226 HostAquireMutex(g_pvAPIMutex);
228 DBGDrivSetOutputMode(psStream, ui32OutMode);
230 HostReleaseMutex(g_pvAPIMutex);
235 void ExtDBGDrivSetDebugLevel(struct DBG_STREAM *psStream,
239 HostAquireMutex(g_pvAPIMutex);
241 DBGDrivSetDebugLevel(psStream, ui32DebugLevel);
243 HostReleaseMutex(g_pvAPIMutex);
248 void ExtDBGDrivSetFrame(struct DBG_STREAM *psStream, u32 ui32Frame)
251 HostAquireMutex(g_pvAPIMutex);
253 DBGDrivSetFrame(psStream, ui32Frame);
255 HostReleaseMutex(g_pvAPIMutex);
260 u32 ExtDBGDrivGetFrame(struct DBG_STREAM *psStream)
264 HostAquireMutex(g_pvAPIMutex);
266 ui32Ret = DBGDrivGetFrame(psStream);
268 HostReleaseMutex(g_pvAPIMutex);
273 u32 ExtDBGDrivIsLastCaptureFrame(struct DBG_STREAM *psStream)
277 HostAquireMutex(g_pvAPIMutex);
279 ui32Ret = DBGDrivIsLastCaptureFrame(psStream);
281 HostReleaseMutex(g_pvAPIMutex);
286 u32 ExtDBGDrivIsCaptureFrame(struct DBG_STREAM *psStream,
287 IMG_BOOL bCheckPreviousFrame)
291 HostAquireMutex(g_pvAPIMutex);
293 ui32Ret = DBGDrivIsCaptureFrame(psStream, bCheckPreviousFrame);
295 HostReleaseMutex(g_pvAPIMutex);
300 void ExtDBGDrivOverrideMode(struct DBG_STREAM *psStream,
304 HostAquireMutex(g_pvAPIMutex);
306 DBGDrivOverrideMode(psStream, ui32Mode);
308 HostReleaseMutex(g_pvAPIMutex);
313 void ExtDBGDrivDefaultMode(struct DBG_STREAM *psStream)
316 HostAquireMutex(g_pvAPIMutex);
318 DBGDrivDefaultMode(psStream);
320 HostReleaseMutex(g_pvAPIMutex);
325 u32 ExtDBGDrivWrite2(struct DBG_STREAM *psStream,
332 HostAquireMutex(g_pvAPIMutex);
334 ui32Ret = DBGDrivWrite2(psStream, pui8InBuf, ui32InBuffSize, ui32Level);
336 HostReleaseMutex(g_pvAPIMutex);
341 u32 ExtDBGDrivWriteStringCM(struct DBG_STREAM *psStream,
347 HostAquireMutex(g_pvAPIMutex);
349 ui32Ret = DBGDrivWriteStringCM(psStream, pszString, ui32Level);
351 HostReleaseMutex(g_pvAPIMutex);
356 u32 ExtDBGDrivWriteCM(struct DBG_STREAM *psStream,
363 HostAquireMutex(g_pvAPIMutex);
366 DBGDrivWriteCM(psStream, pui8InBuf, ui32InBuffSize, ui32Level);
368 HostReleaseMutex(g_pvAPIMutex);
373 void ExtDBGDrivSetMarker(struct DBG_STREAM *psStream,
377 HostAquireMutex(g_pvAPIMutex);
379 DBGDrivSetMarker(psStream, ui32Marker);
381 HostReleaseMutex(g_pvAPIMutex);
386 u32 ExtDBGDrivGetMarker(struct DBG_STREAM *psStream)
390 HostAquireMutex(g_pvAPIMutex);
392 ui32Marker = DBGDrivGetMarker(psStream);
394 HostReleaseMutex(g_pvAPIMutex);
399 u32 ExtDBGDrivWriteLF(struct DBG_STREAM *psStream,
407 HostAquireMutex(g_pvAPIMutex);
410 DBGDrivWriteLF(psStream, pui8InBuf, ui32InBuffSize, ui32Level,
413 HostReleaseMutex(g_pvAPIMutex);
418 u32 ExtDBGDrivReadLF(struct DBG_STREAM *psStream,
424 HostAquireMutex(g_pvAPIMutex);
426 ui32Ret = DBGDrivReadLF(psStream, ui32OutBuffSize, pui8OutBuf);
428 HostReleaseMutex(g_pvAPIMutex);
433 void ExtDBGDrivStartInitPhase(struct DBG_STREAM *psStream)
436 HostAquireMutex(g_pvAPIMutex);
438 DBGDrivStartInitPhase(psStream);
440 HostReleaseMutex(g_pvAPIMutex);
445 void ExtDBGDrivStopInitPhase(struct DBG_STREAM *psStream)
448 HostAquireMutex(g_pvAPIMutex);
450 DBGDrivStopInitPhase(psStream);
452 HostReleaseMutex(g_pvAPIMutex);
457 u32 ExtDBGDrivGetStreamOffset(struct DBG_STREAM *psStream)
461 HostAquireMutex(g_pvAPIMutex);
463 ui32Ret = DBGDrivGetStreamOffset(psStream);
465 HostReleaseMutex(g_pvAPIMutex);
470 void ExtDBGDrivSetStreamOffset(struct DBG_STREAM *psStream,
471 u32 ui32StreamOffset)
474 HostAquireMutex(g_pvAPIMutex);
476 DBGDrivSetStreamOffset(psStream, ui32StreamOffset);
478 HostReleaseMutex(g_pvAPIMutex);
481 void ExtDBGDrivWaitForEvent(enum DBG_EVENT eEvent)
483 #if defined(SUPPORT_DBGDRV_EVENT_OBJECTS)
484 DBGDrivWaitForEvent(eEvent);
486 PVR_UNREFERENCED_PARAMETER(eEvent);
499 while (szIn[ui32Len] > 0)
506 while (szIn[iPos] == '0')
508 if (szIn[iPos] == '\0')
510 if (szIn[iPos] == 'x' || szIn[iPos] == 'X') {
515 for (iPos = ui32Len - 1; iPos >= 0; iPos--) {
518 if ((bc >= 'a') && (bc <= 'f') && ui32Base == 16)
520 else if ((bc >= 'A') && (bc <= 'F') && ui32Base == 16)
522 else if ((bc >= '0') && (bc <= '9'))
527 ui32Value += bc * ui32Digit;
529 ui32Digit = ui32Digit * ui32Base;
534 IMG_BOOL StreamValid(struct DBG_STREAM *psStream)
536 struct DBG_STREAM *psThis;
538 psThis = g_psStreamList;
541 if (psStream && (psThis == psStream))
544 psThis = psThis->psNext;
549 void Write(struct DBG_STREAM *psStream, u8 *pui8Data,
553 if ((psStream->ui32WPtr + ui32InBuffSize) > psStream->ui32Size) {
554 u32 ui32B1 = psStream->ui32Size - psStream->ui32WPtr;
555 u32 ui32B2 = ui32InBuffSize - ui32B1;
557 HostMemCopy((void *) (psStream->ui32Base +
559 (void *) pui8Data, ui32B1);
561 HostMemCopy((void *) psStream->ui32Base,
562 (void *) ((u32) pui8Data + ui32B1),
565 psStream->ui32WPtr = ui32B2;
567 HostMemCopy((void *) (psStream->ui32Base +
569 (void *) pui8Data, ui32InBuffSize);
571 psStream->ui32WPtr += ui32InBuffSize;
573 if (psStream->ui32WPtr == psStream->ui32Size)
574 psStream->ui32WPtr = 0;
576 psStream->ui32DataWritten += ui32InBuffSize;
579 void MonoOut(char *pszString, IMG_BOOL bNewLine)
584 pScreen = (char *)DBGDRIV_MONOBASE;
586 pScreen += g_ui32Line * 160;
590 pScreen[g_ui32LOff + (i * 2)] = pszString[i];
591 pScreen[g_ui32LOff + (i * 2) + 1] = 127;
593 } while ((pszString[i] != 0) && (i < 4096));
602 if (g_ui32Line == g_ui32MonoLines) {
603 g_ui32Line = g_ui32MonoLines - 1;
605 HostMemCopy((void *) DBGDRIV_MONOBASE,
606 (void *) (DBGDRIV_MONOBASE + 160),
607 160 * (g_ui32MonoLines - 1));
609 HostMemSet((void *) (DBGDRIV_MONOBASE +
610 (160 * (g_ui32MonoLines - 1))), 0,
615 void AppendName(char *pszOut, char *pszBase, char *pszName)
622 while (pszBase[i] != 0) {
623 pszOut[i] = pszBase[i];
630 while (pszName[i] != 0) {
631 pszOut[ui32Off + i] = pszName[i];
635 pszOut[ui32Off + i] = pszName[i];
638 void *DBGDrivCreateStream(char *pszName,
644 struct DBG_STREAM *psStream;
645 struct DBG_STREAM *psInitStream;
646 struct DBG_LASTFRAME_BUFFER *psLFBuffer;
650 psStream = (struct DBG_STREAM *)DBGDrivFindStream(pszName, IMG_FALSE);
653 return (void *)psStream;
655 psStream = HostNonPageablePageAlloc(1);
656 psInitStream = HostNonPageablePageAlloc(1);
657 psLFBuffer = HostNonPageablePageAlloc(1);
658 if ((!psStream) || (!psInitStream) || (!psLFBuffer)
660 PVR_DPF(PVR_DBG_ERROR,
661 "DBGDriv: Couldn't create buffer !!!!!\n\r");
665 if ((ui32Flags & DEBUG_FLAGS_USE_NONPAGED_MEM) != 0)
666 pvBase = HostNonPageablePageAlloc(ui32Size);
668 pvBase = HostPageablePageAlloc(ui32Size);
671 PVR_DPF(PVR_DBG_ERROR,
672 "DBGDriv: Couldn't create buffer !!!!!\n\r");
673 HostNonPageablePageFree(psStream);
677 psStream->psNext = 0;
678 psStream->ui32Flags = ui32Flags;
679 psStream->ui32Base = (u32) pvBase;
680 psStream->ui32Size = ui32Size * 4096;
681 psStream->ui32RPtr = 0;
682 psStream->ui32WPtr = 0;
683 psStream->ui32DataWritten = 0;
684 psStream->ui32CapMode = ui32CapMode;
685 psStream->ui32OutMode = ui32OutMode;
686 psStream->ui32DebugLevel = DEBUG_LEVEL_0;
687 psStream->ui32DefaultMode = ui32CapMode;
688 psStream->ui32Start = 0;
689 psStream->ui32End = 0;
690 psStream->ui32Current = 0;
691 psStream->ui32SampleRate = 1;
692 psStream->ui32Access = 0;
693 psStream->ui32Timeout = 0;
694 psStream->ui32Marker = 0;
695 psStream->bInitPhaseComplete = IMG_FALSE;
697 if ((ui32Flags & DEBUG_FLAGS_USE_NONPAGED_MEM) != 0)
698 pvBase = HostNonPageablePageAlloc(ui32Size);
700 pvBase = HostPageablePageAlloc(ui32Size);
703 PVR_DPF(PVR_DBG_ERROR,
704 "DBGDriv: Couldn't create buffer !!!!!\n\r");
706 if ((psStream->ui32Flags & DEBUG_FLAGS_USE_NONPAGED_MEM) != 0)
707 HostNonPageablePageFree((void *) psStream->
710 HostPageablePageFree((void *) psStream->ui32Base);
711 HostNonPageablePageFree(psStream);
715 psInitStream->psNext = 0;
716 psInitStream->ui32Flags = ui32Flags;
717 psInitStream->ui32Base = (u32) pvBase;
718 psInitStream->ui32Size = ui32Size * 4096;
719 psInitStream->ui32RPtr = 0;
720 psInitStream->ui32WPtr = 0;
721 psInitStream->ui32DataWritten = 0;
722 psInitStream->ui32CapMode = ui32CapMode;
723 psInitStream->ui32OutMode = ui32OutMode;
724 psInitStream->ui32DebugLevel = DEBUG_LEVEL_0;
725 psInitStream->ui32DefaultMode = ui32CapMode;
726 psInitStream->ui32Start = 0;
727 psInitStream->ui32End = 0;
728 psInitStream->ui32Current = 0;
729 psInitStream->ui32SampleRate = 1;
730 psInitStream->ui32Access = 0;
731 psInitStream->ui32Timeout = 0;
732 psInitStream->ui32Marker = 0;
733 psInitStream->bInitPhaseComplete = IMG_FALSE;
735 psStream->psInitStream = psInitStream;
737 psLFBuffer->psStream = psStream;
738 psLFBuffer->ui32BufLen = 0;
740 g_bHotkeyMiddump = IMG_FALSE;
741 g_ui32HotkeyMiddumpStart = 0xffffffff;
742 g_ui32HotkeyMiddumpEnd = 0xffffffff;
747 psStream->szName[ui32Off] = pszName[ui32Off];
750 } while ((pszName[ui32Off] != 0)
751 && (ui32Off < (4096 - sizeof(struct DBG_STREAM))));
753 psStream->szName[ui32Off] = pszName[ui32Off];
755 psStream->psNext = g_psStreamList;
756 g_psStreamList = psStream;
758 psLFBuffer->psNext = g_psLFBufferList;
759 g_psLFBufferList = psLFBuffer;
761 return (void *)psStream;
764 void DBGDrivDestroyStream(struct DBG_STREAM *psStream)
766 struct DBG_STREAM *psStreamThis;
767 struct DBG_STREAM *psStreamPrev;
768 struct DBG_LASTFRAME_BUFFER *psLFBuffer;
769 struct DBG_LASTFRAME_BUFFER *psLFThis;
770 struct DBG_LASTFRAME_BUFFER *psLFPrev;
772 PVR_DPF(PVR_DBG_MESSAGE, "DBGDriv: Destroying stream %s\r\n",
775 if (!StreamValid(psStream))
778 psLFBuffer = FindLFBuf(psStream);
780 psStreamThis = g_psStreamList;
784 if (psStreamThis == psStream) {
786 psStreamPrev->psNext = psStreamThis->psNext;
788 g_psStreamList = psStreamThis->psNext;
792 psStreamPrev = psStreamThis;
793 psStreamThis = psStreamThis->psNext;
796 psLFThis = g_psLFBufferList;
800 if (psLFThis == psLFBuffer) {
802 psLFPrev->psNext = psLFThis->psNext;
804 g_psLFBufferList = psLFThis->psNext;
809 psLFThis = psLFThis->psNext;
812 if (psStream->ui32CapMode & DEBUG_CAPMODE_HOTKEY)
815 if ((psStream->ui32Flags & DEBUG_FLAGS_USE_NONPAGED_MEM) != 0) {
816 HostNonPageablePageFree((void *) psStream->ui32Base);
817 HostNonPageablePageFree((void *) psStream->psInitStream->
820 HostPageablePageFree((void *) psStream->ui32Base);
821 HostPageablePageFree((void *) psStream->psInitStream->
825 HostNonPageablePageFree(psStream->psInitStream);
826 HostNonPageablePageFree(psStream);
827 HostNonPageablePageFree(psLFBuffer);
829 if (g_psStreamList == 0)
830 PVR_DPF(PVR_DBG_MESSAGE, "DBGDriv: Stream list now empty");
835 void *DBGDrivFindStream(char *pszName,
836 IMG_BOOL bResetStream)
838 struct DBG_STREAM *psStream;
839 struct DBG_STREAM *psThis;
845 for (psThis = g_psStreamList; psThis != NULL;
846 psThis = psThis->psNext) {
850 if (strlen(psThis->szName) == strlen(pszName)) {
851 while ((psThis->szName[ui32Off] != 0)
852 && (pszName[ui32Off] != 0) && (ui32Off < 128)
854 if (psThis->szName[ui32Off] != pszName[ui32Off])
855 bAreSame = IMG_FALSE;
860 bAreSame = IMG_FALSE;
869 if (bResetStream && psStream) {
870 static char szComment[] = "-- Init phase terminated\r\n";
871 psStream->psInitStream->ui32RPtr = 0;
872 psStream->ui32RPtr = 0;
873 psStream->ui32WPtr = 0;
874 psStream->ui32DataWritten =
875 psStream->psInitStream->ui32DataWritten;
876 if (psStream->bInitPhaseComplete == IMG_FALSE) {
877 if (psStream->ui32Flags & DEBUG_FLAGS_TEXTSTREAM)
878 DBGDrivWrite2(psStream, (u8 *) szComment,
879 sizeof(szComment) - 1, 0x01);
880 psStream->bInitPhaseComplete = IMG_TRUE;
884 return (void *)psStream;
887 u32 DBGDrivWriteStringCM(struct DBG_STREAM *psStream,
892 if (!StreamValid(psStream))
895 if (psStream->ui32CapMode & DEBUG_CAPMODE_FRAMED) {
896 if (!(psStream->ui32Flags & DEBUG_FLAGS_ENABLESAMPLE))
899 if (psStream->ui32CapMode == DEBUG_CAPMODE_HOTKEY)
900 if ((psStream->ui32Current != g_ui32HotKeyFrame)
901 || (g_bHotKeyPressed == IMG_FALSE))
905 return DBGDrivWriteString(psStream, pszString, ui32Level);
909 u32 DBGDrivWriteString(struct DBG_STREAM *psStream,
918 if (!StreamValid(psStream))
921 if (!(psStream->ui32DebugLevel & ui32Level))
924 if (!(psStream->ui32OutMode & DEBUG_OUTMODE_ASYNC)) {
925 if (psStream->ui32OutMode & DEBUG_OUTMODE_STANDARDDBG)
926 PVR_DPF(PVR_DBG_MESSAGE, "%s: %s\r\n",
927 psStream->szName, pszString);
929 if (psStream->ui32OutMode & DEBUG_OUTMODE_MONO) {
930 MonoOut(psStream->szName, IMG_FALSE);
931 MonoOut(": ", IMG_FALSE);
932 MonoOut(pszString, IMG_TRUE);
936 if (!((psStream->ui32OutMode & DEBUG_OUTMODE_STREAMENABLE) ||
937 (psStream->ui32OutMode & DEBUG_OUTMODE_ASYNC)
942 ui32Space = SpaceInStream(psStream);
948 ui32WPtr = psStream->ui32WPtr;
949 pui8Buffer = (u8 *) psStream->ui32Base;
951 while ((pszString[ui32Len] != 0) && (ui32Len < ui32Space)) {
952 pui8Buffer[ui32WPtr] = pszString[ui32Len];
955 if (ui32WPtr == psStream->ui32Size)
959 if (ui32Len < ui32Space) {
961 pui8Buffer[ui32WPtr] = pszString[ui32Len];
964 if (ui32WPtr == psStream->ui32Size)
967 psStream->ui32WPtr = ui32WPtr;
968 psStream->ui32DataWritten += ui32Len;
973 #if defined(SUPPORT_DBGDRV_EVENT_OBJECTS)
975 HostSignalEvent(DBG_EVENT_STREAM_DATA);
981 u32 DBGDrivReadString(struct DBG_STREAM *psStream,
990 if (!StreamValid(psStream))
993 pui8Buff = (u8 *) psStream->ui32Base;
994 ui32Offset = psStream->ui32RPtr;
996 if (psStream->ui32RPtr == psStream->ui32WPtr)
1000 while ((pui8Buff[ui32Offset] != 0)
1001 && (ui32Offset != psStream->ui32WPtr)) {
1005 if (ui32Offset == psStream->ui32Size)
1009 ui32OutLen = ui32Len + 1;
1011 if (ui32Len > ui32Limit)
1014 ui32Offset = psStream->ui32RPtr;
1017 while ((pui8Buff[ui32Offset] != 0) && (ui32Len < ui32Limit)) {
1018 pszString[ui32Len] = pui8Buff[ui32Offset];
1022 if (ui32Offset == psStream->ui32Size)
1026 pszString[ui32Len] = pui8Buff[ui32Offset];
1028 psStream->ui32RPtr = ui32Offset + 1;
1030 if (psStream->ui32RPtr == psStream->ui32Size)
1031 psStream->ui32RPtr = 0;
1036 u32 DBGDrivWrite(struct DBG_STREAM *psMainStream,
1042 struct DBG_STREAM *psStream;
1044 if (!StreamValid(psMainStream))
1047 if (!(psMainStream->ui32DebugLevel & ui32Level))
1050 if (psMainStream->ui32CapMode & DEBUG_CAPMODE_FRAMED) {
1051 if (!(psMainStream->ui32Flags & DEBUG_FLAGS_ENABLESAMPLE))
1054 if (psMainStream->ui32CapMode == DEBUG_CAPMODE_HOTKEY)
1055 if ((psMainStream->ui32Current != g_ui32HotKeyFrame)
1056 || (g_bHotKeyPressed == IMG_FALSE))
1061 if (psMainStream->bInitPhaseComplete)
1062 psStream = psMainStream;
1064 psStream = psMainStream->psInitStream;
1066 ui32Space = SpaceInStream(psStream);
1068 if (!(psStream->ui32OutMode & DEBUG_OUTMODE_STREAMENABLE))
1074 if (ui32Space <= (ui32InBuffSize + 4))
1075 ui32InBuffSize = ui32Space - 8;
1077 Write(psStream, (u8 *) &ui32InBuffSize, 4);
1078 Write(psStream, pui8InBuf, ui32InBuffSize);
1080 #if defined(SUPPORT_DBGDRV_EVENT_OBJECTS)
1082 HostSignalEvent(DBG_EVENT_STREAM_DATA);
1084 return ui32InBuffSize;
1087 u32 DBGDrivWriteCM(struct DBG_STREAM *psStream,
1093 if (!StreamValid(psStream))
1096 if (psStream->ui32CapMode & DEBUG_CAPMODE_FRAMED) {
1097 if (!(psStream->ui32Flags & DEBUG_FLAGS_ENABLESAMPLE))
1100 if (psStream->ui32CapMode == DEBUG_CAPMODE_HOTKEY)
1101 if ((psStream->ui32Current != g_ui32HotKeyFrame)
1102 || (g_bHotKeyPressed == IMG_FALSE))
1106 return DBGDrivWrite2(psStream, pui8InBuf, ui32InBuffSize, ui32Level);
1109 u32 DBGDrivWrite2(struct DBG_STREAM *psMainStream,
1115 struct DBG_STREAM *psStream;
1117 if (!StreamValid(psMainStream))
1120 if (!(psMainStream->ui32DebugLevel & ui32Level))
1123 if (psMainStream->bInitPhaseComplete)
1124 psStream = psMainStream;
1126 psStream = psMainStream->psInitStream;
1128 ui32Space = SpaceInStream(psStream);
1130 if (!(psStream->ui32OutMode & DEBUG_OUTMODE_STREAMENABLE))
1133 if (psStream->ui32Flags & DEBUG_FLAGS_NO_BUF_EXPANDSION) {
1138 if ((ui32Space < 32) || (ui32Space <= (ui32InBuffSize + 4))) {
1141 ui32NewBufSize = 2 * psStream->ui32Size;
1143 if (ui32InBuffSize > psStream->ui32Size)
1144 ui32NewBufSize += ui32InBuffSize;
1146 if (!ExpandStreamBuffer(psStream, ui32NewBufSize))
1150 ui32Space = SpaceInStream(psStream);
1154 if (ui32Space <= (ui32InBuffSize + 4))
1155 ui32InBuffSize = ui32Space - 4;
1157 Write(psStream, pui8InBuf, ui32InBuffSize);
1159 #if defined(SUPPORT_DBGDRV_EVENT_OBJECTS)
1161 HostSignalEvent(DBG_EVENT_STREAM_DATA);
1163 return ui32InBuffSize;
1166 u32 DBGDrivRead(struct DBG_STREAM *psMainStream,
1167 IMG_BOOL bReadInitBuffer,
1168 u32 ui32OutBuffSize,
1172 struct DBG_STREAM *psStream;
1174 if (!StreamValid(psMainStream))
1177 if (bReadInitBuffer)
1178 psStream = psMainStream->psInitStream;
1180 psStream = psMainStream;
1182 if (psStream->ui32RPtr == psStream->ui32WPtr)
1185 if (psStream->ui32RPtr <= psStream->ui32WPtr) {
1186 ui32Data = psStream->ui32WPtr - psStream->ui32RPtr;
1189 psStream->ui32WPtr + (psStream->ui32Size -
1190 psStream->ui32RPtr);
1193 if (ui32Data > ui32OutBuffSize)
1194 ui32Data = ui32OutBuffSize;
1196 if ((psStream->ui32RPtr + ui32Data) > psStream->ui32Size) {
1197 u32 ui32B1 = psStream->ui32Size - psStream->ui32RPtr;
1198 u32 ui32B2 = ui32Data - ui32B1;
1200 HostMemCopy((void *) pui8OutBuf,
1201 (void *) (psStream->ui32Base +
1202 psStream->ui32RPtr), ui32B1);
1204 HostMemCopy((void *) ((u32) pui8OutBuf + ui32B1),
1205 (void *) psStream->ui32Base, ui32B2);
1207 psStream->ui32RPtr = ui32B2;
1209 HostMemCopy((void *) pui8OutBuf,
1210 (void *) (psStream->ui32Base +
1211 psStream->ui32RPtr), ui32Data);
1213 psStream->ui32RPtr += ui32Data;
1215 if (psStream->ui32RPtr == psStream->ui32Size)
1216 psStream->ui32RPtr = 0;
1222 void DBGDrivSetCaptureMode(struct DBG_STREAM *psStream,
1229 if (!StreamValid(psStream))
1232 psStream->ui32CapMode = ui32Mode;
1233 psStream->ui32DefaultMode = ui32Mode;
1234 psStream->ui32Start = ui32Start;
1235 psStream->ui32End = ui32End;
1236 psStream->ui32SampleRate = ui32SampleRate;
1238 if (psStream->ui32CapMode & DEBUG_CAPMODE_HOTKEY)
1239 ActivateHotKeys(psStream);
1242 void DBGDrivSetOutputMode(struct DBG_STREAM *psStream,
1246 if (!StreamValid(psStream))
1249 psStream->ui32OutMode = ui32OutMode;
1252 void DBGDrivSetDebugLevel(struct DBG_STREAM *psStream,
1256 if (!StreamValid(psStream))
1259 psStream->ui32DebugLevel = ui32DebugLevel;
1262 void DBGDrivSetFrame(struct DBG_STREAM *psStream, u32 ui32Frame)
1265 if (!StreamValid(psStream))
1268 psStream->ui32Current = ui32Frame;
1270 if ((ui32Frame >= psStream->ui32Start) &&
1271 (ui32Frame <= psStream->ui32End) &&
1272 (((ui32Frame - psStream->ui32Start) % psStream->ui32SampleRate) ==
1274 psStream->ui32Flags |= DEBUG_FLAGS_ENABLESAMPLE;
1276 psStream->ui32Flags &= ~DEBUG_FLAGS_ENABLESAMPLE;
1278 if (g_bHotkeyMiddump) {
1279 if ((ui32Frame >= g_ui32HotkeyMiddumpStart) &&
1280 (ui32Frame <= g_ui32HotkeyMiddumpEnd) &&
1282 g_ui32HotkeyMiddumpStart) % psStream->ui32SampleRate) ==
1284 psStream->ui32Flags |= DEBUG_FLAGS_ENABLESAMPLE;
1286 psStream->ui32Flags &= ~DEBUG_FLAGS_ENABLESAMPLE;
1287 if (psStream->ui32Current > g_ui32HotkeyMiddumpEnd)
1288 g_bHotkeyMiddump = IMG_FALSE;
1292 if (g_bHotKeyRegistered) {
1293 g_bHotKeyRegistered = IMG_FALSE;
1295 PVR_DPF(PVR_DBG_MESSAGE, "Hotkey pressed (%08x)!\n",
1298 if (!g_bHotKeyPressed) {
1300 g_ui32HotKeyFrame = psStream->ui32Current + 2;
1302 g_bHotKeyPressed = IMG_TRUE;
1305 if ((psStream->ui32CapMode & DEBUG_CAPMODE_FRAMED)
1306 && (psStream->ui32CapMode & DEBUG_CAPMODE_HOTKEY)) {
1307 if (!g_bHotkeyMiddump) {
1309 g_ui32HotkeyMiddumpStart =
1310 g_ui32HotKeyFrame + 1;
1311 g_ui32HotkeyMiddumpEnd = 0xffffffff;
1312 g_bHotkeyMiddump = IMG_TRUE;
1313 PVR_DPF(PVR_DBG_MESSAGE,
1314 "Sampling every %d frame(s)\n",
1315 psStream->ui32SampleRate);
1318 g_ui32HotkeyMiddumpEnd = g_ui32HotKeyFrame;
1319 PVR_DPF(PVR_DBG_MESSAGE,
1320 "Turning off sampling\n");
1326 if (psStream->ui32Current > g_ui32HotKeyFrame)
1327 g_bHotKeyPressed = IMG_FALSE;
1330 u32 DBGDrivGetFrame(struct DBG_STREAM *psStream)
1333 if (!StreamValid(psStream))
1336 return psStream->ui32Current;
1339 u32 DBGDrivIsLastCaptureFrame(struct DBG_STREAM *psStream)
1343 if (!StreamValid(psStream))
1346 if (psStream->ui32CapMode & DEBUG_CAPMODE_FRAMED) {
1348 psStream->ui32Current + psStream->ui32SampleRate;
1349 if (ui32NextFrame > psStream->ui32End)
1355 u32 DBGDrivIsCaptureFrame(struct DBG_STREAM *psStream,
1356 IMG_BOOL bCheckPreviousFrame)
1358 u32 ui32FrameShift = bCheckPreviousFrame ? 1 : 0;
1360 if (!StreamValid(psStream))
1363 if (psStream->ui32CapMode & DEBUG_CAPMODE_FRAMED) {
1365 if (g_bHotkeyMiddump) {
1366 if ((psStream->ui32Current >=
1367 (g_ui32HotkeyMiddumpStart - ui32FrameShift))
1368 && (psStream->ui32Current <=
1369 (g_ui32HotkeyMiddumpEnd - ui32FrameShift))
1371 ((((psStream->ui32Current + ui32FrameShift) -
1372 g_ui32HotkeyMiddumpStart) %
1373 psStream->ui32SampleRate) == 0))
1376 if ((psStream->ui32Current >=
1377 (psStream->ui32Start - ui32FrameShift))
1378 && (psStream->ui32Current <=
1379 (psStream->ui32End - ui32FrameShift))
1381 ((((psStream->ui32Current + ui32FrameShift) -
1382 psStream->ui32Start) %
1383 psStream->ui32SampleRate) == 0))
1386 } else if (psStream->ui32CapMode == DEBUG_CAPMODE_HOTKEY) {
1387 if ((psStream->ui32Current ==
1388 (g_ui32HotKeyFrame - ui32FrameShift))
1389 && (g_bHotKeyPressed))
1397 void DBGDrivOverrideMode(struct DBG_STREAM *psStream, u32 ui32Mode)
1400 if (!StreamValid(psStream))
1403 psStream->ui32CapMode = ui32Mode;
1406 void DBGDrivDefaultMode(struct DBG_STREAM *psStream)
1409 if (!StreamValid(psStream))
1412 psStream->ui32CapMode = psStream->ui32DefaultMode;
1415 void DBGDrivSetMarker(struct DBG_STREAM *psStream, u32 ui32Marker)
1418 if (!StreamValid(psStream))
1421 psStream->ui32Marker = ui32Marker;
1424 u32 DBGDrivGetMarker(struct DBG_STREAM *psStream)
1427 if (!StreamValid(psStream))
1430 return psStream->ui32Marker;
1433 u32 DBGDrivGetStreamOffset(struct DBG_STREAM *psMainStream)
1435 struct DBG_STREAM *psStream;
1437 if (!StreamValid(psMainStream))
1440 if (psMainStream->bInitPhaseComplete)
1441 psStream = psMainStream;
1443 psStream = psMainStream->psInitStream;
1445 return psStream->ui32DataWritten;
1448 void DBGDrivSetStreamOffset(struct DBG_STREAM *psMainStream,
1449 u32 ui32StreamOffset)
1451 struct DBG_STREAM *psStream;
1453 if (!StreamValid(psMainStream))
1456 if (psMainStream->bInitPhaseComplete)
1457 psStream = psMainStream;
1459 psStream = psMainStream->psInitStream;
1461 psStream->ui32DataWritten = ui32StreamOffset;
1464 u32 DBGDrivGetServiceTable(void)
1466 return (u32)&g_sDBGKMServices;
1469 u32 DBGDrivWriteLF(struct DBG_STREAM *psStream,
1475 struct DBG_LASTFRAME_BUFFER *psLFBuffer;
1477 if (!StreamValid(psStream))
1480 if (!(psStream->ui32DebugLevel & ui32Level))
1483 if (psStream->ui32CapMode & DEBUG_CAPMODE_FRAMED) {
1484 if (!(psStream->ui32Flags & DEBUG_FLAGS_ENABLESAMPLE))
1486 } else if (psStream->ui32CapMode == DEBUG_CAPMODE_HOTKEY) {
1487 if ((psStream->ui32Current != g_ui32HotKeyFrame)
1488 || (g_bHotKeyPressed == IMG_FALSE))
1492 psLFBuffer = FindLFBuf(psStream);
1494 if (ui32Flags & WRITELF_FLAGS_RESETBUF) {
1498 LAST_FRAME_BUF_SIZE) ? LAST_FRAME_BUF_SIZE :
1500 HostMemCopy((void *) psLFBuffer->ui8Buffer,
1501 (void *) pui8InBuf, ui32InBuffSize);
1502 psLFBuffer->ui32BufLen = ui32InBuffSize;
1506 ((psLFBuffer->ui32BufLen + ui32InBuffSize) >
1507 LAST_FRAME_BUF_SIZE) ? (LAST_FRAME_BUF_SIZE -
1509 ui32BufLen) : ui32InBuffSize;
1510 HostMemCopy((void *) (&psLFBuffer->
1511 ui8Buffer[psLFBuffer->ui32BufLen]),
1512 (void *) pui8InBuf, ui32InBuffSize);
1513 psLFBuffer->ui32BufLen += ui32InBuffSize;
1516 return ui32InBuffSize;
1519 u32 DBGDrivReadLF(struct DBG_STREAM *psStream,
1520 u32 ui32OutBuffSize,
1523 struct DBG_LASTFRAME_BUFFER *psLFBuffer;
1526 if (!StreamValid(psStream))
1529 psLFBuffer = FindLFBuf(psStream);
1533 psLFBuffer->ui32BufLen) ? ui32OutBuffSize : psLFBuffer->ui32BufLen;
1535 HostMemCopy((void *) pui8OutBuf, (void *) psLFBuffer->ui8Buffer,
1541 void DBGDrivStartInitPhase(struct DBG_STREAM *psStream)
1543 psStream->bInitPhaseComplete = IMG_FALSE;
1546 void DBGDrivStopInitPhase(struct DBG_STREAM *psStream)
1548 psStream->bInitPhaseComplete = IMG_TRUE;
1551 #if defined(SUPPORT_DBGDRV_EVENT_OBJECTS)
1552 void DBGDrivWaitForEvent(enum DBG_EVENT eEvent)
1554 HostWaitForEvent(eEvent);
1558 static IMG_BOOL ExpandStreamBuffer(struct DBG_STREAM *psStream, u32 ui32NewSize)
1561 u32 ui32NewSizeInPages;
1563 u32 ui32SpaceInOldBuf;
1565 if (psStream->ui32Size >= ui32NewSize)
1568 ui32SpaceInOldBuf = SpaceInStream(psStream);
1570 ui32NewSizeInPages = ((ui32NewSize + 0xfff) & ~0xfff) / 4096;
1572 if ((psStream->ui32Flags & DEBUG_FLAGS_USE_NONPAGED_MEM) != 0)
1573 pvNewBuf = HostNonPageablePageAlloc(ui32NewSizeInPages);
1575 pvNewBuf = HostPageablePageAlloc(ui32NewSizeInPages);
1577 if (pvNewBuf == NULL)
1580 if (psStream->ui32RPtr <= psStream->ui32WPtr) {
1582 HostMemCopy((void *) pvNewBuf,
1583 (void *) (psStream->ui32Base +
1584 psStream->ui32RPtr),
1585 psStream->ui32WPtr - psStream->ui32RPtr);
1587 u32 ui32FirstCopySize;
1589 ui32FirstCopySize = psStream->ui32Size - psStream->ui32RPtr;
1591 HostMemCopy((void *) pvNewBuf,
1592 (void *) (psStream->ui32Base +
1593 psStream->ui32RPtr),
1596 HostMemCopy((void *) ((u32) pvNewBuf +
1598 (void *) psStream->ui32Base,
1599 psStream->ui32WPtr);
1602 ui32NewWOffset = psStream->ui32Size - ui32SpaceInOldBuf;
1604 if ((psStream->ui32Flags & DEBUG_FLAGS_USE_NONPAGED_MEM) != 0)
1605 HostNonPageablePageFree((void *) psStream->ui32Base);
1607 HostPageablePageFree((void *) psStream->ui32Base);
1609 psStream->ui32Base = (u32) pvNewBuf;
1610 psStream->ui32RPtr = 0;
1611 psStream->ui32WPtr = ui32NewWOffset;
1612 psStream->ui32Size = ui32NewSizeInPages * 4096;
1617 static u32 SpaceInStream(struct DBG_STREAM *psStream)
1621 if (psStream->ui32RPtr > psStream->ui32WPtr)
1622 ui32Space = psStream->ui32RPtr - psStream->ui32WPtr;
1625 psStream->ui32RPtr + (psStream->ui32Size -
1626 psStream->ui32WPtr);
1631 void DestroyAllStreams(void)
1633 while (g_psStreamList != NULL)
1634 DBGDrivDestroyStream(g_psStreamList);
1638 struct DBG_LASTFRAME_BUFFER *FindLFBuf(struct DBG_STREAM *psStream)
1640 struct DBG_LASTFRAME_BUFFER *psLFBuffer;
1642 psLFBuffer = g_psLFBufferList;
1644 while (psLFBuffer) {
1645 if (psLFBuffer->psStream == psStream)
1648 psLFBuffer = psLFBuffer->psNext;