91 int x,
int y, uint32_t* color,
int mode)
94 int bufdepth = 1 << ((mode >> 8) & 3);
102 uint32_t tlb_mode = (mode >> 10) & 0x7;
103 bool linear = tlb_mode > 3;
105 if (!linear && (x < 0 || y < 0 || x >= 2048 || y >= 2048))
108 int tilewidth_in_pixels = 512 / bufdepth;
110 int tile_nr_x = x / tilewidth_in_pixels;
111 int tile_nr_y = y >> 7;
113 unsigned int tile_nr = tile_nr_y * 16 + tile_nr_x;
116 int xofs = (x % tilewidth_in_pixels) * bufdepth;
117 int ofs = 512 * y + xofs;
119 uint32_t tileptr = 0;
122 case 0: tileptr = d->
re_tlb_a[tile_nr] << 16;
124 case 1: tileptr = d->
re_tlb_b[tile_nr] << 16;
126 case 2: tileptr = d->
re_tlb_c[tile_nr] << 16;
128 case 4: tile_nr = x >> 12;
131 tileptr = 0x80000000 | (d->
re_linear_a[tile_nr] << 12);
136 default:
fatal(
"unimplemented dst_mode %i for horrible_getputpixel (%s), x=%i y=%i\n",
137 mode, put ?
"put" :
"get", x, y);
144 if (!(tileptr & 0x80000000)) {
151 tileptr &= ~0x80000000;
155 switch (color_mode) {
160 buf[0] = *color >> 24;
161 buf[1] = *color >> 16;
162 buf[2] = *color >> 8;
166 buf[0] = *color >> 24;
167 buf[1] = *color >> 16;
168 buf[2] = *color >> 8;
173 buf[1] = *color >> 8;
174 buf[2] = *color >> 16;
175 buf[3] = *color >> 24;
177 default:buf[0] = random();
182 fatal(
"[ put: color mode = 0x%x ]\n", color_mode);
191 switch (color_mode) {
196 *color = (buf[1] << 24) + (buf[2] << 16) + (buf[3] << 8);
199 *color = (buf[0] << 24) + (buf[1] << 16) + (buf[2] << 8) + buf[3];
202 *color = (buf[3] << 24) + (buf[2] << 16) + (buf[1] << 8) + buf[0];
205 *color = (buf[3] << 24) + (buf[2] << 16) + (buf[1] << 8) + buf[0];
206 fatal(
"[ get: color mode = 0x%x ]\n", color_mode);
219 uint64_t idata = 0, odata = 0;
223 relative_addr += 0x1000;
227 fatal(
"TODO: unimplemented len=%i for CRIME_RE_TLB_A\n", len);
232 int tlbi = ((relative_addr & 0x1ff) >> 1) & 0xff;
233 for (
size_t hwi = 0; hwi < len; hwi +=
sizeof(uint16_t)) {
235 debug(
"d->re_tlb_a[%i] = 0x%04x\n", tlbi, d->
re_tlb_a[tlbi]);
239 fatal(
"TODO: read from CRIME_RE_TLB_A\n");
244 fatal(
"TODO: unimplemented len=%i for CRIME_RE_TLB_B\n", len);
249 int tlbi = ((relative_addr & 0x1ff) >> 1) & 0xff;
250 for (
size_t hwi = 0; hwi < len; hwi +=
sizeof(uint16_t)) {
252 debug(
"d->re_tlb_b[%i] = 0x%04x\n", tlbi, d->
re_tlb_b[tlbi]);
256 fatal(
"TODO: read from CRIME_RE_TLB_B\n");
261 fatal(
"TODO: unimplemented len=%i for CRIME_RE_TLB_C\n", len);
266 int tlbi = ((relative_addr & 0x1ff) >> 1) & 0xff;
267 for (
size_t hwi = 0; hwi < len; hwi +=
sizeof(uint16_t)) {
269 debug(
"d->re_tlb_c[%i] = 0x%04x\n", tlbi, d->
re_tlb_c[tlbi]);
273 fatal(
"TODO: read from CRIME_RE_TLB_C\n");
278 fatal(
"TODO: unimplemented len=%i for CRIME_RE_TEX\n", len);
283 int tlbi = ((relative_addr & 0xff) >> 3) & 0xff;
284 for (
size_t hwi = 0; hwi < len; hwi +=
sizeof(uint16_t)) {
286 debug(
"d->re_tex[%i] = 0x%04x\n", tlbi, d->
re_tex[tlbi]);
290 fatal(
"TODO: read from CRIME_RE_TEX\n");
295 fatal(
"TODO: unimplemented len=%i for CRIME_RE_LINEAR_A\n", len);
334 int tlbi = ((relative_addr & 0x7f) >> 2) & 0x1f;
337 debug(
"[ d->re_linear_a[%i] = 0x%08x, [%i] = 0x%08x ]\n",
340 fatal(
"TODO: read from CRIME_RE_LINEAR_A\n");
345 fatal(
"TODO: unimplemented len=%i for CRIME_RE_LINEAR_B\n", len);
350 int tlbi = ((relative_addr & 0x7f) >> 2) & 0x1f;
353 debug(
"[ d->re_linear_b[%i] = 0x%08x, [%i] = 0x%08x ]\n",
356 fatal(
"TODO: read from CRIME_RE_LINEAR_B\n");
361 fatal(
"[ sgi_re: unimplemented write to "
362 "address 0x%llx, data=0x%016llx ]\n",
363 (
long long)relative_addr, (
long long)idata);
365 fatal(
"[ sgi_re: unimplemented read from address"
366 " 0x%llx ]\n", (
long long)relative_addr);
417 pattern >>= nr_of_bits_to_strip_to_the_right;
418 pattern <<= nr_of_bits_to_strip_to_the_right;
419 pattern <<= nr_of_bits_to_strip_to_the_left;
421 int nr_of_bits_in_the_middle = 32 - nr_of_bits_to_strip_to_the_left - nr_of_bits_to_strip_to_the_right;
423 if (stipple_mode & 0xe0e0ffff)
424 fatal(
"[ sgi_de: UNIMPLEMENTED stipple_mode bits: 0x%08x ]\n", stipple_mode);
432 debug(
"[ sgi_de: STARTING DRAWING COMMAND: op = 0x%08x,"
433 " drawmode=0x%x src_mode=0x%x dst_mode=0x%x x1=%i y1=%i"
434 " x2=%i y2=%i fg=0x%x bg=0x%x pattern=0x%08x ]\n",
435 op, drawmode, src_mode, dst_mode, x1, y1, x2, y2, fg, bg, pattern);
439 int src_bufdepth = 1 << ((src_mode >> 8) & 3);
441 bool src_is_linear =
false;
442 int src_x = -1, src_y = -1;
452 src_is_linear = ((src_mode & 0x00001c00) >> 10) > 3;
458 src_x = (addr_src >> 16) & 0x7ff;
459 src_y = addr_src & 0x7ff;
462 if (step_x != src_bufdepth || (step_y != 0 && step_y != 1)) {
463 fatal(
"[ sgi_de: unimplemented XFER addr_src=0x%x src_bufdepth=%i "
464 "strd_src=0x%x step_x=0x%x step_y=0x%x "
465 "addr_dst=0x%x strd_dst=0x%x ]\n",
466 addr_src, src_bufdepth, strd_src, step_x, step_y, addr_dst, strd_dst);
473 printf(
"!DE_DRAWMODE_PLANEMASK: TODO\n");
477 printf(
"not all DE_DRAWMODE_BYTEMASK set: TODO\n");
485 uint16_t saved_src_x = src_x;
496 uint16_t endx = (x2 + dx) & 0x7ff;
497 uint16_t endy = (y2 + dy) & 0x7ff;
499 int lx = abs((
int)(x2 - x1)), ly = abs((
int)(y2 - y1));
500 int linelen = lx > ly ? lx : ly;
502 switch (
op & 0xff000000) {
505 fatal(
"[ sgi_de: XFER_EN for LINE op? ]\n");
515 x = (x2 * i + x1 * (linelen-i)) / linelen;
516 y = (y2 * i + y1 * (linelen-i)) / linelen;
519 uint32_t oldcolor = fg;
523 x, y, &oldcolor, dst_mode);
528 color = (pattern & 0x80000000UL) ? fg : bg;
530 draw = (pattern & 0x80000000UL)?
true :
false;
542 color = oldcolor ^ color;
545 color = 0xffffffff - oldcolor;
548 static char rop_used[256];
549 static bool first =
true;
552 memset(rop_used, 0,
sizeof(rop_used));
555 if (!rop_used[rop & 255]) {
556 rop_used[rop & 255] = 1;
557 fatal(
"[ sgi_de: LINE: rop[0x%02x] used! ]\n", rop & 255);
561 fatal(
"[ sgi_de: LINE: rop > 255: 0x%08x ]\n", rop);
569 x, y, &color, dst_mode);
572 pattern = (pattern << 1) | (pattern >> (nr_of_bits_in_the_middle-1));
577 for (y = y1; y != endy; y = (y + dy) & 0x7ff) {
579 for (x = x1; x != endx; x = (x + dx) & 0x7ff) {
581 uint32_t oldcolor = fg;
585 x, y, &oldcolor, dst_mode);
591 src_x, src_y, &color, src_mode);
596 color = (pattern & 0x80000000UL) ? fg : bg;
598 draw = (pattern & 0x80000000UL)?
true :
false;
610 color = oldcolor ^ color;
613 color = 0xffffffff - oldcolor;
616 static char rop_used[256];
617 static bool first =
true;
620 memset(rop_used, 0,
sizeof(rop_used));
623 if (!rop_used[rop & 255]) {
624 rop_used[rop & 255] = 1;
625 fatal(
"[ sgi_de: RECT: rop[0x%02x] used! ]\n", rop & 255);
629 fatal(
"[ sgi_de: RECT: rop > 255: 0x%08x ]\n", rop);
637 x, y, &color, dst_mode);
640 pattern = (pattern << 1) | (pattern >> (nr_of_bits_in_the_middle-1));
645 src_x = (src_x + dx) & 0x7ff;
648 src_y = (src_y + dy) & 0x7ff;
652 default:
fatal(
"[ sgi_de: UNIMPLEMENTED drawing op = 0x%08x,"
653 " x1=%i y1=%i x2=%i y2=%i fg=0x%x bg=0x%x pattern=0x%08x ]\n",
654 op, x1, y1, x2, y2, fg, bg, pattern);
662 uint64_t idata = 0, odata = 0;
669 regnr = relative_addr /
sizeof(uint32_t);
671 relative_addr += 0x2000;
680 d->
de_reg[regnr] = idata >> 32ULL;
681 d->
de_reg[regnr+1] = idata;
683 odata = ((uint64_t)d->
de_reg[regnr] << 32ULL) +
685 }
else if (len == 4) {
691 fatal(
"sgi_de: len = %i not implemented\n", len);
695 switch (relative_addr) {
698 debug(
"[ sgi_de: %s CRIME_DE_MODE_SRC: 0x%016llx ]\n",
699 writeflag ==
MEM_WRITE ?
"write to" :
"read from",
700 writeflag ==
MEM_WRITE ? (
long long)idata : (
long long)odata);
704 debug(
"[ sgi_de: %s CRIME_DE_MODE_DST: 0x%016llx ]\n",
705 writeflag ==
MEM_WRITE ?
"write to" :
"read from",
706 writeflag ==
MEM_WRITE ? (
long long)idata : (
long long)odata);
710 debug(
"[ sgi_de: %s CRIME_DE_CLIPMODE: 0x%016llx ]\n",
711 writeflag ==
MEM_WRITE ?
"write to" :
"read from",
712 writeflag ==
MEM_WRITE ? (
long long)idata : (
long long)odata);
713 if (writeflag ==
MEM_WRITE && idata != 0)
714 fatal(
"[ sgi_de: TODO: non-zero CRIME_DE_CLIPMODE: 0x%016llx ]\n", idata);
718 debug(
"[ sgi_de: %s CRIME_DE_DRAWMODE: 0x%016llx ]\n",
719 writeflag ==
MEM_WRITE ?
"write to" :
"read from",
720 writeflag ==
MEM_WRITE ? (
long long)idata : (
long long)odata);
724 debug(
"[ sgi_de: %s CRIME_DE_SCRMASK0: 0x%016llx ]\n",
725 writeflag ==
MEM_WRITE ?
"write to" :
"read from",
726 writeflag ==
MEM_WRITE ? (
long long)idata : (
long long)odata);
727 if (writeflag ==
MEM_WRITE && idata != 0)
728 fatal(
"[ sgi_de: TODO: non-zero CRIME_DE_SCRMASK0: 0x%016llx ]\n", idata);
732 debug(
"[ sgi_de: %s CRIME_DE_SCRMASK1: 0x%016llx ]\n",
733 writeflag ==
MEM_WRITE ?
"write to" :
"read from",
734 writeflag ==
MEM_WRITE ? (
long long)idata : (
long long)odata);
735 if (writeflag ==
MEM_WRITE && idata != 0)
736 fatal(
"[ sgi_de: TODO: non-zero CRIME_DE_SCRMASK1: 0x%016llx ]\n", idata);
740 debug(
"[ sgi_de: %s CRIME_DE_SCRMASK2: 0x%016llx ]\n",
741 writeflag ==
MEM_WRITE ?
"write to" :
"read from",
742 writeflag ==
MEM_WRITE ? (
long long)idata : (
long long)odata);
743 if (writeflag ==
MEM_WRITE && idata != 0)
744 fatal(
"[ sgi_de: TODO: non-zero CRIME_DE_SCRMASK2: 0x%016llx ]\n", idata);
748 debug(
"[ sgi_de: %s CRIME_DE_SCRMASK3: 0x%016llx ]\n",
749 writeflag ==
MEM_WRITE ?
"write to" :
"read from",
750 writeflag ==
MEM_WRITE ? (
long long)idata : (
long long)odata);
751 if (writeflag ==
MEM_WRITE && idata != 0)
752 fatal(
"[ sgi_de: TODO: non-zero CRIME_DE_SCRMASK3: 0x%016llx ]\n", idata);
756 debug(
"[ sgi_de: %s CRIME_DE_SCRMASK4: 0x%016llx ]\n",
757 writeflag ==
MEM_WRITE ?
"write to" :
"read from",
758 writeflag ==
MEM_WRITE ? (
long long)idata : (
long long)odata);
759 if (writeflag ==
MEM_WRITE && idata != 0)
760 fatal(
"[ sgi_de: TODO: non-zero CRIME_DE_SCRMASK4: 0x%016llx ]\n", idata);
764 debug(
"[ sgi_de: %s CRIME_DE_SCISSOR: 0x%016llx ]\n",
765 writeflag ==
MEM_WRITE ?
"write to" :
"read from",
766 writeflag ==
MEM_WRITE ? (
long long)idata : (
long long)odata);
767 if (writeflag ==
MEM_WRITE && idata != 0)
768 fatal(
"[ sgi_de: TODO: non-zero CRIME_DE_SCISSOR: 0x%016llx ]\n", idata);
773 debug(
"[ sgi_de: %s CRIME_DE_SCISSOR+4: 0x%016llx ]\n",
774 writeflag ==
MEM_WRITE ?
"write to" :
"read from",
775 writeflag ==
MEM_WRITE ? (
long long)idata : (
long long)odata);
776 if (writeflag ==
MEM_WRITE && idata != 0x3fff3fff)
777 fatal(
"[ sgi_de: TODO: CRIME_DE_SCISSOR+4: 0x%016llx ]\n", idata);
781 debug(
"[ sgi_de: %s CRIME_DE_PRIMITIVE: 0x%016llx ]\n",
782 writeflag ==
MEM_WRITE ?
"write to" :
"read from",
783 writeflag ==
MEM_WRITE ? (
long long)idata : (
long long)odata);
787 debug(
"[ sgi_de: %s CRIME_DE_WINOFFSET_SRC: 0x%016llx ]\n",
788 writeflag ==
MEM_WRITE ?
"write to" :
"read from",
789 writeflag ==
MEM_WRITE ? (
long long)idata : (
long long)odata);
790 if (writeflag ==
MEM_WRITE && idata != 0)
791 fatal(
"[ sgi_de: TODO: non-zero CRIME_DE_WINOFFSET_SRC: 0x%016llx ]\n", idata);
795 debug(
"[ sgi_de: %s CRIME_DE_WINOFFSET_DST: 0x%016llx ]\n",
796 writeflag ==
MEM_WRITE ?
"write to" :
"read from",
797 writeflag ==
MEM_WRITE ? (
long long)idata : (
long long)odata);
798 if (writeflag ==
MEM_WRITE && idata != 0)
799 fatal(
"[ sgi_de: TODO: non-zero CRIME_DE_WINOFFSET_DST: 0x%016llx ]\n", idata);
803 debug(
"[ sgi_de: %s CRIME_DE_X_VERTEX_0: 0x%016llx ]\n",
804 writeflag ==
MEM_WRITE ?
"write to" :
"read from",
805 writeflag ==
MEM_WRITE ? (
long long)idata : (
long long)odata);
809 debug(
"[ sgi_de: %s CRIME_DE_X_VERTEX_1: 0x%016llx ]\n",
810 writeflag ==
MEM_WRITE ?
"write to" :
"read from",
811 writeflag ==
MEM_WRITE ? (
long long)idata : (
long long)odata);
815 debug(
"[ sgi_de: %s CRIME_DE_XFER_ADDR_SRC: 0x%016llx ]\n",
816 writeflag ==
MEM_WRITE ?
"write to" :
"read from",
817 writeflag ==
MEM_WRITE ? (
long long)idata : (
long long)odata);
821 debug(
"[ sgi_de: %s CRIME_DE_XFER_STRD_SRC: 0x%016llx ]\n",
822 writeflag ==
MEM_WRITE ?
"write to" :
"read from",
823 writeflag ==
MEM_WRITE ? (
long long)idata : (
long long)odata);
827 debug(
"[ sgi_de: %s CRIME_DE_XFER_STEP_X: 0x%016llx ]\n",
828 writeflag ==
MEM_WRITE ?
"write to" :
"read from",
829 writeflag ==
MEM_WRITE ? (
long long)idata : (
long long)odata);
833 debug(
"[ sgi_de: %s CRIME_DE_XFER_STEP_Y: 0x%016llx ]\n",
834 writeflag ==
MEM_WRITE ?
"write to" :
"read from",
835 writeflag ==
MEM_WRITE ? (
long long)idata : (
long long)odata);
839 debug(
"[ sgi_de: %s CRIME_DE_XFER_ADDR_DST: 0x%016llx ]\n",
840 writeflag ==
MEM_WRITE ?
"write to" :
"read from",
841 writeflag ==
MEM_WRITE ? (
long long)idata : (
long long)odata);
845 debug(
"[ sgi_de: %s CRIME_DE_XFER_STRD_DST: 0x%016llx ]\n",
846 writeflag ==
MEM_WRITE ?
"write to" :
"read from",
847 writeflag ==
MEM_WRITE ? (
long long)idata : (
long long)odata);
851 debug(
"[ sgi_de: %s CRIME_DE_STIPPLE_MODE: 0x%016llx ]\n",
852 writeflag ==
MEM_WRITE ?
"write to" :
"read from",
853 writeflag ==
MEM_WRITE ? (
long long)idata : (
long long)odata);
857 debug(
"[ sgi_de: %s CRIME_DE_STIPPLE_PAT: 0x%016llx ]\n",
858 writeflag ==
MEM_WRITE ?
"write to" :
"read from",
859 writeflag ==
MEM_WRITE ? (
long long)idata : (
long long)odata);
863 debug(
"[ sgi_de: %s CRIME_DE_FG: 0x%016llx ]\n",
864 writeflag ==
MEM_WRITE ?
"write to" :
"read from",
865 writeflag ==
MEM_WRITE ? (
long long)idata : (
long long)odata);
869 debug(
"[ sgi_de: %s CRIME_DE_BG: 0x%016llx ]\n",
870 writeflag ==
MEM_WRITE ?
"write to" :
"read from",
871 writeflag ==
MEM_WRITE ? (
long long)idata : (
long long)odata);
875 debug(
"[ sgi_de: %s CRIME_DE_ROP: 0x%016llx ]\n",
876 writeflag ==
MEM_WRITE ?
"write to" :
"read from",
877 writeflag ==
MEM_WRITE ? (
long long)idata : (
long long)odata);
881 debug(
"[ sgi_de: %s CRIME_DE_PLANEMASK: 0x%016llx ]\n",
882 writeflag ==
MEM_WRITE ?
"write to" :
"read from",
883 writeflag ==
MEM_WRITE ? (
long long)idata : (
long long)odata);
887 debug(
"[ sgi_de: %s CRIME_DE_NULL: 0x%016llx ]\n",
888 writeflag ==
MEM_WRITE ?
"write to" :
"read from",
889 writeflag ==
MEM_WRITE ? (
long long)idata : (
long long)odata);
893 debug(
"[ sgi_de: %s CRIME_DE_FLUSH: 0x%016llx ]\n",
894 writeflag ==
MEM_WRITE ?
"write to" :
"read from",
895 writeflag ==
MEM_WRITE ? (
long long)idata : (
long long)odata);
900 fatal(
"[ sgi_de: unimplemented write to "
901 "address 0x%llx, data=0x%016llx ]\n",
902 (
long long)relative_addr, (
long long)idata);
904 fatal(
"[ sgi_de: unimplemented read from address"
905 " 0x%llx ]\n", (
long long)relative_addr);
947 uint32_t dstlen = dst1 - dst0 + 1, fill_addr;
948 unsigned char zerobuf[4096];
954 debug(
"[ sgi_mte: STARTING: mode=0x%08x src0=0x%08x src1=0x%08x src_y_step=%i dst0=0x%08x,"
955 " dst1=0x%08x dst_y_step=%i bg=0x%x bytemask=0x%x ]\n",
957 src0, src1, src_y_step,
958 dst0, dst1, dst_y_step,
961 if (dst_y_step != 0 && dst_y_step != 1 && dst_y_step != -1) {
962 fatal(
"[ sgi_mte: TODO! unimplemented dst_y_step %i ]", dst_y_step);
967 fatal(
"[ sgi_mte: unimplemented MTE_MODE_STIPPLE ]");
975 fatal(
"[ sgi_mte: unimplemented SRC ]");
986 int x1 = (dst0 >> 16) & 0xfff;
987 int y1 = dst0 & 0xfff;
988 int x2 = (dst1 >> 16) & 0xfff;
989 int y2 = dst1 & 0xfff;
993 int src_x1 = (src0 >> 16) & 0xfff;
994 int src_y1 = src0 & 0xfff;
997 src_x1 /= (depth / 8);
1000 int dx = x1 > x2 ? -1 : 1;
1001 int dy = y1 > y2 ? -1 : 1;
1015 for (
int y = y1; y != y2+dy; y += dy) {
1018 for (
int x = x1; x != x2+dx; x += dx) {
1021 src_x, src_y, &bg, src_mode);
1036 fatal(
"[ sgi_mte: unimplemented MTE_MODE_COPY ]");
1041 fatal(
"[ sgi_mte: unimplemented MTE_DEPTH_x ]");
1045 debug(
"[ sgi_mte: LINEAR TRANSFER: mode=0x%08x dst0=0x%016llx,"
1046 " dst1=0x%016llx (length 0x%llx), dst_y_step=%i bg=0x%x, bytemask=0x%x ]\n",
1048 (
long long)dst0, (
long long)dst1,
1049 (
long long)dstlen, dst_y_step, (
int)bg, (
int)bytemask);
1051 if (bytemask != 0xffffffff) {
1052 fatal(
"unimplemented MTE bytemask 0x%08x\n", (
int)bytemask);
1092 memset(zerobuf, bg, dstlen <
sizeof(zerobuf) ? dstlen :
sizeof(zerobuf));
1094 while (dstlen != 0) {
1096 if (dstlen >
sizeof(zerobuf))
1097 fill_len =
sizeof(zerobuf);
1101 uint64_t starting_page = fill_addr & ~0xfff;
1102 uint64_t ending_page = (fill_addr + fill_len - 1) & ~0xfff;
1103 if (starting_page != ending_page) {
1104 fill_len = starting_page + 4096 - fill_addr;
1108 starting_page >>= 12;
1111 for (
int i = 0; i < 32; ++i) {
1112 uint32_t entry = tlb[i];
1113 if (entry & 0x80000000) {
1114 entry &= ~0x80000000;
1115 if (entry == starting_page) {
1126 debug(
"[ sgi_mte: WARNING: address 0x%x not found in TLB? Ignoring fill. ]\n",
1127 (
long long)fill_addr);
1130 fill_addr += fill_len;
1131 dstlen -=
sizeof(zerobuf);
1135 fatal(
"[ sgi_mte: TODO! unimplemented dst_tlb 0x%x ]", dst_tlb);
1142 uint64_t idata = 0, odata = 0;
1149 regnr = relative_addr /
sizeof(uint32_t);
1151 relative_addr += 0x3000;
1165 }
else if (len != 4) {
1167 d->
mte_reg[regnr+1] = idata >> 32;
1170 odata = ((uint64_t)d->
mte_reg[regnr+1] << 32) +
1174 fatal(
"[ sgi_mte: UNIMPLEMENTED read/write len %i ]\n", len);
1178 switch (relative_addr) {
1181 debug(
"[ sgi_mte: %s CRIME_MTE_MODE: 0x%016llx ]\n",
1182 writeflag ==
MEM_WRITE ?
"write to" :
"read from",
1183 writeflag ==
MEM_WRITE ? (
long long)idata : (
long long)odata);
1187 debug(
"[ sgi_mte: %s CRIME_MTE_BYTEMASK: 0x%016llx ]\n",
1188 writeflag ==
MEM_WRITE ?
"write to" :
"read from",
1189 writeflag ==
MEM_WRITE ? (
long long)idata : (
long long)odata);
1193 fatal(
"[ sgi_mte: %s CRIME_MTE_STIPPLEMASK: 0x%016llx ]\n",
1194 writeflag ==
MEM_WRITE ?
"write to" :
"read from",
1195 writeflag ==
MEM_WRITE ? (
long long)idata : (
long long)odata);
1199 debug(
"[ sgi_mte: %s CRIME_MTE_BG: 0x%016llx ]\n",
1200 writeflag ==
MEM_WRITE ?
"write to" :
"read from",
1201 writeflag ==
MEM_WRITE ? (
long long)idata : (
long long)odata);
1205 debug(
"[ sgi_mte: %s CRIME_MTE_SRC0: 0x%016llx ]\n",
1206 writeflag ==
MEM_WRITE ?
"write to" :
"read from",
1207 writeflag ==
MEM_WRITE ? (
long long)idata : (
long long)odata);
1211 debug(
"[ sgi_mte: %s CRIME_MTE_SRC1: 0x%016llx ]\n",
1212 writeflag ==
MEM_WRITE ?
"write to" :
"read from",
1213 writeflag ==
MEM_WRITE ? (
long long)idata : (
long long)odata);
1217 debug(
"[ sgi_mte: %s CRIME_MTE_DST0: 0x%016llx ]\n",
1218 writeflag ==
MEM_WRITE ?
"write to" :
"read from",
1219 writeflag ==
MEM_WRITE ? (
long long)idata : (
long long)odata);
1223 debug(
"[ sgi_mte: %s CRIME_MTE_DST1: 0x%016llx ]\n",
1224 writeflag ==
MEM_WRITE ?
"write to" :
"read from",
1225 writeflag ==
MEM_WRITE ? (
long long)idata : (
long long)odata);
1229 debug(
"[ sgi_mte: %s CRIME_MTE_SRC_Y_STEP: 0x%016llx ]\n",
1230 writeflag ==
MEM_WRITE ?
"write to" :
"read from",
1231 writeflag ==
MEM_WRITE ? (
long long)idata : (
long long)odata);
1235 debug(
"[ sgi_mte: %s CRIME_MTE_DST_Y_STEP: 0x%016llx ]\n",
1236 writeflag ==
MEM_WRITE ?
"write to" :
"read from",
1237 writeflag ==
MEM_WRITE ? (
long long)idata : (
long long)odata);
1241 fatal(
"[ sgi_mte: %s CRIME_MTE_NULL: 0x%016llx ]\n",
1242 writeflag ==
MEM_WRITE ?
"write to" :
"read from",
1243 writeflag ==
MEM_WRITE ? (
long long)idata : (
long long)odata);
1247 fatal(
"[ sgi_mte: %s CRIME_MTE_FLUSH: 0x%016llx ]\n",
1248 writeflag ==
MEM_WRITE ?
"write to" :
"read from",
1249 writeflag ==
MEM_WRITE ? (
long long)idata : (
long long)odata);
1254 fatal(
"[ sgi_mte: unimplemented write to "
1255 "address 0x%llx, data=0x%016llx ]\n",
1256 (
long long)relative_addr, (
long long)idata);
1258 fatal(
"[ sgi_mte: unimplemented read from address"
1259 " 0x%llx ]\n", (
long long)relative_addr);
1278 dev_sgi_mte_access, (
void *)d,
DM_DEFAULT, NULL);
1291 uint64_t idata = 0, odata = 0;
1295 relative_addr += 0x4000;
1297 switch (relative_addr) {
1316 debug(
"[ sgi_de_status: unimplemented write to "
1317 "address 0x%llx, data=0x%016llx ]\n",
1318 (
long long)relative_addr, (
long long)idata);
1320 debug(
"[ sgi_de_status: unimplemented read from address"
1321 " 0x%llx ]\n", (
long long)relative_addr);
1337 dev_sgi_de_status_access, (
void *)d,
DM_DEFAULT, NULL);