4 * PROJECT: System regression tool for ReactOS
5 * LICENSE: GPL - See COPYING in the top level directory
6 * FILE: tools/sysreg/conf_parser.h
7 * PURPOSE: ReactOS boot test
8 * PROGRAMMERS: Johannes Anderwald (johannes.anderwald at sbox tugraz at)
12 #include "rosboot_test.h"
17 using System_::PipeReader
;
18 using System_::NamedPipeReader
;
19 /* using System_::SymbolFile; */
20 using System_::FileReader
;
21 using System_::OsSupport
;
22 using System_::EnvironmentVariable
;
26 typedef wofstream ofstream
;
31 string
RosBootTest::ROS_EMU_TYPE
= "ROS_EMU_TYPE";
32 string
RosBootTest::EMU_TYPE_QEMU
= "qemu";
33 string
RosBootTest::EMU_TYPE_VMWARE
= "vmware";
34 string
RosBootTest::EMU_TYPE_XEN
= "xen";
35 string
RosBootTest::ROS_HDD_IMAGE
= "ROS_HDD_IMAGE";
36 string
RosBootTest::ROS_CD_IMAGE
= "ROS_CD_IMAGE";
37 string
RosBootTest::ROS_MAX_TIME
= "ROS_MAX_TIME";
38 string
RosBootTest::ROS_LOG_FILE
= "ROS_LOG_FILE";
39 string
RosBootTest::ROS_SYM_DIR
= "ROS_SYM_DIR";
40 string
RosBootTest::ROS_DELAY_READ
= "ROS_DELAY_READ";
41 string
RosBootTest::ROS_SYSREG_CHECKPOINT
= "SYSREG_CHECKPOINT:";
42 string
RosBootTest::ROS_CRITICAL_IMAGE
= "ROS_CRITICAL_IMAGE";
43 string
RosBootTest::ROS_EMU_KILL
= "ROS_EMU_KILL";
44 string
RosBootTest::ROS_EMU_MEM
= "ROS_EMU_MEM";
45 string
RosBootTest::ROS_BOOT_CMD
= "ROS_BOOT_CMD";
46 string
RosBootTest::XEN_CONFIG_FILE
= "XEN_CONFIG_FILE";
47 string
RosBootTest::XEN_CONFIG_NAME
= "XEN_CONFIG_NAME";
50 string
RosBootTest::ROS_EMU_PATH
= "ROS_EMU_PATH_LIN";
52 string
RosBootTest::ROS_EMU_PATH
= "ROS_EMU_PATH_WIN";
55 //---------------------------------------------------------------------------------------
56 RosBootTest::RosBootTest() : m_MaxTime(65), m_DelayRead(0)
61 //---------------------------------------------------------------------------------------
62 RosBootTest::~RosBootTest()
66 //---------------------------------------------------------------------------------------
67 bool RosBootTest::executeBootCmd()
70 const char * args
[128];
74 pBuf
= (char*)m_BootCmd
.c_str ();
77 pBuf
= strtok(pBuf
, " ");
81 strcpy(szBuffer
, pBuf
);
85 pBuf
= strtok(NULL
, " ");
91 strcpy(szBuffer
, pBuf
);
93 m_Pid
= OsSupport::createProcess (szBuffer
, numargs
-1, args
, false);
96 cerr
<< "Error: failed to launch boot cmd " << m_BootCmd
<< endl
;
102 //---------------------------------------------------------------------------------------
103 void RosBootTest::delayRead()
108 /// delay reading until emulator is ready
111 OsSupport::delayExecution(m_DelayRead
);
114 //---------------------------------------------------------------------------------------
115 void RosBootTest::getDefaultHDDImage(string
& img
)
119 EnvironmentVariable::getValue("ROS_OUTPUT", img
);
126 //---------------------------------------------------------------------------------------
127 bool RosBootTest::isFileExisting(string output
)
130 file
= fopen(output
.c_str(), "r");
134 /* the file exists */
141 //---------------------------------------------------------------------------------------
142 bool RosBootTest::isDefaultHDDImageExisting()
146 getDefaultHDDImage(img
);
147 return isFileExisting(img
);
150 //---------------------------------------------------------------------------------------
151 bool RosBootTest::createHDDImage(string image
)
155 if (!getQemuDir(qemuimgdir
))
157 cerr
<< "Error: failed to retrieve qemu directory path" << endl
;
163 qemuimgdir
+= "/qemu-img";
166 qemuimgdir
+= "\\qemu-img.exe";
169 if (!isFileExisting(qemuimgdir
))
171 cerr
<< "Error: ROS_EMU_PATH must contain the path to qemu and qemu-img " << qemuimgdir
<< endl
;
174 remove(image
.c_str ());
176 const char * options
[] = {NULL
,
190 options
[0] = qemuimgdir
.c_str();
191 options
[4] = image
.c_str();
193 cerr
<< "Creating HDD Image ..." << image
<< endl
;
194 OsSupport::createProcess (qemuimgdir
.c_str(), 6, options
, true);
195 if (isFileExisting(image
))
202 //----------------------------------------------------------------------------------------
203 bool RosBootTest::isQemuPathValid()
207 if (m_BootCmd
.length())
209 /* the boot cmd is already provided
210 * check if path to qemu is valid
212 string::size_type pos
= m_BootCmd
.find_first_of(" ");
213 if (pos
== string::npos
)
215 /* the bootcmd is certainly not valid */
218 qemupath
= m_BootCmd
.substr(0, pos
);
222 /* the qemu path is provided ROS_EMU_PATH variable */
223 qemupath
= m_EmuPath
;
227 return isFileExisting(qemupath
);
229 //----------------------------------------------------------------------------------------
230 bool RosBootTest::hasQemuNoRebootOption()
239 //----------------------------------------------------------------------------------------
240 bool RosBootTest::getQemuDir(string
& qemupath
)
242 string::size_type pos
;
245 pos
= m_EmuPath
.find_last_of("/");
247 pos
= m_EmuPath
.find_last_of("\\");
249 if (pos
== string::npos
)
251 cerr
<< "Error: ROS_EMU_PATH is invalid!!!" << endl
;
254 qemupath
= m_EmuPath
.substr(0, pos
);
257 //----------------------------------------------------------------------------------------
258 bool RosBootTest::createBootCmd()
262 char pipename
[] = "qemuXXXXXX";
263 if (m_MaxMem
.length() == 0)
265 /* set default memory size to 64M */
271 if (mktemp(pipename
))
273 string temp
= pipename
;
274 m_Src
= "/tmp/" + temp
;
275 pipe
= "pipe:" + m_Src
;
280 pipe
= "pipe:/tmp/qemu";
284 qemudir
= "/usr/share/qemu";
285 m_DebugPort
= "pipe";
287 if (_mktemp(pipename
))
289 string temp
= pipename
;
290 pipe
= "pipe:" + temp
;
291 m_Src
= "\\\\.\\pipe\\" + temp
;
296 m_Src
= "\\\\.\\pipe\\qemu";
298 m_DebugPort
= "pipe";
300 if (!getQemuDir(qemudir
))
307 m_BootCmd
= m_EmuPath
+ " -L " + qemudir
+ " -m " + m_MaxMem
+ " -serial " + pipe
;
309 if (m_CDImage
.length())
311 /* boot from cdrom */
312 m_BootCmd
+= " -boot d -cdrom " + m_CDImage
;
314 if (m_HDDImage
.length ())
316 /* add disk when specified */
317 m_BootCmd
+= " -hda " + m_HDDImage
;
321 else if (m_HDDImage
.length ())
324 m_BootCmd
+= " -boot c -hda " + m_HDDImage
;
329 * no boot device provided
331 cerr
<< "Error: no bootdevice provided" << endl
;
336 /* on linux we need get pid in order to be able
337 * to terminate the emulator in case of errors
338 * on windows we can get pid as return of CreateProcess
340 m_PidFile
= "output-i386";
341 EnvironmentVariable::getValue("ROS_OUTPUT", m_PidFile
);
342 m_PidFile
+= "/pid.txt";
343 m_BootCmd
+= " -pidfile ";
344 m_BootCmd
+= m_PidFile
;
345 m_BootCmd
+= " -nographic";
348 if (hasQemuNoRebootOption())
350 m_BootCmd
+= " -no-reboot ";
355 //----------------------------------------------------------------------------------------
356 bool RosBootTest::extractPipeFromBootCmd()
358 string::size_type pos
= m_BootCmd
.find("-serial pipe:");
359 if (pos
== string::npos
)
361 /* no debug options provided */
362 cerr
<< "Error: provided boot cmd does not specify a pipe debugging port" << endl
;
366 string pipe
= m_BootCmd
.substr(pos
+ 13, m_BootCmd
.size() - pos
- 13);
367 pos
= pipe
.find(" ");
368 if (pos
!= string::npos
)
370 pipe
= pipe
.substr(0, pos
);
375 m_Src
= "\\\\.\\pipe\\" + pipe
.substr(0, pos
);
377 m_DebugPort
= "pipe";
380 //----------------------------------------------------------------------------------------
381 bool RosBootTest::configureHDDImage()
383 //cout << "configureHDDImage m_HDDImage " << m_HDDImage.length() << " m_CDImage " << m_CDImage.length() << " m_BootCmd: " << m_BootCmd.length() << endl;
384 if (m_HDDImage
.length())
386 /* check if ROS_HDD_IMAGE points to hdd image */
387 if (!isFileExisting(m_HDDImage
))
389 if (!m_CDImage
.length ())
391 cerr
<< "Error: HDD image is not existing and CDROM image not provided" << endl
;
395 return createHDDImage(m_HDDImage
);
399 else if (!m_BootCmd
.length ())
401 /* no hdd image provided
402 * but also no override by
405 if (!m_CDImage
.length ())
407 cerr
<< "Error: no HDD and CDROM image provided" << endl
;
411 getDefaultHDDImage(m_HDDImage
);
412 if (isFileExisting(m_HDDImage
))
414 cerr
<< "Falling back to default hdd image " << m_HDDImage
<< endl
;
417 return createHDDImage(m_HDDImage
);
420 * verify the provided ROS_BOOT_CMD for hdd image
424 bool hdaboot
= false;
425 string::size_type pos
= m_BootCmd
.find ("-boot c");
426 if (pos
!= string::npos
)
431 pos
= m_BootCmd
.find("-hda ");
432 if (pos
!= string::npos
)
434 string hdd
= m_BootCmd
.substr(pos
+ 5, m_BootCmd
.length() - pos
- 5);
437 cerr
<< "Error: ROS_BOOT_CMD misses value of -hda option" << endl
;
440 pos
= m_BootCmd
.find(" ");
441 if (pos
!= string::npos
)
444 /// sysreg assumes that the hdd image filename has no spaces
446 hdd
= hdd
.substr(0, pos
);
448 if (!isFileExisting(hdd
))
452 cerr
<< "Error: ROS_BOOT_CMD specifies booting from hda but no valid hdd image " << hdd
<< " provided" << endl
;
456 /* the file does not exist create it */
457 return createHDDImage(hdd
);
464 //----------------------------------------------------------------------------------------
465 bool RosBootTest::configureCDImage()
467 if (!m_BootCmd
.length ())
469 if (m_CDImage
.length())
471 /* we have a cd image lets check if its valid */
472 if (isFileExisting(m_CDImage
))
474 cerr
<< "Using CDROM image " << m_CDImage
<< endl
;
478 if (isFileExisting("ReactOS-RegTest.iso"))
480 m_CDImage
= "ReactOS-RegTest.iso";
481 cerr
<< "Falling back to default CDROM image " << m_CDImage
<< endl
;
484 cerr
<< "No CDROM image found, boot device is HDD" << endl
;
489 string::size_type pos
= m_BootCmd
.find("-boot ");
490 if (pos
== string::npos
)
492 /* ROS_BOOT_CMD must provide a boot parameter*/
493 cerr
<< "Error: ROS_BOOT_CMD misses boot parameter" << endl
;
497 string rest
= m_BootCmd
.substr(pos
+ 6, m_BootCmd
.length() - pos
- 6);
498 if (rest
.length() < 1)
500 /* boot parameter misses option where to boot from */
501 cerr
<< "Error: ROS_BOOT_CMD misses boot parameter" << endl
;
504 if (rest
[0] != 'c' && rest
[0] != 'd')
506 cerr
<< "Error: ROS_BOOT_CMD has invalid boot parameter" << endl
;
512 /* ROS_BOOT_CMD boots from hdd */
516 pos
= m_BootCmd
.find("-cdrom ");
517 if (pos
== string::npos
)
519 cerr
<< "Error: ROS_BOOT_CMD misses cdrom parameter" << endl
;
522 rest
= m_BootCmd
.substr(pos
+ 7, m_BootCmd
.length() - pos
- 7);
525 cerr
<< "Error: ROS_BOOT_CMD misses cdrom parameter" << endl
;
528 pos
= rest
.find(" ");
529 if (pos
!= string::npos
)
531 rest
= rest
.substr(0, pos
);
534 if (!isFileExisting(rest
))
536 cerr
<< "Error: cdrom image " << rest
<< " does not exist" << endl
;
545 //----------------------------------------------------------------------------------------
546 bool RosBootTest::configureQemu()
548 if (!isQemuPathValid())
550 cerr
<< "Error: the path to qemu is not valid" << endl
;
554 if (!configureCDImage())
556 cerr
<< "Error: failed to set a valid cdrom configuration" << endl
;
560 if (!configureHDDImage())
562 cerr
<< "Error: failed to set a valid hdd configuration" << endl
;
566 if (m_BootCmd
.length())
568 if (!extractPipeFromBootCmd())
575 if (!createBootCmd())
581 if (mkfifo(m_Src
.c_str(), 400))
586 cerr <<"Error: mkfifo failed with " << errno << endl;
593 if (m_PidFile
.length () && isFileExisting(m_PidFile
))
595 cerr
<< "Deleting pid file " << m_PidFile
<< endl
;
596 remove(m_PidFile
.c_str ());
599 cerr
<< "Opening Data Source:" << m_BootCmd
<< endl
;
600 m_DataSource
= new NamedPipeReader();
601 if (!executeBootCmd())
604 cerr
<< "Error: failed to launch emulator with: " << m_BootCmd
<< endl
;
611 //---------------------------------------------------------------------------------------
612 bool RosBootTest::xenGetCaps()
618 fp
= popen("xm info", "r");
621 cerr
<< "Error getting Xen caps." << endl
;
624 for (i
=0;(i
<2049)&&(feof(fp
) == 0 && ((ch
= fgetc(fp
)) != -1)); i
++)
626 buffer
[i
] = (char) ch
;
631 if (strstr(buffer
, "hvm") == 0)
633 cerr
<< "No hvm support detected!" << endl
;
643 //---------------------------------------------------------------------------------------
644 bool RosBootTest::configureXen(ConfigParser
&conf_parser
)
651 if (!isFileExisting(m_XenConfig
))
653 cerr
<< "Xen configuration file missing" << endl
;
656 m_Src
= "xm console ";
657 string xen_name
= "reactos";
658 conf_parser
.getStringValue(RosBootTest::XEN_CONFIG_NAME
, xen_name
);
661 m_DataSource
= new PipeReader();
662 m_BootCmd
= m_EmuPath
+ "/xm create " + m_XenConfig
;
663 if (!executeBootCmd())
668 //---------------------------------------------------------------------------------------
669 bool RosBootTest::configureVmWare()
671 cerr
<< "VmWare is currently not yet supported" << endl
;
674 //---------------------------------------------------------------------------------------
675 bool RosBootTest::readConfigurationValues(ConfigParser
&conf_parser
)
678 if (!conf_parser
.getStringValue(RosBootTest::ROS_EMU_TYPE
, m_EmuType
))
680 cerr
<< "Error: ROS_EMU_TYPE is not set" << endl
;
684 if (m_EmuType
== EMU_TYPE_XEN
)
686 if (!conf_parser
.getStringValue(RosBootTest::XEN_CONFIG_FILE
, m_XenConfig
))
688 cerr
<< "Error: XEN_CONFIG_FILE is not set" << endl
;
692 if (!conf_parser
.getStringValue(RosBootTest::ROS_EMU_PATH
, m_EmuPath
))
694 cerr
<< "Error: ROS_EMU_PATH_[LIN/WIN] is not set" << endl
;
697 if (!m_HDDImage
.length())
699 /* only read image once */
700 conf_parser
.getStringValue (RosBootTest::ROS_HDD_IMAGE
, m_HDDImage
);
702 if (!m_CDImage
.length())
704 /* only read cdimage once */
705 conf_parser
.getStringValue (RosBootTest::ROS_CD_IMAGE
, m_CDImage
);
711 conf_parser
.getIntValue (RosBootTest::ROS_MAX_TIME
, m_MaxTime
);
712 conf_parser
.getStringValue (RosBootTest::ROS_LOG_FILE
, m_DebugFile
);
713 conf_parser
.getStringValue (RosBootTest::ROS_SYM_DIR
, m_SymDir
);
714 conf_parser
.getIntValue (RosBootTest::ROS_DELAY_READ
, m_DelayRead
);
715 conf_parser
.getStringValue (RosBootTest::ROS_SYSREG_CHECKPOINT
, m_Checkpoint
);
716 conf_parser
.getStringValue (RosBootTest::ROS_CRITICAL_IMAGE
, m_CriticalImage
);
717 conf_parser
.getStringValue (RosBootTest::ROS_EMU_KILL
, m_KillEmulator
);
718 conf_parser
.getStringValue (RosBootTest::ROS_EMU_MEM
, m_MaxMem
);
719 conf_parser
.getStringValue (RosBootTest::ROS_BOOT_CMD
, m_BootCmd
);
723 //---------------------------------------------------------------------------------------
724 void RosBootTest::cleanup(ConfigParser
&conf_parser
)
726 m_DataSource
->closeSource();
727 OsSupport::delayExecution(3);
729 if (m_EmuType
== EMU_TYPE_XEN
)
731 string xen_name
= "reactos";
732 conf_parser
.getStringValue(RosBootTest::XEN_CONFIG_NAME
, xen_name
);
733 string cmd
= "xm destroy " + xen_name
;
734 system(cmd
.c_str ());
740 OsSupport::terminateProcess (m_Pid
, 0);
746 if (m_PidFile
.length ())
748 remove(m_PidFile
.c_str ());
752 //---------------------------------------------------------------------------------------
753 bool RosBootTest::execute(ConfigParser
&conf_parser
)
755 if (!readConfigurationValues(conf_parser
))
760 if (m_EmuType
== EMU_TYPE_QEMU
)
762 if (!configureQemu())
764 cerr
<< "Error: failed to configure qemu" << endl
;
768 else if (m_EmuType
== EMU_TYPE_VMWARE
)
770 if (!configureVmWare())
772 cerr
<< "Error: failed to configure vmware" << endl
;
776 else if (m_EmuType
== EMU_TYPE_XEN
)
778 if (!configureXen(conf_parser
))
780 cerr
<< "Error: failed to configure xen" << endl
;
787 /// unsupported emulator
789 cerr
<< "Error: ROS_EMU_TYPE value is not supported:" << m_EmuType
<< "=" << EMU_TYPE_QEMU
<< endl
;
795 cerr
<< "Delaying read for " << m_DelayRead
<< " seconds" << endl
;
796 OsSupport::delayExecution(m_DelayRead
);
799 if (!m_DataSource
->openSource(m_Src
))
801 cerr
<< "Error: failed to open data source with " << m_Src
<< endl
;
802 cleanup(conf_parser
);
807 * For linux systems we can only
808 * check if the emulator runs by
809 * opening pid.txt and lookthrough if
813 if (m_EmuType
!= EMU_TYPE_XEN
)
815 FILE * file
= fopen(m_PidFile
.c_str(), "r");
818 cerr
<< "Error: failed to launch emulator" << endl
;
819 cleanup(conf_parser
);
823 if (!fread(buffer
, 1, sizeof(buffer
), file
))
825 cerr
<< "Error: pid file w/o pid!!! " << endl
;
827 cleanup(conf_parser
);
830 m_Pid
= atoi(buffer
);
834 OsSupport::cancelAlarms();
836 // OsSupport::setAlarm (m_MaxTime, m_Pid);
837 // OsSupport::setAlarm(m_MaxTime, getpid());
839 OsSupport::setAlarm (m_MaxTime
, m_Pid
);
840 OsSupport::setAlarm(m_MaxTime
, GetCurrentProcessId());
843 bool ret
= analyzeDebugData();
844 cleanup(conf_parser
);
848 //---------------------------------------------------------------------------------------
849 void RosBootTest::dumpCheckpoints()
851 if (m_Checkpoints
.size ())
853 cerr
<< "Dumping list of checkpoints: "<< endl
;
854 while(!m_Checkpoints
.empty ())
856 cerr
<< m_Checkpoints
[0] << endl
;
857 m_Checkpoints
.erase (m_Checkpoints
.begin ());
861 //---------------------------------------------------------------------------------------
862 RosBootTest::DebugState
RosBootTest::checkDebugData(vector
<string
> & debug_data
)
864 /// TBD the information needs to be written into an provided log object
865 /// which writes the info into HTML/log / sends etc ....
868 DebugState state
= DebugStateContinue
;
870 for(size_t i
= 0; i
< debug_data
.size();i
++)
872 string line
= debug_data
[i
];
874 cout
<< line
<< endl
;
876 if (line
.find (RosBootTest::ROS_SYSREG_CHECKPOINT
) != string::npos
)
878 line
.erase (0, line
.find (RosBootTest::ROS_SYSREG_CHECKPOINT
) +
879 RosBootTest::ROS_SYSREG_CHECKPOINT
.length ());
880 if (!strncmp(line
.c_str (), m_Checkpoint
.c_str (), m_Checkpoint
.length ()))
882 state
= DebugStateCPReached
;
885 m_Checkpoints
.push_back (line
);
889 if (line
.find ("*** Fatal System Error") != string::npos
)
891 cerr
<< "Blue Screen of Death detected" <<endl
;
892 if (m_Checkpoints
.size ())
894 cerr
<< "dumping list of reached checkpoints:" << endl
;
897 string cp
= m_Checkpoints
[0];
898 m_Checkpoints
.erase (m_Checkpoints
.begin ());
900 }while(m_Checkpoints
.size ());
901 cerr
<< "----------------------------------" << endl
;
903 if (i
+ 1 < debug_data
.size () )
905 cerr
<< "dumping rest of debug log" << endl
;
906 while(i
< debug_data
.size ())
908 string data
= debug_data
[i
];
909 cerr
<< data
<< endl
;
912 cerr
<< "----------------------------------" << endl
;
914 state
= DebugStateBSODDetected
;
917 else if (line
.find ("Unhandled exception") != string::npos
)
919 if (m_CriticalImage
== "IGNORE")
922 /// ignoring all user-mode exceptions
928 if (i
+ 3 >= debug_data
.size ())
931 /// missing information is cut off -> try reconstruct at next call
938 /// extract address from next line
941 string address
= debug_data
[i
+2];
942 string::size_type pos
= address
.find_last_of (" ");
943 if (pos
== string::npos
)
945 cerr
<< "Error: trace is not available (corrupted debug info" << endl
;
950 address
= address
.substr (pos
, address
.length () - 1 - pos
);
953 /// extract module name
955 string modulename
= debug_data
[i
+3];
957 pos
= modulename
.find_last_of ("\\");
958 if (pos
== string::npos
)
960 cerr
<< "Error: trace is not available (corrupted debug info" << endl
;
964 string appname
= modulename
.substr (pos
+ 1, modulename
.length () - pos
);
965 if (m_CriticalImage
.find (appname
) == string::npos
&& m_CriticalImage
.length () > 1)
967 /// the application is not in the list of
968 /// critical apps. Therefore we ignore the user-mode
974 pos
= appname
.find_last_of (".");
975 if (pos
== string::npos
)
977 cerr
<< "Error: trace is not available (corrupted debug info" << endl
;
981 modulename
= appname
.substr (0, pos
);
983 cerr
<< "UM detected" <<endl
;
984 state
= DebugStateUMEDetected
;
990 result
.reserve (200);
992 SymbolFile::resolveAddress (modulename
, address
, result
);
993 cerr
<< result
<< endl
;
998 /// resolve frame addresses
1006 if (clear
&& debug_data
.size () > 5)
1008 debug_data
.clear ();
1012 //---------------------------------------------------------------------------------------
1013 bool RosBootTest::analyzeDebugData()
1015 vector
<string
> vect
;
1021 if (m_DebugFile
.length ())
1023 remove(m_DebugFile
.c_str ());
1024 file
.open (m_DebugFile
.c_str ());
1027 write_log
= file
.is_open ();
1030 size_t prev_count
= vect
.size ();
1031 if (!m_DataSource
->readSource (vect
))
1037 for (size_t i
= prev_count
; i
< vect
.size (); i
++)
1039 string
& line
= vect
[i
];
1044 DebugState state
= checkDebugData(vect
);
1045 if (state
== DebugStateBSODDetected
|| state
== DebugStateUMEDetected
)
1050 else if (state
== DebugStateCPReached
)
1054 lines
+= (vect
.size() -prev_count
); //WTF?
1063 } // end of namespace Sysreg_