blob: 00f39fdc1e9202072cd19835a4a57c23c9c9e35f [file] [log] [blame]
Zane Shelleyfd3f9cc2019-07-29 15:02:24 -05001/* IBM_PROLOG_BEGIN_TAG */
2/* This is an automatically generated prolog. */
3/* */
4/* $Source: src/usr/diag/prdf/common/framework/register/prdfOperatorRegister.H $ */
5/* */
6/* OpenPOWER HostBoot Project */
7/* */
8/* Contributors Listed Below - COPYRIGHT 2012,2018 */
9/* [+] International Business Machines Corp. */
10/* */
11/* */
12/* Licensed under the Apache License, Version 2.0 (the "License"); */
13/* you may not use this file except in compliance with the License. */
14/* You may obtain a copy of the License at */
15/* */
16/* http://www.apache.org/licenses/LICENSE-2.0 */
17/* */
18/* Unless required by applicable law or agreed to in writing, software */
19/* distributed under the License is distributed on an "AS IS" BASIS, */
20/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or */
21/* implied. See the License for the specific language governing */
22/* permissions and limitations under the License. */
23/* */
24/* IBM_PROLOG_END_TAG */
25
26#ifndef __PRDFOPERATORREGISTER_H
27#define __PRDFOPERATORREGISTER_H
28
29#include <algorithm>
30
31#include <iipscr.h>
32#include <prdrCommon.H>
33
34namespace PRDF
35{
36
37class NotRegister : public SCAN_COMM_REGISTER_CLASS
38{
39 public:
40 NotRegister() :
41 SCAN_COMM_REGISTER_CLASS( ), iv_child(NULL), iv_iBS(0)
42 {
43 iv_bs = &iv_iBS;
44 }
45
46 NotRegister(SCAN_COMM_REGISTER_CLASS & i_arg) :
47 SCAN_COMM_REGISTER_CLASS( ), iv_child(&i_arg),
48 iv_iBS(i_arg.GetBitLength())
49 {
50 iv_bs = &iv_iBS;
51 }
52
53 NotRegister & operator=(const NotRegister & r)
54 {
55 iv_child = r.iv_child;
56 iv_iBS = r.iv_iBS;
57 //iv_bs = r.iv_bs; <-- don't do this!
58 return *this;
59 }
60
61 virtual uint32_t Read() const { return iv_child->Read(); }
62 virtual uint32_t Write() { return iv_child->Write(); }
63
64 const BitString * GetBitString(
65 ATTENTION_TYPE i_type = INVALID_ATTENTION_TYPE) const
66 {
67 (*iv_bs) = ~(*iv_child->GetBitString(i_type));
68 return iv_bs;
69 }
70
71 virtual uint16_t GetId() const { return iv_child->GetId(); }
72 virtual void SetId(uint16_t i_id) {}
73
74 bool operator==(const NotRegister & r) const
75 { return r.iv_child == iv_child; }
76
77 bool operator<(const NotRegister & r) const
78 { return iv_child < r.iv_child; }
79
80 bool operator>=(const NotRegister & r) const
81 { return iv_child >= r.iv_child; }
82
83 protected:
84 BitString & AccessBitString(void) { return iv_iBS; }
85 void SetBitString(const BitString *) {}
86
87 private:
88 SCAN_COMM_REGISTER_CLASS * iv_child;
89
90 BitStringBuffer * iv_bs;
91 BitStringBuffer iv_iBS;
92};
93
94class SummaryRegister : public SCAN_COMM_REGISTER_CLASS
95{
96 public:
97 SummaryRegister() :
98 SCAN_COMM_REGISTER_CLASS( ), iv_child(NULL), iv_amount(0), iv_iBS(0)
99 {
100 iv_bs = &iv_iBS;
101 }
102
103 SummaryRegister(SCAN_COMM_REGISTER_CLASS & i_arg, uint16_t i_amount) :
104 SCAN_COMM_REGISTER_CLASS( ), iv_child(&i_arg), iv_amount(i_amount),
105 iv_iBS(i_arg.GetBitLength())
106 {
107 iv_bs = &iv_iBS;
108 }
109
110 SummaryRegister & operator=(const SummaryRegister & r)
111 {
112 iv_child = r.iv_child;
113 iv_amount = r.iv_amount;
114 iv_iBS = r.iv_iBS;
115 //iv_bs = r.iv_bs; <-- don't do this!
116 return *this;
117 }
118
119 virtual uint32_t Read() const
120 {
121 uint32_t rc = iv_child->Read();
122 if ( PRD_SCANCOM_FAILURE == rc )
123 {
124 // This is a bit unusual, but we are going to ignore SCOM failures.
125 // This takes care of a corner case where one of the summary
126 // registers in the list returns an error, but there is another
127 // summary register with an active attention, which would be ignored
128 // if we return a bad rc.
129 PRDF_INF( "[SummaryRegister::read] SCOM failure on register ID "
130 "0x%04x, ignoring error", iv_child->GetId() );
131 rc = SUCCESS;
132 iv_child->clearAllBits(); // just in case
133 }
134 return rc;
135 }
136
137 virtual uint32_t Write() { return iv_child->Write(); }
138
139 const BitString * GetBitString(
140 ATTENTION_TYPE i_type = INVALID_ATTENTION_TYPE) const
141 {
142 iv_bs->clearAll();
143
144 PRDF::BitString tmp = *iv_child->GetBitString(i_type);
145
146 //if any bits are set in iv_child, then set the iv_amount bit
147 if (0 != tmp.getSetCount())
148 {
149 iv_bs->setBit(0);
150 *iv_bs = *iv_bs >> iv_amount;
151 }
152 return iv_bs;
153 }
154
155 virtual uint16_t GetId() const { return iv_child->GetId(); }
156 virtual void SetId(uint16_t i_id) {}
157
158 bool operator==(const SummaryRegister & r) const
159 { return (r.iv_child == iv_child) && (r.iv_amount == iv_amount); }
160
161 bool operator<(const SummaryRegister & r) const
162 {
163 if (iv_child == r.iv_child)
164 return iv_amount < r.iv_amount;
165 return iv_child < r.iv_child;
166 }
167
168 bool operator>=(const SummaryRegister & r) const
169 {
170 if (iv_child == r.iv_child)
171 return iv_amount >= r.iv_amount;
172 return iv_child >= r.iv_child;
173 }
174
175 protected:
176 BitString & AccessBitString(void) { return iv_iBS; }
177 void SetBitString(const BitString *) {}
178
179 private:
180 SCAN_COMM_REGISTER_CLASS * iv_child;
181 uint16_t iv_amount;
182
183 BitStringBuffer * iv_bs;
184 BitStringBuffer iv_iBS;
185};
186
187class LeftShiftRegister : public SCAN_COMM_REGISTER_CLASS
188{
189 public:
190 LeftShiftRegister() :
191 SCAN_COMM_REGISTER_CLASS( ), iv_child(NULL), iv_amount(0), iv_iBS(0)
192 {
193 iv_bs = &iv_iBS;
194 }
195
196 LeftShiftRegister(SCAN_COMM_REGISTER_CLASS & i_arg, uint16_t i_amount) :
197 SCAN_COMM_REGISTER_CLASS( ), iv_child(&i_arg), iv_amount(i_amount),
198 iv_iBS(i_arg.GetBitLength())
199 {
200 iv_bs = &iv_iBS;
201 }
202
203 LeftShiftRegister & operator=(const LeftShiftRegister & r)
204 {
205 iv_child = r.iv_child;
206 iv_amount = r.iv_amount;
207 iv_iBS = r.iv_iBS;
208 //iv_bs = r.iv_bs; <-- don't do this!
209 return *this;
210 }
211
212 virtual uint32_t Read() const { return iv_child->Read(); }
213 virtual uint32_t Write() { return iv_child->Write(); }
214
215 const BitString * GetBitString(
216 ATTENTION_TYPE i_type = INVALID_ATTENTION_TYPE) const
217 {
218 (*iv_bs) = (*iv_child->GetBitString(i_type)) << iv_amount;
219 return iv_bs;
220 }
221
222 virtual uint16_t GetId() const { return iv_child->GetId(); }
223 virtual void SetId(uint16_t i_id) {}
224
225 bool operator==(const LeftShiftRegister & r) const
226 { return (r.iv_child == iv_child) && (r.iv_amount == iv_amount); }
227
228 bool operator<(const LeftShiftRegister & r) const
229 {
230 if (iv_child == r.iv_child)
231 return iv_amount < r.iv_amount;
232 return iv_child < r.iv_child;
233 }
234
235 bool operator>=(const LeftShiftRegister & r) const
236 {
237 if (iv_child == r.iv_child)
238 return iv_amount >= r.iv_amount;
239 return iv_child >= r.iv_child;
240 }
241
242 protected:
243 BitString & AccessBitString(void) { return iv_iBS; }
244 void SetBitString(const BitString *) {}
245
246 private:
247 SCAN_COMM_REGISTER_CLASS * iv_child;
248 uint16_t iv_amount;
249
250 BitStringBuffer * iv_bs;
251 BitStringBuffer iv_iBS;
252};
253
254class RightShiftRegister : public SCAN_COMM_REGISTER_CLASS
255{
256 public:
257 RightShiftRegister() :
258 SCAN_COMM_REGISTER_CLASS( ), iv_child(NULL), iv_amount(0), iv_iBS(0)
259 {
260 iv_bs = &iv_iBS;
261 }
262
263 RightShiftRegister(SCAN_COMM_REGISTER_CLASS & i_arg, uint16_t i_amount) :
264 SCAN_COMM_REGISTER_CLASS( ), iv_child(&i_arg), iv_amount(i_amount),
265 iv_iBS(i_arg.GetBitLength())
266 {
267 iv_bs = &iv_iBS;
268 }
269
270 RightShiftRegister & operator=(const RightShiftRegister & r)
271 {
272 iv_child = r.iv_child;
273 iv_amount = r.iv_amount;
274 iv_iBS = r.iv_iBS;
275 //iv_bs = r.iv_bs; <-- don't do this!
276 return *this;
277 }
278
279 virtual uint32_t Read() const { return iv_child->Read(); }
280 virtual uint32_t Write() { return iv_child->Write(); }
281
282 const BitString * GetBitString(
283 ATTENTION_TYPE i_type = INVALID_ATTENTION_TYPE) const
284 {
285 (*iv_bs) = (*iv_child->GetBitString(i_type)) >> iv_amount;
286 return iv_bs;
287 }
288
289 virtual uint16_t GetId() const { return iv_child->GetId(); }
290 virtual void SetId(uint16_t i_id) {}
291
292 bool operator==(const RightShiftRegister & r) const
293 { return (r.iv_child == iv_child) && (r.iv_amount == iv_amount); }
294
295 bool operator<(const RightShiftRegister & r) const
296 {
297 if (iv_child == r.iv_child)
298 return iv_amount < r.iv_amount;
299 return iv_child < r.iv_child;
300 }
301
302 bool operator>=(const RightShiftRegister & r) const
303 {
304 if (iv_child == r.iv_child)
305 return iv_amount >= r.iv_amount;
306 return iv_child >= r.iv_child;
307 }
308
309 protected:
310 BitString & AccessBitString(void) { return iv_iBS; }
311 void SetBitString(const BitString *) {}
312
313 private:
314 SCAN_COMM_REGISTER_CLASS * iv_child;
315 uint16_t iv_amount;
316
317 BitStringBuffer * iv_bs;
318 BitStringBuffer iv_iBS;
319};
320
321
322class AndRegister : public SCAN_COMM_REGISTER_CLASS
323{
324 public:
325 AndRegister() :
326 SCAN_COMM_REGISTER_CLASS( ), iv_left(NULL), iv_right(NULL), iv_iBS(0)
327 {
328 iv_bs = &iv_iBS;
329 }
330
331 AndRegister( SCAN_COMM_REGISTER_CLASS & i_left,
332 SCAN_COMM_REGISTER_CLASS & i_right ) :
333 SCAN_COMM_REGISTER_CLASS( ), iv_left(&i_left), iv_right(&i_right),
334 iv_iBS(std::min(i_left.GetBitLength(),
335 i_right.GetBitLength()))
336 {
337 iv_bs = &iv_iBS;
338 }
339
340 AndRegister & operator=(const AndRegister & r)
341 {
342 iv_left = r.iv_left;
343 iv_right = r.iv_right;
344 iv_iBS = r.iv_iBS;
345 //iv_bs = r.iv_bs; <-- don't do this!
346 return *this;
347 }
348
349 virtual uint32_t Read() const
350 {
351 return iv_left->Read() | iv_right->Read();
352 }
353 virtual uint32_t Write()
354 {
355 return iv_left->Write() | iv_right->Write();
356 }
357
358 const BitString * GetBitString(
359 ATTENTION_TYPE i_type = INVALID_ATTENTION_TYPE) const
360 {
361 (*iv_bs) = *iv_left->GetBitString(i_type);
362 (*iv_bs) = (*iv_bs) & (*iv_right->GetBitString(i_type));
363 return iv_bs;
364 }
365
366 virtual uint16_t GetId() const
367 {
368 return Prdr::SignatureOp::combineSig(iv_left->GetId(),
369 iv_right->GetId());
370 }
371
372 virtual void SetId(uint16_t i_id) {}
373
374 bool operator==(const AndRegister & r) const
375 { return (r.iv_left == iv_left) && (r.iv_right == iv_right); }
376
377 bool operator<(const AndRegister & r) const
378 {
379 if (iv_left == r.iv_left)
380 return iv_right < r.iv_right;
381 return iv_left < r.iv_left;
382 }
383
384 bool operator>=(const AndRegister & r) const
385 {
386 if (iv_left == r.iv_left)
387 return iv_right >= r.iv_right;
388 return iv_left >= r.iv_left;
389 }
390
391 protected:
392 BitString & AccessBitString(void) { return iv_iBS; }
393 void SetBitString(const BitString *) {}
394
395 private:
396 SCAN_COMM_REGISTER_CLASS * iv_left;
397 SCAN_COMM_REGISTER_CLASS * iv_right;
398
399 BitStringBuffer * iv_bs;
400 BitStringBuffer iv_iBS;
401};
402
403class OrRegister : public SCAN_COMM_REGISTER_CLASS
404{
405 public:
406
407 OrRegister() :
408 SCAN_COMM_REGISTER_CLASS( ), iv_left(NULL), iv_right(NULL), iv_iBS(0)
409 {
410 iv_bs = &iv_iBS;
411 }
412
413 OrRegister( SCAN_COMM_REGISTER_CLASS & i_left,
414 SCAN_COMM_REGISTER_CLASS & i_right ) :
415 SCAN_COMM_REGISTER_CLASS( ), iv_left(&i_left), iv_right(&i_right),
416 iv_iBS(std::min(i_left.GetBitLength(),
417 i_right.GetBitLength()))
418 {
419 iv_bs = &iv_iBS;
420 }
421
422 OrRegister & operator=(const OrRegister & r)
423 {
424 iv_left = r.iv_left;
425 iv_right = r.iv_right;
426 iv_iBS = r.iv_iBS;
427 //iv_bs = r.iv_bs; <-- don't do this!
428 return *this;
429 }
430
431 virtual uint32_t Read() const
432 {
433 return iv_left->Read() | iv_right->Read();
434 }
435
436 virtual uint32_t Write()
437 {
438 return iv_left->Write() | iv_right->Write();
439 }
440
441 const BitString * GetBitString(
442 ATTENTION_TYPE i_type = INVALID_ATTENTION_TYPE ) const
443 {
444 (*iv_bs) = *iv_left->GetBitString(i_type);
445 (*iv_bs) = (*iv_bs) | (*iv_right->GetBitString(i_type));
446 return iv_bs;
447 }
448
449 virtual uint16_t GetId() const
450 {
451 return Prdr::SignatureOp::combineSig( iv_left->GetId(),
452 iv_right->GetId() );
453 }
454
455 virtual void SetId(uint16_t i_id) {}
456
457 bool operator==(const OrRegister & r) const
458 { return (r.iv_left == iv_left) && (r.iv_right == iv_right); }
459
460 bool operator<(const OrRegister & r) const
461 {
462 if (iv_left == r.iv_left)
463 return iv_right < r.iv_right;
464 return iv_left < r.iv_left;
465 }
466
467 bool operator>=(const OrRegister & r) const
468 {
469 if (iv_left == r.iv_left)
470 return iv_right >= r.iv_right;
471 return iv_left >= r.iv_left;
472 }
473
474 protected:
475 BitString & AccessBitString(void) { return iv_iBS; }
476 void SetBitString(const BitString *) {}
477
478 private:
479 SCAN_COMM_REGISTER_CLASS * iv_left;
480 SCAN_COMM_REGISTER_CLASS * iv_right;
481
482 BitStringBuffer * iv_bs;
483 BitStringBuffer iv_iBS;
484};
485
486class NullRegister : public SCAN_COMM_REGISTER_CLASS
487{
488 public:
489 NullRegister(int size) :
490 SCAN_COMM_REGISTER_CLASS( ), iv_iBS(size)
491 {}
492
493 NullRegister & operator=(const NullRegister & r)
494 {
495 iv_iBS = r.iv_iBS;
496 return *this;
497 }
498
499 virtual uint32_t Read() const { return 0; }
500 virtual uint32_t Write() { return 0; }
501
502 const BitString * GetBitString(
503 ATTENTION_TYPE i_type = INVALID_ATTENTION_TYPE) const
504 {
505 return &iv_iBS;
506 }
507
508 protected:
509 BitString & AccessBitString(void) { return iv_iBS; }
510 void SetBitString(const BitString *) {}
511
512 private:
513 BitStringBuffer iv_iBS;
514
515 virtual uint16_t GetId() const
516 { return Prdr::SignatureOp::DEFAULT_SIGNATURE; }
517
518 virtual void SetId(uint16_t i_id) {}
519
520};
521
522class AttnTypeRegister : public SCAN_COMM_REGISTER_CLASS
523{
524 public:
525 AttnTypeRegister() :
526 SCAN_COMM_REGISTER_CLASS( ), iv_check(&cv_null), iv_recov(&cv_null),
527 iv_special(&cv_null), iv_proccs(&cv_null), iv_hostattn(&cv_null),
528 iv_iBS(0)
529 {
530 iv_bs = &iv_iBS;
531 }
532
533 AttnTypeRegister( SCAN_COMM_REGISTER_CLASS *i_check,
534 SCAN_COMM_REGISTER_CLASS *i_recov,
535 SCAN_COMM_REGISTER_CLASS *i_special,
536 SCAN_COMM_REGISTER_CLASS *i_proccs,
537 SCAN_COMM_REGISTER_CLASS *i_hostattn ) :
538 SCAN_COMM_REGISTER_CLASS( ),
539 iv_check( NULL == i_check ? &cv_null : i_check),
540 iv_recov( NULL == i_recov ? &cv_null : i_recov),
541 iv_special( NULL == i_special ? &cv_null : i_special),
542 iv_proccs( NULL == i_proccs ? &cv_null : i_proccs),
543 iv_hostattn( NULL == i_hostattn ? &cv_null : i_hostattn),
544 iv_iBS(0) // will fully initialize this inside ctor.
545 {
546 uint32_t l_length = 1024;
547 l_length = std::min(l_length, iv_check->GetBitLength());
548 l_length = std::min(l_length, iv_recov->GetBitLength());
549 l_length = std::min(l_length, iv_special->GetBitLength());
550 l_length = std::min(l_length, iv_proccs->GetBitLength());
551 l_length = std::min(l_length, iv_hostattn->GetBitLength());
552 iv_iBS = BitStringBuffer(l_length);
553 iv_bs = &iv_iBS;
554 }
555
556 AttnTypeRegister & operator=(const AttnTypeRegister & r)
557 {
558 //iv_null = r.iv_null; <-- don't do this!
559 iv_check = (r.iv_check == &r.cv_null ? &cv_null : r.iv_check);
560 iv_recov = (r.iv_recov == &r.cv_null ? &cv_null : r.iv_recov);
561 iv_special = (r.iv_special == &r.cv_null ? &cv_null : r.iv_special);
562 iv_proccs = (r.iv_proccs == &r.cv_null ? &cv_null : r.iv_proccs);
563 iv_hostattn = (r.iv_hostattn == &r.cv_null ? &cv_null : r.iv_hostattn);
564 iv_iBS = r.iv_iBS;
565 //iv_bs = r.iv_bs; <-- don't do this!
566 return *this;
567 }
568
569 virtual uint32_t Read() const
570 {
571 return iv_check->Read() | iv_recov->Read() |
572 iv_special->Read() | iv_proccs->Read() |
573 iv_hostattn->Read();
574 }
575
576 virtual uint32_t Write()
577 {
578 return iv_check->Write() | iv_recov->Write() |
579 iv_special->Write() | iv_proccs->Write() |
580 iv_hostattn->Write();
581 }
582
583 const BitString * GetBitString(
584 ATTENTION_TYPE i_type = INVALID_ATTENTION_TYPE) const
585 {
586 switch (i_type)
587 {
588 case CHECK_STOP:
589 (*iv_bs) = BitStringBuffer(
590 *iv_check->GetBitString(i_type));
591 break;
592
593 case RECOVERABLE:
594 (*iv_bs) = BitStringBuffer(
595 *iv_recov->GetBitString(i_type));
596 break;
597
598 case SPECIAL:
599 (*iv_bs) = BitStringBuffer(
600 *iv_special->GetBitString(i_type));
601 break;
602
603 case PROC_CS:
604 (*iv_bs) = BitStringBuffer(
605 *iv_proccs->GetBitString(i_type));
606 break;
607
608 case HOST_ATTN:
609 (*iv_bs) = BitStringBuffer(
610 *iv_hostattn->GetBitString(i_type));
611 break;
612 }
613
614 return iv_bs;
615 }
616
617 virtual uint16_t GetId() const
618 {
619 uint16_t l_rc = Prdr::SignatureOp::DEFAULT_SIGNATURE;
620 l_rc = Prdr::SignatureOp::combineSig(l_rc, iv_check->GetId());
621 l_rc = Prdr::SignatureOp::combineSig(l_rc, iv_recov->GetId());
622 l_rc = Prdr::SignatureOp::combineSig(l_rc, iv_special->GetId());
623 l_rc = Prdr::SignatureOp::combineSig(l_rc, iv_proccs->GetId());
624 l_rc = Prdr::SignatureOp::combineSig(l_rc, iv_hostattn->GetId());
625 return l_rc;
626 }
627
628 virtual void SetId(uint16_t i_id) {}
629
630 bool operator==(const AttnTypeRegister & r) const
631 {
632 return (r.iv_check == iv_check) && (r.iv_recov == iv_recov) &&
633 (r.iv_special == iv_special) && (r.iv_proccs == iv_proccs) &&
634 (r.iv_special == iv_hostattn);
635 }
636
637 protected:
638 BitString & AccessBitString(void) { return iv_iBS; }
639 void SetBitString(const BitString *) {}
640
641 private:
642 static NullRegister cv_null;
643
644 SCAN_COMM_REGISTER_CLASS * iv_check;
645 SCAN_COMM_REGISTER_CLASS * iv_recov;
646 SCAN_COMM_REGISTER_CLASS * iv_special;
647 SCAN_COMM_REGISTER_CLASS * iv_proccs;
648 SCAN_COMM_REGISTER_CLASS * iv_hostattn;
649
650 BitStringBuffer * iv_bs;
651 BitStringBuffer iv_iBS;
652};
653
654class ConstantRegister : public SCAN_COMM_REGISTER_CLASS
655{
656 public:
657 ConstantRegister() :
658 SCAN_COMM_REGISTER_CLASS( ), iv_iBS(0)
659 {}
660
661 ConstantRegister( const BitStringBuffer & i_arg ) :
662 SCAN_COMM_REGISTER_CLASS( ), iv_iBS(i_arg)
663 {}
664
665 ConstantRegister & operator=(const ConstantRegister & r)
666 {
667 iv_iBS = r.iv_iBS;
668 return *this;
669 }
670
671 virtual uint32_t Read() const { return SUCCESS; }
672 virtual uint32_t Write() { return SUCCESS; }
673
674 const BitString * GetBitString(
675 ATTENTION_TYPE i_type = INVALID_ATTENTION_TYPE) const
676 {
677 return &iv_iBS;
678 }
679
680 virtual uint16_t GetId() const
681 { return Prdr::SignatureOp::DEFAULT_SIGNATURE; }
682
683 virtual void SetId(uint16_t i_id) {}
684
685 bool operator==(const ConstantRegister & r) const
686 { return r.iv_iBS == iv_iBS; }
687
688 protected:
689 BitString & AccessBitString(void) { return iv_iBS; }
690 void SetBitString(const BitString *) {}
691
692 private:
693 BitStringBuffer iv_iBS;
694};
695
696} // end namespace PRDF
697
698#endif