|
|
1.1 root 1: /* byte_sex.c */
2: #include <mach-o/fat.h>
3: #include <mach-o/loader.h>
4: #import <mach/m68k/thread_status.h>
5: #import <mach/m98k/thread_status.h>
6: #import <mach/m88k/thread_status.h>
7: #import <mach/i860/thread_status.h>
8: #import <mach/i386/thread_status.h>
9: #import <mach/hppa/thread_status.h>
10: #import <mach/sparc/thread_status.h>
11: #include <mach-o/nlist.h>
12: #include <mach-o/reloc.h>
13: #include <bsd/ranlib.h>
14: #include "stuff/bool.h"
15: #include "stuff/bytesex.h"
16:
17: double
18: SWAP_DOUBLE(
19: double d)
20: {
21: union {
22: char c[8];
23: double d;
24: } in, out;
25: in.d = d;
26: out.c[0] = in.c[7];
27: out.c[1] = in.c[6];
28: out.c[2] = in.c[5];
29: out.c[3] = in.c[4];
30: out.c[4] = in.c[3];
31: out.c[5] = in.c[2];
32: out.c[6] = in.c[1];
33: out.c[7] = in.c[0];
34: return(out.d);
35: }
36:
37: float
38: SWAP_FLOAT(
39: float f)
40: {
41: union {
42: char c[7];
43: float f;
44: } in, out;
45: in.f = f;
46: out.c[0] = in.c[3];
47: out.c[1] = in.c[2];
48: out.c[2] = in.c[1];
49: out.c[3] = in.c[0];
50: return(out.f);
51: }
52:
53: /*
54: * get_host_byte_sex() returns the enum constant for the byte sex of the host
55: * it is running on.
56: */
57: enum byte_sex
58: get_host_byte_sex(
59: void)
60: {
61: unsigned long s;
62:
63: s = (BIG_ENDIAN_BYTE_SEX << 24) | LITTLE_ENDIAN_BYTE_SEX;
64: return((enum byte_sex)*((char *)&s));
65: }
66:
67: void
68: swap_fat_header(
69: struct fat_header *fat_header,
70: enum byte_sex target_byte_sex)
71: {
72: fat_header->magic = SWAP_LONG(fat_header->magic);
73: fat_header->nfat_arch = SWAP_LONG(fat_header->nfat_arch);
74: }
75:
76: void
77: swap_fat_arch(
78: struct fat_arch *fat_archs,
79: unsigned long nfat_arch,
80: enum byte_sex target_byte_sex)
81: {
82: unsigned long i;
83:
84: for(i = 0; i < nfat_arch; i++){
85: fat_archs[i].cputype = SWAP_LONG(fat_archs[i].cputype);
86: fat_archs[i].cpusubtype = SWAP_LONG(fat_archs[i].cpusubtype);
87: fat_archs[i].offset = SWAP_LONG(fat_archs[i].offset);
88: fat_archs[i].size = SWAP_LONG(fat_archs[i].size);
89: fat_archs[i].align = SWAP_LONG(fat_archs[i].align);
90: }
91: }
92:
93: void
94: swap_mach_header(
95: struct mach_header *mh,
96: enum byte_sex target_byte_sex)
97: {
98: mh->magic = SWAP_LONG(mh->magic);
99: mh->cputype = SWAP_LONG(mh->cputype);
100: mh->cpusubtype = SWAP_LONG(mh->cpusubtype);
101: mh->filetype = SWAP_LONG(mh->filetype);
102: mh->ncmds = SWAP_LONG(mh->ncmds);
103: mh->sizeofcmds = SWAP_LONG(mh->sizeofcmds);
104: mh->flags = SWAP_LONG(mh->flags);
105: }
106:
107: void
108: swap_load_command(
109: struct load_command *lc,
110: enum byte_sex target_byte_sex)
111: {
112: lc->cmd = SWAP_LONG(lc->cmd);
113: lc->cmdsize = SWAP_LONG(lc->cmdsize);
114: }
115:
116: void
117: swap_segment_command(
118: struct segment_command *sg,
119: enum byte_sex target_byte_sex)
120: {
121: /* segname[16] */
122: sg->cmd = SWAP_LONG(sg->cmd);
123: sg->cmdsize = SWAP_LONG(sg->cmdsize);
124: sg->vmaddr = SWAP_LONG(sg->vmaddr);
125: sg->vmsize = SWAP_LONG(sg->vmsize);
126: sg->fileoff = SWAP_LONG(sg->fileoff);
127: sg->filesize = SWAP_LONG(sg->filesize);
128: sg->maxprot = SWAP_LONG(sg->maxprot);
129: sg->initprot = SWAP_LONG(sg->initprot);
130: sg->nsects = SWAP_LONG(sg->nsects);
131: sg->flags = SWAP_LONG(sg->flags);
132: }
133:
134: void
135: swap_section(
136: struct section *s,
137: unsigned long nsects,
138: enum byte_sex target_byte_sex)
139: {
140: unsigned long i;
141:
142: for(i = 0; i < nsects; i++){
143: /* sectname[16] */
144: /* segname[16] */
145: s[i].addr = SWAP_LONG(s[i].addr);
146: s[i].size = SWAP_LONG(s[i].size);
147: s[i].offset = SWAP_LONG(s[i].offset);
148: s[i].align = SWAP_LONG(s[i].align);
149: s[i].reloff = SWAP_LONG(s[i].reloff);
150: s[i].nreloc = SWAP_LONG(s[i].nreloc);
151: s[i].flags = SWAP_LONG(s[i].flags);
152: s[i].reserved1 = SWAP_LONG(s[i].reserved1);
153: s[i].reserved2 = SWAP_LONG(s[i].reserved2);
154: }
155: }
156:
157: void
158: swap_symtab_command(
159: struct symtab_command *st,
160: enum byte_sex target_byte_sex)
161: {
162: st->cmd = SWAP_LONG(st->cmd);
163: st->cmdsize = SWAP_LONG(st->cmdsize);
164: st->symoff = SWAP_LONG(st->symoff);
165: st->nsyms = SWAP_LONG(st->nsyms);
166: st->stroff = SWAP_LONG(st->stroff);
167: st->strsize = SWAP_LONG(st->strsize);
168: }
169:
170: void
171: swap_dysymtab_command(
172: struct dysymtab_command *dyst,
173: enum byte_sex target_byte_sex)
174: {
175: dyst->cmd = SWAP_LONG(dyst->cmd);
176: dyst->cmdsize = SWAP_LONG(dyst->cmdsize);
177: dyst->ilocalsym = SWAP_LONG(dyst->ilocalsym);
178: dyst->nlocalsym = SWAP_LONG(dyst->nlocalsym);
179: dyst->iextdefsym = SWAP_LONG(dyst->iextdefsym);
180: dyst->nextdefsym = SWAP_LONG(dyst->nextdefsym);
181: dyst->iundefsym = SWAP_LONG(dyst->iundefsym);
182: dyst->nundefsym = SWAP_LONG(dyst->nundefsym);
183: dyst->tocoff = SWAP_LONG(dyst->tocoff);
184: dyst->ntoc = SWAP_LONG(dyst->ntoc);
185: dyst->modtaboff = SWAP_LONG(dyst->modtaboff);
186: dyst->nmodtab = SWAP_LONG(dyst->nmodtab);
187: dyst->extrefsymoff = SWAP_LONG(dyst->extrefsymoff);
188: dyst->nextrefsyms = SWAP_LONG(dyst->nextrefsyms);
189: dyst->indirectsymoff = SWAP_LONG(dyst->indirectsymoff);
190: dyst->nindirectsyms = SWAP_LONG(dyst->nindirectsyms);
191: dyst->extreloff = SWAP_LONG(dyst->extreloff);
192: dyst->nextrel = SWAP_LONG(dyst->nextrel);
193: dyst->locreloff = SWAP_LONG(dyst->locreloff);
194: dyst->nlocrel = SWAP_LONG(dyst->nlocrel);
195: }
196:
197: void
198: swap_symseg_command(
199: struct symseg_command *ss,
200: enum byte_sex target_byte_sex)
201: {
202: ss->cmd = SWAP_LONG(ss->cmd);
203: ss->cmdsize = SWAP_LONG(ss->cmdsize);
204: ss->offset = SWAP_LONG(ss->offset);
205: ss->size = SWAP_LONG(ss->size);
206: }
207:
208: void
209: swap_fvmlib_command(
210: struct fvmlib_command *fl,
211: enum byte_sex target_byte_sex)
212: {
213: fl->cmd = SWAP_LONG(fl->cmd);
214: fl->cmdsize = SWAP_LONG(fl->cmdsize);
215: fl->fvmlib.name.offset = SWAP_LONG(fl->fvmlib.name.offset);
216: fl->fvmlib.minor_version = SWAP_LONG(fl->fvmlib.minor_version);
217: fl->fvmlib.header_addr = SWAP_LONG(fl->fvmlib.header_addr);
218: }
219:
220: void
221: swap_dylib_command(
222: struct dylib_command *dl,
223: enum byte_sex target_byte_sex)
224: {
225: dl->cmd = SWAP_LONG(dl->cmd);
226: dl->cmdsize = SWAP_LONG(dl->cmdsize);
227: dl->dylib.name.offset = SWAP_LONG(dl->dylib.name.offset);
228: dl->dylib.timestamp = SWAP_LONG(dl->dylib.timestamp);
229: dl->dylib.current_version = SWAP_LONG(dl->dylib.current_version);
230: dl->dylib.compatibility_version =
231: SWAP_LONG(dl->dylib.compatibility_version);
232: }
233:
234: void
235: swap_dylinker_command(
236: struct dylinker_command *dyld,
237: enum byte_sex target_byte_sex)
238: {
239: dyld->cmd = SWAP_LONG(dyld->cmd);
240: dyld->cmdsize = SWAP_LONG(dyld->cmdsize);
241: dyld->name.offset = SWAP_LONG(dyld->name.offset);
242: }
243:
244: void
245: swap_fvmfile_command(
246: struct fvmfile_command *ff,
247: enum byte_sex target_byte_sex)
248: {
249: ff->cmd = SWAP_LONG(ff->cmd);
250: ff->cmdsize = SWAP_LONG(ff->cmdsize);
251: ff->name.offset = SWAP_LONG(ff->name.offset);
252: ff->header_addr = SWAP_LONG(ff->header_addr);
253: }
254:
255:
256: void
257: swap_thread_command(
258: struct thread_command *ut,
259: enum byte_sex target_byte_sex)
260: {
261: ut->cmd = SWAP_LONG(ut->cmd);
262: ut->cmdsize = SWAP_LONG(ut->cmdsize);
263: }
264:
265: void
266: swap_m68k_thread_state_regs(
267: struct m68k_thread_state_regs *cpu,
268: enum byte_sex target_byte_sex)
269: {
270: unsigned long i;
271:
272: for(i = 0; i < 8; i++)
273: cpu->dreg[i] = SWAP_LONG(cpu->dreg[i]);
274: for(i = 0; i < 8; i++)
275: cpu->areg[i] = SWAP_LONG(cpu->areg[i]);
276: cpu->pad0 = SWAP_SHORT(cpu->pad0);
277: cpu->sr = SWAP_SHORT(cpu->sr);
278: cpu->pc = SWAP_LONG(cpu->pc);
279: }
280:
281: void
282: swap_m68k_thread_state_68882(
283: struct m68k_thread_state_68882 *fpu,
284: enum byte_sex target_byte_sex)
285: {
286: unsigned long i, tmp;
287:
288: for(i = 0; i < 8; i++){
289: tmp = SWAP_LONG(fpu->regs[i].fp[0]);
290: fpu->regs[i].fp[1] = SWAP_LONG(fpu->regs[i].fp[1]);
291: fpu->regs[i].fp[0] = SWAP_LONG(fpu->regs[i].fp[2]);
292: fpu->regs[i].fp[2] = tmp;
293: }
294: fpu->cr = SWAP_LONG(fpu->cr);
295: fpu->sr = SWAP_LONG(fpu->sr);
296: fpu->iar = SWAP_LONG(fpu->iar);
297: fpu->state = SWAP_LONG(fpu->state);
298: }
299:
300: void
301: swap_m68k_thread_state_user_reg(
302: struct m68k_thread_state_user_reg *user_reg,
303: enum byte_sex target_byte_sex)
304: {
305: user_reg->user_reg = SWAP_LONG(user_reg->user_reg);
306: }
307:
308: void
309: swap_m98k_thread_state_grf_t(
310: m98k_thread_state_grf_t *cpu,
311: enum byte_sex target_byte_sex)
312: {
313: enum byte_sex host_byte_sex;
314:
315: struct swapped_m98k_cr {
316: union {
317: struct {
318: unsigned rsvd:BITS_WIDTH(23,0);
319: unsigned ox:BIT_WIDTH(24);
320: unsigned vx:BIT_WIDTH(25);
321: unsigned fex:BIT_WIDTH(26);
322: unsigned fx:BIT_WIDTH(27);
323: unsigned so:BIT_WIDTH(28);
324: unsigned eq:BIT_WIDTH(29);
325: unsigned gt:BIT_WIDTH(30);
326: unsigned lt:BIT_WIDTH(31);
327: } fields;
328: unsigned long word;
329: } u;
330: } scr;
331: struct swapped_m98k_xer {
332: union {
333: struct {
334: unsigned byte_count:BITS_WIDTH(6,0);
335: unsigned rsvd2:BIT_WIDTH(7);
336: unsigned byte:BITS_WIDTH(15,8);
337: unsigned rsvd1:BITS_WIDTH(28,16);
338: unsigned ca:BIT_WIDTH(29);
339: unsigned ov:BIT_WIDTH(30);
340: unsigned so:BIT_WIDTH(31);
341: } fields;
342: unsigned long word;
343: } u;
344: } sxer;
345: struct swapped_m98k_msr {
346: union {
347: struct {
348: unsigned psfr:BIT_WIDTH(0);
349: unsigned rsvd2:BITS_WIDTH(3,1);
350: unsigned dr:BIT_WIDTH(4);
351: unsigned ir:BIT_WIDTH(5);
352: unsigned ip:BIT_WIDTH(6);
353: unsigned rsvd1:BIT_WIDTH(7);
354: unsigned fe1:BIT_WIDTH(8);
355: unsigned be:BIT_WIDTH(9);
356: unsigned se:BIT_WIDTH(10);
357: unsigned fe0:BIT_WIDTH(11);
358: unsigned me:BIT_WIDTH(12);
359: unsigned fp:BIT_WIDTH(13);
360: unsigned pr:BIT_WIDTH(14);
361: unsigned ee:BIT_WIDTH(15);
362: unsigned rsvd3:BITS_WIDTH(31,16);
363: } fields;
364: unsigned long word;
365: } u;
366: } smsr;
367:
368: host_byte_sex = get_host_byte_sex();
369:
370: cpu->r0 = SWAP_LONG(cpu->r0);
371: cpu->r1 = SWAP_LONG(cpu->r1);
372: cpu->r2 = SWAP_LONG(cpu->r2);
373: cpu->r3 = SWAP_LONG(cpu->r3);
374: cpu->r4 = SWAP_LONG(cpu->r4);
375: cpu->r5 = SWAP_LONG(cpu->r5);
376: cpu->r6 = SWAP_LONG(cpu->r6);
377: cpu->r7 = SWAP_LONG(cpu->r7);
378: cpu->r8 = SWAP_LONG(cpu->r8);
379: cpu->r9 = SWAP_LONG(cpu->r9);
380: cpu->r10 = SWAP_LONG(cpu->r10);
381: cpu->r11 = SWAP_LONG(cpu->r11);
382: cpu->r12 = SWAP_LONG(cpu->r12);
383: cpu->r13 = SWAP_LONG(cpu->r13);
384: cpu->r14 = SWAP_LONG(cpu->r14);
385: cpu->r15 = SWAP_LONG(cpu->r15);
386: cpu->r16 = SWAP_LONG(cpu->r16);
387: cpu->r17 = SWAP_LONG(cpu->r17);
388: cpu->r18 = SWAP_LONG(cpu->r18);
389: cpu->r19 = SWAP_LONG(cpu->r19);
390: cpu->r20 = SWAP_LONG(cpu->r20);
391: cpu->r21 = SWAP_LONG(cpu->r21);
392: cpu->r22 = SWAP_LONG(cpu->r22);
393: cpu->r23 = SWAP_LONG(cpu->r23);
394: cpu->r24 = SWAP_LONG(cpu->r24);
395: cpu->r25 = SWAP_LONG(cpu->r25);
396: cpu->r26 = SWAP_LONG(cpu->r26);
397: cpu->r27 = SWAP_LONG(cpu->r27);
398: cpu->r28 = SWAP_LONG(cpu->r28);
399: cpu->r29 = SWAP_LONG(cpu->r29);
400: cpu->r30 = SWAP_LONG(cpu->r30);
401: cpu->r31 = SWAP_LONG(cpu->r31);
402: cpu->lr = SWAP_LONG(cpu->lr);
403: cpu->ctr = SWAP_LONG(cpu->ctr);
404: cpu->cia = SWAP_LONG(cpu->cia);
405:
406: if(target_byte_sex == host_byte_sex){
407: memcpy(&scr, &(cpu->cr), sizeof(struct swapped_m98k_cr));
408: scr.u.word = SWAP_LONG(scr.u.word);
409: cpu->cr.lt = scr.u.fields.lt;
410: cpu->cr.gt = scr.u.fields.gt;
411: cpu->cr.eq = scr.u.fields.eq;
412: cpu->cr.so = scr.u.fields.so;
413: cpu->cr.fx = scr.u.fields.fx;
414: cpu->cr.fex = scr.u.fields.fex;
415: cpu->cr.vx = scr.u.fields.vx;
416: cpu->cr.ox = scr.u.fields.ox;
417: cpu->cr.rsvd = scr.u.fields.rsvd;
418:
419: memcpy(&sxer, &(cpu->xer), sizeof(struct swapped_m98k_xer));
420: sxer.u.word = SWAP_LONG(sxer.u.word);
421: cpu->xer.byte_count = sxer.u.fields.byte_count;
422: cpu->xer.rsvd2 = sxer.u.fields.rsvd2;
423: cpu->xer.byte = sxer.u.fields.byte;
424: cpu->xer.rsvd1 = sxer.u.fields.rsvd1;
425: cpu->xer.ca = sxer.u.fields.ca;
426: cpu->xer.ov = sxer.u.fields.ov;
427: cpu->xer.so = sxer.u.fields.so;
428:
429: memcpy(&smsr, &(cpu->msr), sizeof(struct swapped_m98k_msr));
430: smsr.u.word = SWAP_LONG(smsr.u.word);
431: cpu->msr.psfr = smsr.u.fields.psfr;
432: cpu->msr.rsvd2 = smsr.u.fields.rsvd2;
433: cpu->msr.dr = smsr.u.fields.dr;
434: cpu->msr.ir = smsr.u.fields.ir;
435: cpu->msr.ip = smsr.u.fields.ip;
436: cpu->msr.rsvd1 = smsr.u.fields.rsvd1;
437: cpu->msr.fe1 = smsr.u.fields.fe1;
438: cpu->msr.be = smsr.u.fields.be;
439: cpu->msr.se = smsr.u.fields.se;
440: cpu->msr.fe0 = smsr.u.fields.fe0;
441: cpu->msr.me = smsr.u.fields.me;
442: cpu->msr.fp = smsr.u.fields.fp;
443: cpu->msr.pr = smsr.u.fields.pr;
444: cpu->msr.ee = smsr.u.fields.ee;
445: cpu->msr.rsvd3 = smsr.u.fields.rsvd3;
446: }
447: else{
448: scr.u.fields.lt = cpu->cr.lt;
449: scr.u.fields.gt = cpu->cr.gt;
450: scr.u.fields.eq = cpu->cr.eq;
451: scr.u.fields.so = cpu->cr.so;
452: scr.u.fields.fx = cpu->cr.fx;
453: scr.u.fields.fex = cpu->cr.fex;
454: scr.u.fields.vx = cpu->cr.vx;
455: scr.u.fields.ox = cpu->cr.ox;
456: scr.u.fields.rsvd = cpu->cr.rsvd;
457: scr.u.word = SWAP_LONG(scr.u.word);
458: memcpy(&(cpu->cr), &scr, sizeof(struct swapped_m98k_cr));
459:
460: sxer.u.fields.byte_count = cpu->xer.byte_count;
461: sxer.u.fields.rsvd2 = cpu->xer.rsvd2;
462: sxer.u.fields.byte = cpu->xer.byte;
463: sxer.u.fields.rsvd1 = cpu->xer.rsvd1;
464: sxer.u.fields.ca = cpu->xer.ca;
465: sxer.u.fields.ov = cpu->xer.ov;
466: sxer.u.fields.so = cpu->xer.so;
467: sxer.u.word = SWAP_LONG(sxer.u.word);
468: memcpy(&(cpu->xer), &sxer, sizeof(struct swapped_m98k_xer));
469:
470: smsr.u.fields.psfr = cpu->msr.psfr;
471: smsr.u.fields.rsvd2 = cpu->msr.rsvd2;
472: smsr.u.fields.dr = cpu->msr.dr;
473: smsr.u.fields.ir = cpu->msr.ir;
474: smsr.u.fields.ip = cpu->msr.ip;
475: smsr.u.fields.rsvd1 = cpu->msr.rsvd1;
476: smsr.u.fields.fe1 = cpu->msr.fe1;
477: smsr.u.fields.be = cpu->msr.be;
478: smsr.u.fields.se = cpu->msr.se;
479: smsr.u.fields.fe0 = cpu->msr.fe0;
480: smsr.u.fields.me = cpu->msr.me;
481: smsr.u.fields.fp = cpu->msr.fp;
482: smsr.u.fields.pr = cpu->msr.pr;
483: smsr.u.fields.ee = cpu->msr.ee;
484: smsr.u.fields.rsvd3 = cpu->msr.rsvd3;
485: smsr.u.word = SWAP_LONG(smsr.u.word);
486: memcpy(&(cpu->msr), &smsr, sizeof(struct swapped_m98k_msr));
487: }
488: }
489:
490: void
491: swap_m88k_thread_state_grf_t(
492: m88k_thread_state_grf_t *cpu,
493: enum byte_sex target_byte_sex)
494: {
495: cpu->r1 = SWAP_LONG(cpu->r1);
496: cpu->r2 = SWAP_LONG(cpu->r2);
497: cpu->r3 = SWAP_LONG(cpu->r3);
498: cpu->r4 = SWAP_LONG(cpu->r4);
499: cpu->r5 = SWAP_LONG(cpu->r5);
500: cpu->r6 = SWAP_LONG(cpu->r6);
501: cpu->r7 = SWAP_LONG(cpu->r7);
502: cpu->r8 = SWAP_LONG(cpu->r8);
503: cpu->r9 = SWAP_LONG(cpu->r9);
504: cpu->r10 = SWAP_LONG(cpu->r10);
505: cpu->r11 = SWAP_LONG(cpu->r11);
506: cpu->r12 = SWAP_LONG(cpu->r12);
507: cpu->r13 = SWAP_LONG(cpu->r13);
508: cpu->r14 = SWAP_LONG(cpu->r14);
509: cpu->r15 = SWAP_LONG(cpu->r15);
510: cpu->r16 = SWAP_LONG(cpu->r16);
511: cpu->r17 = SWAP_LONG(cpu->r17);
512: cpu->r18 = SWAP_LONG(cpu->r18);
513: cpu->r19 = SWAP_LONG(cpu->r19);
514: cpu->r20 = SWAP_LONG(cpu->r20);
515: cpu->r21 = SWAP_LONG(cpu->r21);
516: cpu->r22 = SWAP_LONG(cpu->r22);
517: cpu->r23 = SWAP_LONG(cpu->r23);
518: cpu->r24 = SWAP_LONG(cpu->r24);
519: cpu->r25 = SWAP_LONG(cpu->r25);
520: cpu->r26 = SWAP_LONG(cpu->r26);
521: cpu->r27 = SWAP_LONG(cpu->r27);
522: cpu->r28 = SWAP_LONG(cpu->r28);
523: cpu->r29 = SWAP_LONG(cpu->r29);
524: cpu->r30 = SWAP_LONG(cpu->r30);
525: cpu->r31 = SWAP_LONG(cpu->r31);
526: cpu->xip = SWAP_LONG(cpu->xip);
527: cpu->xip_in_bd = SWAP_LONG(cpu->xip_in_bd);
528: cpu->nip = SWAP_LONG(cpu->nip);
529: }
530:
531: void
532: swap_m88k_thread_state_xrf_t(
533: m88k_thread_state_xrf_t *fpu,
534: enum byte_sex target_byte_sex)
535: {
536: enum byte_sex host_byte_sex;
537:
538: struct swapped_m88k_fpsr {
539: union {
540: struct {
541: unsigned afinx:BIT_WIDTH(0);
542: unsigned afovf:BIT_WIDTH(1);
543: unsigned afunf:BIT_WIDTH(2);
544: unsigned afdvz:BIT_WIDTH(3);
545: unsigned afinv:BIT_WIDTH(4);
546: unsigned :BITS_WIDTH(15,5);
547: unsigned xmod:BIT_WIDTH(16);
548: unsigned :BITS_WIDTH(31,17);
549: } fields;
550: unsigned long word;
551: } u;
552: } ssr;
553: struct swapped_m88k_fpcr {
554: union {
555: struct {
556: unsigned efinx:BIT_WIDTH(0);
557: unsigned efovf:BIT_WIDTH(1);
558: unsigned efunf:BIT_WIDTH(2);
559: unsigned efdvz:BIT_WIDTH(3);
560: unsigned efinv:BIT_WIDTH(4);
561: unsigned :BITS_WIDTH(13,5);
562: m88k_fpcr_rm_t rm:BITS_WIDTH(15,14);
563: unsigned :BITS_WIDTH(31,16);
564: } fields;
565: unsigned long word;
566: } u;
567: } scr;
568:
569: host_byte_sex = get_host_byte_sex();
570:
571: fpu->x1.x[0] = SWAP_LONG(fpu->x1.x[0]);
572: fpu->x1.x[1] = SWAP_LONG(fpu->x1.x[1]);
573: fpu->x1.x[2] = SWAP_LONG(fpu->x1.x[2]);
574: fpu->x1.x[3] = SWAP_LONG(fpu->x1.x[3]);
575: fpu->x2.x[0] = SWAP_LONG(fpu->x2.x[0]);
576: fpu->x2.x[1] = SWAP_LONG(fpu->x2.x[1]);
577: fpu->x2.x[2] = SWAP_LONG(fpu->x2.x[2]);
578: fpu->x2.x[3] = SWAP_LONG(fpu->x2.x[3]);
579: fpu->x3.x[0] = SWAP_LONG(fpu->x3.x[0]);
580: fpu->x3.x[1] = SWAP_LONG(fpu->x3.x[1]);
581: fpu->x3.x[2] = SWAP_LONG(fpu->x3.x[2]);
582: fpu->x3.x[3] = SWAP_LONG(fpu->x3.x[3]);
583: fpu->x4.x[0] = SWAP_LONG(fpu->x4.x[0]);
584: fpu->x4.x[1] = SWAP_LONG(fpu->x4.x[1]);
585: fpu->x4.x[2] = SWAP_LONG(fpu->x4.x[2]);
586: fpu->x4.x[3] = SWAP_LONG(fpu->x4.x[3]);
587: fpu->x5.x[0] = SWAP_LONG(fpu->x5.x[0]);
588: fpu->x5.x[1] = SWAP_LONG(fpu->x5.x[1]);
589: fpu->x5.x[2] = SWAP_LONG(fpu->x5.x[2]);
590: fpu->x5.x[3] = SWAP_LONG(fpu->x5.x[3]);
591: fpu->x6.x[0] = SWAP_LONG(fpu->x6.x[0]);
592: fpu->x6.x[1] = SWAP_LONG(fpu->x6.x[1]);
593: fpu->x6.x[2] = SWAP_LONG(fpu->x6.x[2]);
594: fpu->x6.x[3] = SWAP_LONG(fpu->x6.x[3]);
595: fpu->x7.x[0] = SWAP_LONG(fpu->x7.x[0]);
596: fpu->x7.x[1] = SWAP_LONG(fpu->x7.x[1]);
597: fpu->x7.x[2] = SWAP_LONG(fpu->x7.x[2]);
598: fpu->x7.x[3] = SWAP_LONG(fpu->x7.x[3]);
599: fpu->x8.x[0] = SWAP_LONG(fpu->x8.x[0]);
600: fpu->x8.x[1] = SWAP_LONG(fpu->x8.x[1]);
601: fpu->x8.x[2] = SWAP_LONG(fpu->x8.x[2]);
602: fpu->x8.x[3] = SWAP_LONG(fpu->x8.x[3]);
603: fpu->x9.x[0] = SWAP_LONG(fpu->x9.x[0]);
604: fpu->x9.x[1] = SWAP_LONG(fpu->x9.x[1]);
605: fpu->x9.x[2] = SWAP_LONG(fpu->x9.x[2]);
606: fpu->x9.x[3] = SWAP_LONG(fpu->x9.x[3]);
607: fpu->x10.x[0] = SWAP_LONG(fpu->x10.x[0]);
608: fpu->x10.x[1] = SWAP_LONG(fpu->x10.x[1]);
609: fpu->x10.x[2] = SWAP_LONG(fpu->x10.x[2]);
610: fpu->x10.x[3] = SWAP_LONG(fpu->x10.x[3]);
611: fpu->x11.x[0] = SWAP_LONG(fpu->x11.x[0]);
612: fpu->x11.x[1] = SWAP_LONG(fpu->x11.x[1]);
613: fpu->x11.x[2] = SWAP_LONG(fpu->x11.x[2]);
614: fpu->x11.x[3] = SWAP_LONG(fpu->x11.x[3]);
615: fpu->x12.x[0] = SWAP_LONG(fpu->x12.x[0]);
616: fpu->x12.x[1] = SWAP_LONG(fpu->x12.x[1]);
617: fpu->x12.x[2] = SWAP_LONG(fpu->x12.x[2]);
618: fpu->x12.x[3] = SWAP_LONG(fpu->x12.x[3]);
619: fpu->x13.x[0] = SWAP_LONG(fpu->x13.x[0]);
620: fpu->x13.x[1] = SWAP_LONG(fpu->x13.x[1]);
621: fpu->x13.x[2] = SWAP_LONG(fpu->x13.x[2]);
622: fpu->x13.x[3] = SWAP_LONG(fpu->x13.x[3]);
623: fpu->x14.x[0] = SWAP_LONG(fpu->x14.x[0]);
624: fpu->x14.x[1] = SWAP_LONG(fpu->x14.x[1]);
625: fpu->x14.x[2] = SWAP_LONG(fpu->x14.x[2]);
626: fpu->x14.x[3] = SWAP_LONG(fpu->x14.x[3]);
627: fpu->x15.x[0] = SWAP_LONG(fpu->x15.x[0]);
628: fpu->x15.x[1] = SWAP_LONG(fpu->x15.x[1]);
629: fpu->x15.x[2] = SWAP_LONG(fpu->x15.x[2]);
630: fpu->x15.x[3] = SWAP_LONG(fpu->x15.x[3]);
631: fpu->x16.x[0] = SWAP_LONG(fpu->x16.x[0]);
632: fpu->x16.x[1] = SWAP_LONG(fpu->x16.x[1]);
633: fpu->x16.x[2] = SWAP_LONG(fpu->x16.x[2]);
634: fpu->x16.x[3] = SWAP_LONG(fpu->x16.x[3]);
635: fpu->x17.x[0] = SWAP_LONG(fpu->x17.x[0]);
636: fpu->x17.x[1] = SWAP_LONG(fpu->x17.x[1]);
637: fpu->x17.x[2] = SWAP_LONG(fpu->x17.x[2]);
638: fpu->x17.x[3] = SWAP_LONG(fpu->x17.x[3]);
639: fpu->x18.x[0] = SWAP_LONG(fpu->x18.x[0]);
640: fpu->x18.x[1] = SWAP_LONG(fpu->x18.x[1]);
641: fpu->x18.x[2] = SWAP_LONG(fpu->x18.x[2]);
642: fpu->x18.x[3] = SWAP_LONG(fpu->x18.x[3]);
643: fpu->x19.x[0] = SWAP_LONG(fpu->x19.x[0]);
644: fpu->x19.x[1] = SWAP_LONG(fpu->x19.x[1]);
645: fpu->x19.x[2] = SWAP_LONG(fpu->x19.x[2]);
646: fpu->x19.x[3] = SWAP_LONG(fpu->x19.x[3]);
647: fpu->x20.x[0] = SWAP_LONG(fpu->x20.x[0]);
648: fpu->x20.x[1] = SWAP_LONG(fpu->x20.x[1]);
649: fpu->x20.x[2] = SWAP_LONG(fpu->x20.x[2]);
650: fpu->x20.x[3] = SWAP_LONG(fpu->x20.x[3]);
651: fpu->x21.x[0] = SWAP_LONG(fpu->x21.x[0]);
652: fpu->x21.x[1] = SWAP_LONG(fpu->x21.x[1]);
653: fpu->x21.x[2] = SWAP_LONG(fpu->x21.x[2]);
654: fpu->x21.x[3] = SWAP_LONG(fpu->x21.x[3]);
655: fpu->x22.x[0] = SWAP_LONG(fpu->x22.x[0]);
656: fpu->x22.x[1] = SWAP_LONG(fpu->x22.x[1]);
657: fpu->x22.x[2] = SWAP_LONG(fpu->x22.x[2]);
658: fpu->x22.x[3] = SWAP_LONG(fpu->x22.x[3]);
659: fpu->x23.x[0] = SWAP_LONG(fpu->x23.x[0]);
660: fpu->x23.x[1] = SWAP_LONG(fpu->x23.x[1]);
661: fpu->x23.x[2] = SWAP_LONG(fpu->x23.x[2]);
662: fpu->x23.x[3] = SWAP_LONG(fpu->x23.x[3]);
663: fpu->x24.x[0] = SWAP_LONG(fpu->x24.x[0]);
664: fpu->x24.x[1] = SWAP_LONG(fpu->x24.x[1]);
665: fpu->x24.x[2] = SWAP_LONG(fpu->x24.x[2]);
666: fpu->x24.x[3] = SWAP_LONG(fpu->x24.x[3]);
667: fpu->x25.x[0] = SWAP_LONG(fpu->x25.x[0]);
668: fpu->x25.x[1] = SWAP_LONG(fpu->x25.x[1]);
669: fpu->x25.x[2] = SWAP_LONG(fpu->x25.x[2]);
670: fpu->x25.x[3] = SWAP_LONG(fpu->x25.x[3]);
671: fpu->x26.x[0] = SWAP_LONG(fpu->x26.x[0]);
672: fpu->x26.x[1] = SWAP_LONG(fpu->x26.x[1]);
673: fpu->x26.x[2] = SWAP_LONG(fpu->x26.x[2]);
674: fpu->x26.x[3] = SWAP_LONG(fpu->x26.x[3]);
675: fpu->x27.x[0] = SWAP_LONG(fpu->x27.x[0]);
676: fpu->x27.x[1] = SWAP_LONG(fpu->x27.x[1]);
677: fpu->x27.x[2] = SWAP_LONG(fpu->x27.x[2]);
678: fpu->x27.x[3] = SWAP_LONG(fpu->x27.x[3]);
679: fpu->x28.x[0] = SWAP_LONG(fpu->x28.x[0]);
680: fpu->x28.x[1] = SWAP_LONG(fpu->x28.x[1]);
681: fpu->x28.x[2] = SWAP_LONG(fpu->x28.x[2]);
682: fpu->x28.x[3] = SWAP_LONG(fpu->x28.x[3]);
683: fpu->x29.x[0] = SWAP_LONG(fpu->x29.x[0]);
684: fpu->x29.x[1] = SWAP_LONG(fpu->x29.x[1]);
685: fpu->x29.x[2] = SWAP_LONG(fpu->x29.x[2]);
686: fpu->x29.x[3] = SWAP_LONG(fpu->x29.x[3]);
687: fpu->x30.x[0] = SWAP_LONG(fpu->x30.x[0]);
688: fpu->x30.x[1] = SWAP_LONG(fpu->x30.x[1]);
689: fpu->x30.x[2] = SWAP_LONG(fpu->x30.x[2]);
690: fpu->x30.x[3] = SWAP_LONG(fpu->x30.x[3]);
691: fpu->x31.x[0] = SWAP_LONG(fpu->x31.x[0]);
692: fpu->x31.x[1] = SWAP_LONG(fpu->x31.x[1]);
693: fpu->x31.x[2] = SWAP_LONG(fpu->x31.x[2]);
694: fpu->x31.x[3] = SWAP_LONG(fpu->x31.x[3]);
695:
696: if(target_byte_sex == host_byte_sex){
697: memcpy(&ssr, &(fpu->fpsr), sizeof(struct swapped_m88k_fpsr));
698: ssr.u.word = SWAP_LONG(ssr.u.word);
699: fpu->fpsr.afinx = ssr.u.fields.afinx;
700: fpu->fpsr.afovf = ssr.u.fields.afovf;
701: fpu->fpsr.afunf = ssr.u.fields.afunf;
702: fpu->fpsr.afdvz = ssr.u.fields.afdvz;
703: fpu->fpsr.afinv = ssr.u.fields.afinv;
704: fpu->fpsr.xmod = ssr.u.fields.xmod;
705:
706: memcpy(&scr, &(fpu->fpcr), sizeof(struct swapped_m88k_fpcr));
707: scr.u.word = SWAP_LONG(scr.u.word);
708: fpu->fpcr.efinx = scr.u.fields.efinx;
709: fpu->fpcr.efovf = scr.u.fields.efovf;
710: fpu->fpcr.efunf = scr.u.fields.efunf;
711: fpu->fpcr.efdvz = scr.u.fields.efdvz;
712: fpu->fpcr.efinv = scr.u.fields.efinv;
713: fpu->fpcr.rm = scr.u.fields.rm;
714: }
715: else{
716: ssr.u.fields.afinx = fpu->fpsr.afinx;
717: ssr.u.fields.afovf = fpu->fpsr.afovf;
718: ssr.u.fields.afunf = fpu->fpsr.afunf;
719: ssr.u.fields.afdvz = fpu->fpsr.afdvz;
720: ssr.u.fields.afinv = fpu->fpsr.afinv;
721: ssr.u.fields.xmod = fpu->fpsr.xmod;
722: ssr.u.word = SWAP_LONG(ssr.u.word);
723: memcpy(&(fpu->fpsr), &ssr, sizeof(struct swapped_m88k_fpsr));
724:
725: scr.u.fields.efinx = fpu->fpcr.efinx;
726: scr.u.fields.efovf = fpu->fpcr.efovf;
727: scr.u.fields.efunf = fpu->fpcr.efunf;
728: scr.u.fields.efdvz = fpu->fpcr.efdvz;
729: scr.u.fields.efinv = fpu->fpcr.efinv;
730: scr.u.fields.rm = fpu->fpcr.rm;
731: scr.u.word = SWAP_LONG(scr.u.word);
732: memcpy(&(fpu->fpcr), &scr, sizeof(struct swapped_m88k_fpcr));
733: }
734: }
735:
736: void
737: swap_m88k_thread_state_user_t(
738: m88k_thread_state_user_t *user,
739: enum byte_sex target_byte_sex)
740: {
741: user->user = SWAP_LONG(user->user);
742: }
743:
744: void
745: swap_m88110_thread_state_impl_t(
746: m88110_thread_state_impl_t *spu,
747: enum byte_sex target_byte_sex)
748: {
749: unsigned long i;
750: enum byte_sex host_byte_sex;
751:
752: struct swapped_m88110_bp_ctrl {
753: union {
754: struct {
755: unsigned v:BIT_WIDTH(0);
756: m88110_match_t addr_match:BITS_WIDTH(12,1);
757: unsigned :BITS_WIDTH(26,13);
758: unsigned rwm:BIT_WIDTH(27);
759: unsigned rw:BIT_WIDTH(28);
760: unsigned :BITS_WIDTH(31,29);
761: } fields;
762: unsigned long word;
763: } u;
764: } sbpc;
765:
766: struct swap_m88110_psr {
767: union {
768: struct {
769: unsigned :BITS_WIDTH(1,0);
770: unsigned mxm_dis:BIT_WIDTH(2);
771: unsigned sfu1dis:BIT_WIDTH(3);
772: unsigned :BITS_WIDTH(22,4);
773: unsigned trace:BIT_WIDTH(23);
774: unsigned :BIT_WIDTH(24);
775: unsigned sm:BIT_WIDTH(25);
776: unsigned sgn_imd:BIT_WIDTH(26);
777: unsigned :BIT_WIDTH(27);
778: unsigned c:BIT_WIDTH(28);
779: unsigned se:BIT_WIDTH(29);
780: unsigned le:BIT_WIDTH(30);
781: unsigned supr:BIT_WIDTH(31);
782: } fields;
783: unsigned long word;
784: } u;
785: } spsr;
786:
787: struct swapped_m88110_fp_trap_status {
788: union {
789: struct {
790: unsigned efinx:BIT_WIDTH(0);
791: unsigned efovf:BIT_WIDTH(1);
792: unsigned efunf:BIT_WIDTH(2);
793: unsigned efdvz:BIT_WIDTH(3);
794: unsigned efinv:BIT_WIDTH(4);
795: unsigned priv:BIT_WIDTH(5);
796: unsigned unimp:BIT_WIDTH(6);
797: unsigned int:BIT_WIDTH(7);
798: unsigned sfu1_disabled:BIT_WIDTH(8);
799: unsigned :BITS_WIDTH(13,9);
800: m88110_iresult_size_t iresult_size:BITS_WIDTH(15,14);
801: unsigned :BITS_WIDTH(31,16);
802: } fields;
803: unsigned long word;
804: } u;
805: } sfps;
806:
807: host_byte_sex = get_host_byte_sex();
808:
809: if(target_byte_sex == host_byte_sex){
810: for(i = 0; i < M88110_N_DATA_BP; i++){
811: spu->data_bp[i].addr = SWAP_LONG(spu->data_bp[i].addr);
812: memcpy(&sbpc, &(spu->data_bp[i].ctrl),
813: sizeof(struct swapped_m88110_bp_ctrl));
814: sbpc.u.word = SWAP_LONG(sbpc.u.word);
815: spu->data_bp[i].ctrl.v = sbpc.u.fields.v;
816: spu->data_bp[i].ctrl.addr_match = sbpc.u.fields.addr_match;
817: spu->data_bp[i].ctrl.rwm = sbpc.u.fields.rwm;
818: spu->data_bp[i].ctrl.rw = sbpc.u.fields.rw;
819: }
820:
821: memcpy(&spsr, &(spu->psr), sizeof(struct swap_m88110_psr));
822: spsr.u.word = SWAP_LONG(spsr.u.word);
823: spu->psr.mxm_dis = spsr.u.fields.mxm_dis;
824: spu->psr.sfu1dis = spsr.u.fields.sfu1dis;
825: spu->psr.trace = spsr.u.fields.trace;
826: spu->psr.sm = spsr.u.fields.sm;
827: spu->psr.sgn_imd = spsr.u.fields.sgn_imd;
828: spu->psr.c = spsr.u.fields.c;
829: spu->psr.se = spsr.u.fields.se;
830: spu->psr.le = spsr.u.fields.le;
831: spu->psr.supr = spsr.u.fields.supr;
832:
833: memcpy(&sfps, &(spu->fp_trap_status),
834: sizeof(struct swapped_m88110_fp_trap_status));
835: sfps.u.word = SWAP_LONG(sfps.u.word);
836: spu->fp_trap_status.efinx = sfps.u.fields.efinx;
837: spu->fp_trap_status.efovf = sfps.u.fields.efovf;
838: spu->fp_trap_status.efunf = sfps.u.fields.efunf;
839: spu->fp_trap_status.efdvz = sfps.u.fields.efdvz;
840: spu->fp_trap_status.efinv = sfps.u.fields.efinv;
841: spu->fp_trap_status.priv = sfps.u.fields.priv;
842: spu->fp_trap_status.unimp = sfps.u.fields.unimp;
843: spu->fp_trap_status.sfu1_disabled = sfps.u.fields.sfu1_disabled;
844: spu->fp_trap_status.iresult_size = sfps.u.fields.iresult_size;
845: }
846: else{
847: for(i = 0; i < M88110_N_DATA_BP; i++){
848: spu->data_bp[i].addr = SWAP_LONG(spu->data_bp[i].addr);
849: sbpc.u.fields.v = spu->data_bp[i].ctrl.v;
850: sbpc.u.fields.addr_match = spu->data_bp[i].ctrl.addr_match;
851: sbpc.u.fields.rwm = spu->data_bp[i].ctrl.rwm;
852: sbpc.u.fields.rw = spu->data_bp[i].ctrl.rw;
853: sbpc.u.word = SWAP_LONG(sbpc.u.word);
854: memcpy(&(spu->data_bp[i].ctrl), &sbpc,
855: sizeof(struct swapped_m88110_bp_ctrl));
856: }
857:
858: spsr.u.fields.mxm_dis = spu->psr.mxm_dis;
859: spsr.u.fields.sfu1dis = spu->psr.sfu1dis;
860: spsr.u.fields.trace = spu->psr.trace;
861: spsr.u.fields.sm = spu->psr.sm;
862: spsr.u.fields.sgn_imd = spu->psr.sgn_imd;
863: spsr.u.fields.c = spu->psr.c;
864: spsr.u.fields.se = spu->psr.se;
865: spsr.u.fields.le = spu->psr.le;
866: spsr.u.fields.supr = spu->psr.supr;
867: spsr.u.word = SWAP_LONG(spsr.u.word);
868: memcpy(&(spu->psr), &spsr, sizeof(struct swap_m88110_psr));
869:
870: sfps.u.fields.efinx = spu->fp_trap_status.efinx;
871: sfps.u.fields.efovf = spu->fp_trap_status.efovf;
872: sfps.u.fields.efunf = spu->fp_trap_status.efunf;
873: sfps.u.fields.efdvz = spu->fp_trap_status.efdvz;
874: sfps.u.fields.efinv = spu->fp_trap_status.efinv;
875: sfps.u.fields.priv = spu->fp_trap_status.priv;
876: sfps.u.fields.unimp = spu->fp_trap_status.unimp;
877: sfps.u.fields.sfu1_disabled = spu->fp_trap_status.sfu1_disabled;
878: sfps.u.fields.iresult_size = spu->fp_trap_status.iresult_size;
879: sfps.u.word = SWAP_LONG(sfps.u.word);
880: memcpy(&(spu->fp_trap_status), &sfps,
881: sizeof(struct swapped_m88110_fp_trap_status));
882: }
883: spu->intermediate_result.x[0] =
884: SWAP_LONG(spu->intermediate_result.x[0]);
885: spu->intermediate_result.x[1] =
886: SWAP_LONG(spu->intermediate_result.x[1]);
887: spu->intermediate_result.x[2] =
888: SWAP_LONG(spu->intermediate_result.x[2]);
889: spu->intermediate_result.x[3] =
890: SWAP_LONG(spu->intermediate_result.x[3]);
891: }
892:
893: void
894: swap_i860_thread_state_regs(
895: struct i860_thread_state_regs *cpu,
896: enum byte_sex target_byte_sex)
897: {
898: unsigned long i;
899:
900: for(i = 0; i < 31; i++)
901: cpu->ireg[i] = SWAP_LONG(cpu->ireg[i]);
902: for(i = 0; i < 30; i++)
903: cpu->freg[i] = SWAP_LONG(cpu->freg[i]);
904: cpu->psr = SWAP_LONG(cpu->psr);
905: cpu->epsr = SWAP_LONG(cpu->epsr);
906: cpu->db = SWAP_LONG(cpu->db);
907: cpu->pc = SWAP_LONG(cpu->pc);
908: cpu->_padding_ = SWAP_LONG(cpu->_padding_);
909: cpu->Mres3 = SWAP_DOUBLE(cpu->Mres3);
910: cpu->Ares3 = SWAP_DOUBLE(cpu->Ares3);
911: cpu->Mres2 = SWAP_DOUBLE(cpu->Mres2);
912: cpu->Ares2 = SWAP_DOUBLE(cpu->Ares2);
913: cpu->Mres1 = SWAP_DOUBLE(cpu->Mres1);
914: cpu->Ares1 = SWAP_DOUBLE(cpu->Ares1);
915: cpu->Ires1 = SWAP_DOUBLE(cpu->Ires1);
916: cpu->Lres3m = SWAP_DOUBLE(cpu->Lres3m);
917: cpu->Lres2m = SWAP_DOUBLE(cpu->Lres2m);
918: cpu->Lres1m = SWAP_DOUBLE(cpu->Lres1m);
919: cpu->KR = SWAP_DOUBLE(cpu->KR);
920: cpu->KI = SWAP_DOUBLE(cpu->KI);
921: cpu->T = SWAP_DOUBLE(cpu->T);
922: cpu->Fsr3 = SWAP_LONG(cpu->Fsr3);
923: cpu->Fsr2 = SWAP_LONG(cpu->Fsr2);
924: cpu->Fsr1 = SWAP_LONG(cpu->Fsr1);
925: cpu->Mergelo32 = SWAP_LONG(cpu->Mergelo32);
926: cpu->Mergehi32 = SWAP_LONG(cpu->Mergehi32);
927: }
928:
929: void
930: swap_i386_thread_state(
931: i386_thread_state_t *cpu,
932: enum byte_sex target_byte_sex)
933: {
934: cpu->eax = SWAP_LONG(cpu->eax);
935: cpu->ebx = SWAP_LONG(cpu->ebx);
936: cpu->ecx = SWAP_LONG(cpu->ecx);
937: cpu->edx = SWAP_LONG(cpu->edx);
938: cpu->edi = SWAP_LONG(cpu->edi);
939: cpu->esi = SWAP_LONG(cpu->esi);
940: cpu->ebp = SWAP_LONG(cpu->ebp);
941: cpu->esp = SWAP_LONG(cpu->esp);
942: cpu->ss = SWAP_LONG(cpu->ss);
943: cpu->eflags = SWAP_LONG(cpu->eflags);
944: cpu->eip = SWAP_LONG(cpu->eip);
945: cpu->cs = SWAP_LONG(cpu->cs);
946: cpu->ds = SWAP_LONG(cpu->ds);
947: cpu->es = SWAP_LONG(cpu->es);
948: cpu->fs = SWAP_LONG(cpu->fs);
949: cpu->gs = SWAP_LONG(cpu->gs);
950: }
951:
952: void
953: swap_i386_thread_fpstate(
954: i386_thread_fpstate_t *fpu,
955: enum byte_sex target_byte_sex)
956: {
957: struct swapped_fp_control {
958: union {
959: struct {
960: unsigned short
961: :3,
962: /*inf*/ :1,
963: rc :2,
964: pc :2,
965: :2,
966: precis :1,
967: undfl :1,
968: ovrfl :1,
969: zdiv :1,
970: denorm :1,
971: invalid :1;
972: } fields;
973: unsigned short half;
974: } u;
975: } sfpc;
976:
977: struct swapped_fp_status {
978: union {
979: struct {
980: unsigned short
981: busy :1,
982: c3 :1,
983: tos :3,
984: c2 :1,
985: c1 :1,
986: c0 :1,
987: errsumm :1,
988: stkflt :1,
989: precis :1,
990: undfl :1,
991: ovrfl :1,
992: zdiv :1,
993: denorm :1,
994: invalid :1;
995: } fields;
996: unsigned short half;
997: } u;
998: } sfps;
999:
1000: struct swapped_fp_tag {
1001: union {
1002: struct {
1003: unsigned short
1004: tag7 :2,
1005: tag6 :2,
1006: tag5 :2,
1007: tag4 :2,
1008: tag3 :2,
1009: tag2 :2,
1010: tag1 :2,
1011: tag0 :2;
1012: } fields;
1013: unsigned short half;
1014: } u;
1015: } sfpt;
1016:
1017: struct swapped_fp_data_reg {
1018: unsigned short mant;
1019: unsigned short mant1 :16,
1020: mant2 :16,
1021: mant3 :16;
1022: union {
1023: struct {
1024: unsigned short sign :1,
1025: exp :15;
1026: } fields;
1027: unsigned short half;
1028: } u;
1029: } sfpd;
1030:
1031: struct swapped_sel {
1032: union {
1033: struct {
1034: unsigned short
1035: index :13,
1036: ti :1,
1037: rpl :2;
1038: } fields;
1039: unsigned short half;
1040: } u;
1041: } ss;
1042:
1043: enum byte_sex host_byte_sex;
1044: unsigned long i;
1045:
1046: host_byte_sex = get_host_byte_sex();
1047:
1048: fpu->environ.ip = SWAP_LONG(fpu->environ.ip);
1049: fpu->environ.opcode = SWAP_SHORT(fpu->environ.opcode);
1050: fpu->environ.dp = SWAP_LONG(fpu->environ.dp);
1051:
1052: if(target_byte_sex == host_byte_sex){
1053: memcpy(&sfpc, &(fpu->environ.control),
1054: sizeof(struct swapped_fp_control));
1055: sfpc.u.half = SWAP_SHORT(sfpc.u.half);
1056: fpu->environ.control.rc = sfpc.u.fields.rc;
1057: fpu->environ.control.pc = sfpc.u.fields.pc;
1058: fpu->environ.control.precis = sfpc.u.fields.precis;
1059: fpu->environ.control.undfl = sfpc.u.fields.undfl;
1060: fpu->environ.control.ovrfl = sfpc.u.fields.ovrfl;
1061: fpu->environ.control.zdiv = sfpc.u.fields.zdiv;
1062: fpu->environ.control.denorm = sfpc.u.fields.denorm;
1063: fpu->environ.control.invalid = sfpc.u.fields.invalid;
1064:
1065: memcpy(&sfps, &(fpu->environ.status),
1066: sizeof(struct swapped_fp_status));
1067: sfps.u.half = SWAP_SHORT(sfps.u.half);
1068: fpu->environ.status.busy = sfps.u.fields.busy;
1069: fpu->environ.status.c3 = sfps.u.fields.c3;
1070: fpu->environ.status.tos = sfps.u.fields.tos;
1071: fpu->environ.status.c2 = sfps.u.fields.c2;
1072: fpu->environ.status.c1 = sfps.u.fields.c1;
1073: fpu->environ.status.c0 = sfps.u.fields.c0;
1074: fpu->environ.status.errsumm = sfps.u.fields.errsumm;
1075: fpu->environ.status.stkflt = sfps.u.fields.stkflt;
1076: fpu->environ.status.precis = sfps.u.fields.precis;
1077: fpu->environ.status.undfl = sfps.u.fields.undfl;
1078: fpu->environ.status.ovrfl = sfps.u.fields.ovrfl;
1079: fpu->environ.status.zdiv = sfps.u.fields.zdiv;
1080: fpu->environ.status.denorm = sfps.u.fields.denorm;
1081: fpu->environ.status.invalid = sfps.u.fields.invalid;
1082:
1083: memcpy(&sfpt, &(fpu->environ.tag),
1084: sizeof(struct swapped_fp_tag));
1085: sfpt.u.half = SWAP_SHORT(sfpt.u.half);
1086: fpu->environ.tag.tag7 = sfpt.u.fields.tag7;
1087: fpu->environ.tag.tag6 = sfpt.u.fields.tag6;
1088: fpu->environ.tag.tag5 = sfpt.u.fields.tag5;
1089: fpu->environ.tag.tag4 = sfpt.u.fields.tag4;
1090: fpu->environ.tag.tag3 = sfpt.u.fields.tag3;
1091: fpu->environ.tag.tag2 = sfpt.u.fields.tag2;
1092: fpu->environ.tag.tag1 = sfpt.u.fields.tag1;
1093: fpu->environ.tag.tag0 = sfpt.u.fields.tag0;
1094:
1095: memcpy(&ss, &(fpu->environ.cs),
1096: sizeof(struct swapped_sel));
1097: ss.u.half = SWAP_SHORT(ss.u.half);
1098: fpu->environ.cs.index = ss.u.fields.index;
1099: fpu->environ.cs.ti = ss.u.fields.ti;
1100: fpu->environ.cs.rpl = ss.u.fields.rpl;
1101:
1102: memcpy(&ss, &(fpu->environ.ds),
1103: sizeof(struct swapped_sel));
1104: ss.u.half = SWAP_SHORT(ss.u.half);
1105: fpu->environ.ds.index = ss.u.fields.index;
1106: fpu->environ.ds.ti = ss.u.fields.ti;
1107: fpu->environ.ds.rpl = ss.u.fields.rpl;
1108:
1109: for(i = 0; i < 8; i++){
1110: memcpy(&sfpd, &(fpu->stack.ST[i]),
1111: sizeof(struct swapped_fp_data_reg));
1112: fpu->stack.ST[i].mant = SWAP_SHORT(sfpd.mant);
1113: fpu->stack.ST[i].mant1 = SWAP_SHORT(sfpd.mant1);
1114: fpu->stack.ST[i].mant2 = SWAP_SHORT(sfpd.mant2);
1115: fpu->stack.ST[i].mant3 = SWAP_SHORT(sfpd.mant3);
1116: sfpd.u.half = SWAP_SHORT(sfpd.u.half);
1117: fpu->stack.ST[i].exp = sfpd.u.fields.exp;
1118: fpu->stack.ST[i].sign = sfpd.u.fields.sign;
1119: }
1120: }
1121: else{
1122: sfpc.u.fields.rc = fpu->environ.control.rc;
1123: sfpc.u.fields.pc = fpu->environ.control.pc;
1124: sfpc.u.fields.precis = fpu->environ.control.precis;
1125: sfpc.u.fields.undfl = fpu->environ.control.undfl;
1126: sfpc.u.fields.ovrfl = fpu->environ.control.ovrfl;
1127: sfpc.u.fields.zdiv = fpu->environ.control.zdiv;
1128: sfpc.u.fields.denorm = fpu->environ.control.denorm;
1129: sfpc.u.fields.invalid = fpu->environ.control.invalid;
1130: sfpc.u.half = SWAP_SHORT(sfpc.u.half);
1131: memcpy(&(fpu->environ.control), &sfpc,
1132: sizeof(struct swapped_fp_control));
1133:
1134: sfps.u.fields.busy = fpu->environ.status.busy;
1135: sfps.u.fields.c3 = fpu->environ.status.c3;
1136: sfps.u.fields.tos = fpu->environ.status.tos;
1137: sfps.u.fields.c2 = fpu->environ.status.c2;
1138: sfps.u.fields.c1 = fpu->environ.status.c1;
1139: sfps.u.fields.c0 = fpu->environ.status.c0;
1140: sfps.u.fields.errsumm = fpu->environ.status.errsumm;
1141: sfps.u.fields.stkflt = fpu->environ.status.stkflt;
1142: sfps.u.fields.precis = fpu->environ.status.precis;
1143: sfps.u.fields.undfl = fpu->environ.status.undfl;
1144: sfps.u.fields.ovrfl = fpu->environ.status.ovrfl;
1145: sfps.u.fields.zdiv = fpu->environ.status.zdiv;
1146: sfps.u.fields.denorm = fpu->environ.status.denorm;
1147: sfps.u.fields.invalid = fpu->environ.status.invalid;
1148: sfps.u.half = SWAP_SHORT(sfps.u.half);
1149: memcpy(&(fpu->environ.status), &sfps,
1150: sizeof(struct swapped_fp_status));
1151:
1152: sfpt.u.fields.tag7 = fpu->environ.tag.tag7;
1153: sfpt.u.fields.tag6 = fpu->environ.tag.tag6;
1154: sfpt.u.fields.tag5 = fpu->environ.tag.tag5;
1155: sfpt.u.fields.tag4 = fpu->environ.tag.tag4;
1156: sfpt.u.fields.tag3 = fpu->environ.tag.tag3;
1157: sfpt.u.fields.tag2 = fpu->environ.tag.tag2;
1158: sfpt.u.fields.tag1 = fpu->environ.tag.tag1;
1159: sfpt.u.fields.tag0 = fpu->environ.tag.tag0;
1160: sfpt.u.half = SWAP_SHORT(sfpt.u.half);
1161: memcpy(&(fpu->environ.tag), &sfpt,
1162: sizeof(struct swapped_fp_tag));
1163:
1164: ss.u.fields.index = fpu->environ.cs.index;
1165: ss.u.fields.ti = fpu->environ.cs.ti;
1166: ss.u.fields.rpl = fpu->environ.cs.rpl;
1167: ss.u.half = SWAP_SHORT(ss.u.half);
1168: memcpy(&(fpu->environ.cs), &ss,
1169: sizeof(struct swapped_sel));
1170:
1171: ss.u.fields.index = fpu->environ.ds.index;
1172: ss.u.fields.ti = fpu->environ.ds.ti;
1173: ss.u.fields.rpl = fpu->environ.ds.rpl;
1174: ss.u.half = SWAP_SHORT(ss.u.half);
1175: memcpy(&(fpu->environ.cs), &ss,
1176: sizeof(struct swapped_sel));
1177:
1178: for(i = 0; i < 8; i++){
1179: sfpd.mant = SWAP_SHORT(fpu->stack.ST[i].mant);
1180: sfpd.mant1 = SWAP_SHORT(fpu->stack.ST[i].mant1);
1181: sfpd.mant2 = SWAP_SHORT(fpu->stack.ST[i].mant2);
1182: sfpd.mant3 = SWAP_SHORT(fpu->stack.ST[i].mant3);
1183: sfpd.u.fields.exp = fpu->stack.ST[i].exp;
1184: sfpd.u.fields.sign = fpu->stack.ST[i].sign;
1185: sfpd.u.half = SWAP_SHORT(sfpd.u.half);
1186: memcpy(&(fpu->stack.ST[i]), &sfpd,
1187: sizeof(struct swapped_fp_data_reg));
1188: }
1189: }
1190: }
1191:
1192: void
1193: swap_i386_thread_exceptstate(
1194: i386_thread_exceptstate_t *exc,
1195: enum byte_sex target_byte_sex)
1196: {
1197: struct swapped_err_code {
1198: union {
1199: struct err_code_normal {
1200: unsigned int :16,
1201: index :13,
1202: tbl :2,
1203: ext :1;
1204: } normal;
1205: struct err_code_pgfault {
1206: unsigned int :29,
1207: user :1,
1208: wrtflt :1,
1209: prot :1;
1210: } pgfault;
1211: unsigned long word;
1212: } u;
1213: } sec;
1214: unsigned long word;
1215: enum byte_sex host_byte_sex;
1216:
1217: host_byte_sex = get_host_byte_sex();
1218:
1219: exc->trapno = SWAP_LONG(exc->trapno);
1220: if(exc->trapno == 14){
1221: if(target_byte_sex == host_byte_sex){
1222: memcpy(&sec, &(exc->err), sizeof(struct swapped_err_code));
1223: sec.u.word = SWAP_LONG(sec.u.word);
1224: exc->err.pgfault.user = sec.u.pgfault.user;
1225: exc->err.pgfault.wrtflt = sec.u.pgfault.wrtflt;
1226: exc->err.pgfault.prot = sec.u.pgfault.prot;
1227: }
1228: else{
1229: sec.u.pgfault.prot = exc->err.pgfault.prot;
1230: sec.u.pgfault.wrtflt = exc->err.pgfault.wrtflt;
1231: sec.u.pgfault.user = exc->err.pgfault.user;
1232: sec.u.word = SWAP_LONG(sec.u.word);
1233: memcpy(&(exc->err), &sec, sizeof(struct swapped_err_code));
1234: }
1235: }
1236: else{
1237: if(target_byte_sex == host_byte_sex){
1238: memcpy(&sec, &(exc->err), sizeof(struct swapped_err_code));
1239: sec.u.word = SWAP_LONG(sec.u.word);
1240: word = sec.u.normal.index;
1241: exc->err.normal.index = SWAP_LONG(word);
1242: exc->err.normal.tbl = sec.u.normal.tbl;
1243: exc->err.normal.ext = sec.u.normal.ext;
1244: }
1245: else{
1246: sec.u.normal.ext = exc->err.normal.ext;
1247: sec.u.normal.tbl = exc->err.normal.tbl;
1248: word = exc->err.normal.index;
1249: sec.u.normal.index = SWAP_LONG(word);
1250: sec.u.word = SWAP_LONG(sec.u.word);
1251: memcpy(&(exc->err), &sec, sizeof(struct swapped_err_code));
1252: }
1253: }
1254: }
1255:
1256: void
1257: swap_i386_thread_cthreadstate(
1258: i386_thread_cthreadstate_t *user,
1259: enum byte_sex target_byte_sex)
1260: {
1261: user->self = SWAP_LONG(user->self);
1262: }
1263:
1264: void
1265: swap_hppa_integer_thread_state(
1266: struct hp_pa_integer_thread_state *regs,
1267: enum byte_sex target_byte_order)
1268: {
1269: regs->ts_gr1 = SWAP_LONG(regs->ts_gr1);
1270: regs->ts_gr2 = SWAP_LONG(regs->ts_gr2);
1271: regs->ts_gr3 = SWAP_LONG(regs->ts_gr3);
1272: regs->ts_gr4 = SWAP_LONG(regs->ts_gr4);
1273: regs->ts_gr5 = SWAP_LONG(regs->ts_gr5);
1274: regs->ts_gr6 = SWAP_LONG(regs->ts_gr6);
1275: regs->ts_gr7 = SWAP_LONG(regs->ts_gr7);
1276: regs->ts_gr8 = SWAP_LONG(regs->ts_gr8);
1277: regs->ts_gr9 = SWAP_LONG(regs->ts_gr9);
1278: regs->ts_gr10 = SWAP_LONG(regs->ts_gr10);
1279: regs->ts_gr11 = SWAP_LONG(regs->ts_gr11);
1280: regs->ts_gr12 = SWAP_LONG(regs->ts_gr12);
1281: regs->ts_gr13 = SWAP_LONG(regs->ts_gr13);
1282: regs->ts_gr14 = SWAP_LONG(regs->ts_gr14);
1283: regs->ts_gr15 = SWAP_LONG(regs->ts_gr15);
1284: regs->ts_gr16 = SWAP_LONG(regs->ts_gr16);
1285: regs->ts_gr17 = SWAP_LONG(regs->ts_gr17);
1286: regs->ts_gr18 = SWAP_LONG(regs->ts_gr18);
1287: regs->ts_gr19 = SWAP_LONG(regs->ts_gr19);
1288: regs->ts_gr20 = SWAP_LONG(regs->ts_gr20);
1289: regs->ts_gr21 = SWAP_LONG(regs->ts_gr21);
1290: regs->ts_gr22 = SWAP_LONG(regs->ts_gr22);
1291: regs->ts_gr23 = SWAP_LONG(regs->ts_gr23);
1292: regs->ts_gr24 = SWAP_LONG(regs->ts_gr24);
1293: regs->ts_gr25 = SWAP_LONG(regs->ts_gr25);
1294: regs->ts_gr26 = SWAP_LONG(regs->ts_gr26);
1295: regs->ts_gr27 = SWAP_LONG(regs->ts_gr27);
1296: regs->ts_gr28 = SWAP_LONG(regs->ts_gr28);
1297: regs->ts_gr29 = SWAP_LONG(regs->ts_gr29);
1298: regs->ts_gr30 = SWAP_LONG(regs->ts_gr30);
1299: regs->ts_gr31 = SWAP_LONG(regs->ts_gr31);
1300: regs->ts_sr0 = SWAP_LONG(regs->ts_sr0);
1301: regs->ts_sr1 = SWAP_LONG(regs->ts_sr1);
1302: regs->ts_sr2 = SWAP_LONG(regs->ts_sr2);
1303: regs->ts_sr3 = SWAP_LONG(regs->ts_sr3);
1304: regs->ts_sar = SWAP_LONG(regs->ts_sar);
1305: }
1306:
1307: void swap_hppa_frame_thread_state(
1308: struct hp_pa_frame_thread_state *frame,
1309: enum byte_sex target_byte_order)
1310: {
1311: frame->ts_pcsq_front = SWAP_LONG(frame->ts_pcsq_front);
1312: frame->ts_pcsq_back = SWAP_LONG(frame->ts_pcsq_back);
1313: frame->ts_pcoq_front = SWAP_LONG(frame->ts_pcoq_front);
1314: frame->ts_pcoq_back = SWAP_LONG(frame->ts_pcoq_back);
1315: frame->ts_psw = SWAP_LONG(frame->ts_psw);
1316: frame->ts_unaligned_faults = SWAP_LONG(frame->ts_unaligned_faults);
1317: frame->ts_fault_address = SWAP_LONG(frame->ts_fault_address);
1318: frame->ts_step_range_start = SWAP_LONG(frame->ts_step_range_start);
1319: frame->ts_step_range_stop = SWAP_LONG(frame->ts_step_range_stop);
1320: }
1321:
1322: void swap_hppa_fp_thread_state(
1323: struct hp_pa_fp_thread_state *fp,
1324: enum byte_sex target_byte_order)
1325: {
1326: fp->ts_fp0 = SWAP_DOUBLE(fp->ts_fp0);
1327: fp->ts_fp1 = SWAP_DOUBLE(fp->ts_fp1);
1328: fp->ts_fp2 = SWAP_DOUBLE(fp->ts_fp2);
1329: fp->ts_fp3 = SWAP_DOUBLE(fp->ts_fp3);
1330: fp->ts_fp4 = SWAP_DOUBLE(fp->ts_fp4);
1331: fp->ts_fp5 = SWAP_DOUBLE(fp->ts_fp5);
1332: fp->ts_fp6 = SWAP_DOUBLE(fp->ts_fp6);
1333: fp->ts_fp7 = SWAP_DOUBLE(fp->ts_fp7);
1334: fp->ts_fp8 = SWAP_DOUBLE(fp->ts_fp8);
1335: fp->ts_fp9 = SWAP_DOUBLE(fp->ts_fp9);
1336: fp->ts_fp10 = SWAP_DOUBLE(fp->ts_fp10);
1337: fp->ts_fp11 = SWAP_DOUBLE(fp->ts_fp11);
1338: fp->ts_fp12 = SWAP_DOUBLE(fp->ts_fp12);
1339: fp->ts_fp13 = SWAP_DOUBLE(fp->ts_fp13);
1340: fp->ts_fp14 = SWAP_DOUBLE(fp->ts_fp14);
1341: fp->ts_fp15 = SWAP_DOUBLE(fp->ts_fp15);
1342: fp->ts_fp16 = SWAP_DOUBLE(fp->ts_fp16);
1343: fp->ts_fp17 = SWAP_DOUBLE(fp->ts_fp17);
1344: fp->ts_fp18 = SWAP_DOUBLE(fp->ts_fp18);
1345: fp->ts_fp19 = SWAP_DOUBLE(fp->ts_fp19);
1346: fp->ts_fp20 = SWAP_DOUBLE(fp->ts_fp20);
1347: fp->ts_fp21 = SWAP_DOUBLE(fp->ts_fp21);
1348: fp->ts_fp22 = SWAP_DOUBLE(fp->ts_fp22);
1349: fp->ts_fp23 = SWAP_DOUBLE(fp->ts_fp23);
1350: fp->ts_fp24 = SWAP_DOUBLE(fp->ts_fp24);
1351: fp->ts_fp25 = SWAP_DOUBLE(fp->ts_fp25);
1352: fp->ts_fp26 = SWAP_DOUBLE(fp->ts_fp26);
1353: fp->ts_fp27 = SWAP_DOUBLE(fp->ts_fp27);
1354: fp->ts_fp28 = SWAP_DOUBLE(fp->ts_fp28);
1355: fp->ts_fp29 = SWAP_DOUBLE(fp->ts_fp29);
1356: fp->ts_fp30 = SWAP_DOUBLE(fp->ts_fp30);
1357: fp->ts_fp31 = SWAP_DOUBLE(fp->ts_fp31);
1358: }
1359:
1360: void
1361: swap_sparc_thread_state_regs(
1362: struct sparc_thread_state_regs *cpu,
1363: enum byte_sex target_byte_sex)
1364: {
1365: enum byte_sex host_byte_sex = get_host_byte_sex();
1366: struct p_status *pr_status = (struct p_status *) &(cpu->regs.r_psr);
1367:
1368: struct swapped_psr {
1369: union {
1370: struct {
1371: unsigned int
1372: cwp:BITS_WIDTH(4,0),
1373: et:BIT_WIDTH(5),
1374: ps:BIT_WIDTH(6),
1375: s:BIT_WIDTH(7),
1376: pil:BITS_WIDTH(11,8),
1377: ef:BIT_WIDTH(12),
1378: ec:BIT_WIDTH(13),
1379: reserved:BITS_WIDTH(19,14),
1380: icc:BITS_WIDTH(23,20),
1381: ver:BITS_WIDTH(27,24),
1382: impl:BITS_WIDTH(31,28);
1383: } fields;
1384: unsigned int word;
1385: } u;
1386: } spsr;
1387:
1388: cpu->regs.r_pc = SWAP_LONG(cpu->regs.r_pc);
1389: cpu->regs.r_npc = SWAP_LONG(cpu->regs.r_npc);
1390: cpu->regs.r_y = SWAP_LONG(cpu->regs.r_y);
1391: cpu->regs.r_g1 = SWAP_LONG(cpu->regs.r_g1);
1392: cpu->regs.r_g2 = SWAP_LONG(cpu->regs.r_g2);
1393: cpu->regs.r_g3 = SWAP_LONG(cpu->regs.r_g3);
1394: cpu->regs.r_g4 = SWAP_LONG(cpu->regs.r_g4);
1395: cpu->regs.r_g5 = SWAP_LONG(cpu->regs.r_g5);
1396: cpu->regs.r_g6 = SWAP_LONG(cpu->regs.r_g6);
1397: cpu->regs.r_g7 = SWAP_LONG(cpu->regs.r_g7);
1398: cpu->regs.r_o0 = SWAP_LONG(cpu->regs.r_o0);
1399: cpu->regs.r_o1 = SWAP_LONG(cpu->regs.r_o1);
1400: cpu->regs.r_o2 = SWAP_LONG(cpu->regs.r_o2);
1401: cpu->regs.r_o3 = SWAP_LONG(cpu->regs.r_o3);
1402: cpu->regs.r_o4 = SWAP_LONG(cpu->regs.r_o4);
1403: cpu->regs.r_o5 = SWAP_LONG(cpu->regs.r_o5);
1404: cpu->regs.r_o6 = SWAP_LONG(cpu->regs.r_o6);
1405: cpu->regs.r_o7 = SWAP_LONG(cpu->regs.r_o7);
1406:
1407: if (target_byte_sex == host_byte_sex) {
1408: memcpy(&spsr, &(cpu->regs.r_psr), sizeof(struct swapped_psr));
1409: spsr.u.word = SWAP_LONG(spsr.u.word);
1410: pr_status->PSRREG.psr_bits.cwp = spsr.u.fields.cwp;
1411: pr_status->PSRREG.psr_bits.ps = spsr.u.fields.ps;
1412: pr_status->PSRREG.psr_bits.s = spsr.u.fields.s;
1413: pr_status->PSRREG.psr_bits.pil = spsr.u.fields.pil;
1414: pr_status->PSRREG.psr_bits.ef = spsr.u.fields.ef;
1415: pr_status->PSRREG.psr_bits.ec = spsr.u.fields.ec;
1416: pr_status->PSRREG.psr_bits.reserved = spsr.u.fields.reserved;
1417: pr_status->PSRREG.psr_bits.icc = spsr.u.fields.icc;
1418: pr_status->PSRREG.psr_bits.et = spsr.u.fields.ver;
1419: pr_status->PSRREG.psr_bits.impl = spsr.u.fields.impl;
1420: } else {
1421: spsr.u.fields.cwp = pr_status->PSRREG.psr_bits.cwp;
1422: spsr.u.fields.ps = pr_status->PSRREG.psr_bits.ps;
1423: spsr.u.fields.s = pr_status->PSRREG.psr_bits.s;
1424: spsr.u.fields.pil = pr_status->PSRREG.psr_bits.pil;
1425: spsr.u.fields.ef = pr_status->PSRREG.psr_bits.ef;
1426: spsr.u.fields.ec = pr_status->PSRREG.psr_bits.ec;
1427: spsr.u.fields.reserved = pr_status->PSRREG.psr_bits.reserved;
1428: spsr.u.fields.icc = pr_status->PSRREG.psr_bits.icc;
1429: spsr.u.fields.ver = pr_status->PSRREG.psr_bits.et;
1430: spsr.u.fields.impl = pr_status->PSRREG.psr_bits.impl;
1431: spsr.u.word = SWAP_LONG(spsr.u.word);
1432: memcpy(&(cpu->regs.r_psr), &spsr, sizeof(struct swapped_psr));
1433: }
1434: }
1435:
1436: void
1437: swap_sparc_thread_state_fpu(
1438: struct sparc_thread_state_fpu *fpu,
1439: enum byte_sex target_byte_sex)
1440: {
1441: enum byte_sex host_byte_sex = get_host_byte_sex();
1442: int i;
1443: struct f_status *fpu_status = (struct f_status *) &(fpu->fpu.Fpu_fsr);
1444:
1445: struct swapped_fsr {
1446: union {
1447: struct {
1448: unsigned int
1449: cexc:BITS_WIDTH(4,0),
1450: aexc:BITS_WIDTH(9,5),
1451: fcc:BITS_WIDTH(11,10),
1452: pr:BIT_WIDTH(12),
1453: qne:BIT_WIDTH(13),
1454: ftt:BITS_WIDTH(16,14),
1455: res:BITS_WIDTH(22,17),
1456: tem:BITS_WIDTH(27,23),
1457: rp:BITS_WIDTH(29,28),
1458: rd:BITS_WIDTH(31,30);
1459: } fields;
1460: unsigned int word;
1461: } u;
1462: } sfsr;
1463:
1464:
1465: /* floating point registers */
1466: for (i=0; i<16; i++) /* 16 doubles */
1467: fpu->fpu.fpu_fr.Fpu_dregs[i] = SWAP_DOUBLE(fpu->fpu.fpu_fr.Fpu_dregs[i]);
1468: fpu->fpu.Fpu_q[0].FQu.whole = SWAP_DOUBLE(fpu->fpu.Fpu_q[0].FQu.whole);
1469: fpu->fpu.Fpu_q[1].FQu.whole = SWAP_DOUBLE(fpu->fpu.Fpu_q[1].FQu.whole);
1470: fpu->fpu.Fpu_flags = SWAP_LONG(fpu->fpu.Fpu_flags);
1471: fpu->fpu.Fpu_extra = SWAP_LONG(fpu->fpu.Fpu_extra);
1472: fpu->fpu.Fpu_qcnt = SWAP_LONG(fpu->fpu.Fpu_qcnt);
1473:
1474: if (target_byte_sex == host_byte_sex) {
1475: memcpy(&sfsr, &(fpu->fpu.Fpu_fsr), sizeof(unsigned int));
1476: sfsr.u.word = SWAP_LONG(sfsr.u.word);
1477: fpu_status->FPUREG.Fpu_fsr_bits.rd = sfsr.u.fields.rd;
1478: fpu_status->FPUREG.Fpu_fsr_bits.rp = sfsr.u.fields.rp;
1479: fpu_status->FPUREG.Fpu_fsr_bits.tem = sfsr.u.fields.tem;
1480: fpu_status->FPUREG.Fpu_fsr_bits.res = sfsr.u.fields.res;
1481: fpu_status->FPUREG.Fpu_fsr_bits.ftt = sfsr.u.fields.ftt;
1482: fpu_status->FPUREG.Fpu_fsr_bits.qne = sfsr.u.fields.qne;
1483: fpu_status->FPUREG.Fpu_fsr_bits.pr = sfsr.u.fields.pr;
1484: fpu_status->FPUREG.Fpu_fsr_bits.fcc = sfsr.u.fields.fcc;
1485: fpu_status->FPUREG.Fpu_fsr_bits.aexc = sfsr.u.fields.aexc;
1486: fpu_status->FPUREG.Fpu_fsr_bits.cexc = sfsr.u.fields.cexc;
1487: } else {
1488: sfsr.u.fields.rd = fpu_status->FPUREG.Fpu_fsr_bits.rd;
1489: sfsr.u.fields.rp = fpu_status->FPUREG.Fpu_fsr_bits.rp;
1490: sfsr.u.fields.tem = fpu_status->FPUREG.Fpu_fsr_bits.tem;
1491: sfsr.u.fields.res = fpu_status->FPUREG.Fpu_fsr_bits.res;
1492: sfsr.u.fields.ftt = fpu_status->FPUREG.Fpu_fsr_bits.ftt;
1493: sfsr.u.fields.qne = fpu_status->FPUREG.Fpu_fsr_bits.qne;
1494: sfsr.u.fields.pr = fpu_status->FPUREG.Fpu_fsr_bits.pr;
1495: sfsr.u.fields.fcc = fpu_status->FPUREG.Fpu_fsr_bits.fcc;
1496: sfsr.u.fields.aexc = fpu_status->FPUREG.Fpu_fsr_bits.aexc;
1497: sfsr.u.fields.cexc = fpu_status->FPUREG.Fpu_fsr_bits.cexc;
1498: sfsr.u.word = SWAP_LONG(sfsr.u.word);
1499: memcpy(&(fpu->fpu.Fpu_fsr), &sfsr, sizeof(struct swapped_fsr));
1500: }
1501: }
1502:
1503: void
1504: swap_ident_command(
1505: struct ident_command *id_cmd,
1506: enum byte_sex target_byte_sex)
1507: {
1508: id_cmd->cmd = SWAP_LONG(id_cmd->cmd);
1509: id_cmd->cmdsize = SWAP_LONG(id_cmd->cmdsize);
1510: }
1511:
1512: void
1513: swap_nlist(
1514: struct nlist *symbols,
1515: unsigned long nsymbols,
1516: enum byte_sex target_byte_sex)
1517: {
1518: unsigned long i;
1519:
1520: for(i = 0; i < nsymbols; i++){
1521: symbols[i].n_un.n_strx = SWAP_LONG(symbols[i].n_un.n_strx);
1522: /* n_type */
1523: /* n_sect */
1524: symbols[i].n_desc = SWAP_SHORT(symbols[i].n_desc);
1525: symbols[i].n_value = SWAP_LONG(symbols[i].n_value);
1526: }
1527: }
1528:
1529: void
1530: swap_ranlib(
1531: struct ranlib *ranlibs,
1532: unsigned long nranlibs,
1533: enum byte_sex target_byte_sex)
1534: {
1535: unsigned long i;
1536:
1537: for(i = 0; i < nranlibs; i++){
1538: ranlibs[i].ran_un.ran_strx = SWAP_LONG(ranlibs[i].ran_un.ran_strx);
1539: ranlibs[i].ran_off = SWAP_LONG(ranlibs[i].ran_off);
1540: }
1541: }
1542:
1543: void
1544: swap_relocation_info(
1545: struct relocation_info *relocs,
1546: unsigned long nrelocs,
1547: enum byte_sex target_byte_sex)
1548: {
1549: unsigned long i;
1550: enum byte_sex host_byte_sex;
1551: enum bool to_host_byte_sex, scattered;
1552:
1553: struct swapped_relocation_info {
1554: long r_address;
1555: union {
1556: struct {
1557: unsigned int
1558: r_type:4,
1559: r_extern:1,
1560: r_length:2,
1561: r_pcrel:1,
1562: r_symbolnum:24;
1563: } fields;
1564: unsigned long word;
1565: } u;
1566: } sr;
1567:
1568: struct swapped_scattered_relocation_info {
1569: unsigned long word;
1570: long r_value;
1571: } *ssr;
1572:
1573: host_byte_sex = get_host_byte_sex();
1574: to_host_byte_sex = target_byte_sex == host_byte_sex;
1575:
1576: for(i = 0; i < nrelocs; i++){
1577: if(to_host_byte_sex)
1578: scattered = (SWAP_LONG(relocs[i].r_address) & R_SCATTERED) != 0;
1579: else
1580: scattered = ((relocs[i].r_address) & R_SCATTERED) != 0;
1581: if(scattered == FALSE){
1582: if(to_host_byte_sex){
1583: memcpy(&sr, relocs + i, sizeof(struct relocation_info));
1584: sr.r_address = SWAP_LONG(sr.r_address);
1585: sr.u.word = SWAP_LONG(sr.u.word);
1586: relocs[i].r_address = sr.r_address;
1587: relocs[i].r_symbolnum = sr.u.fields.r_symbolnum;
1588: relocs[i].r_pcrel = sr.u.fields.r_pcrel;
1589: relocs[i].r_length = sr.u.fields.r_length;
1590: relocs[i].r_extern = sr.u.fields.r_extern;
1591: relocs[i].r_type = sr.u.fields.r_type;
1592: }
1593: else{
1594: sr.r_address = relocs[i].r_address;
1595: sr.u.fields.r_symbolnum = relocs[i].r_symbolnum;
1596: sr.u.fields.r_length = relocs[i].r_length;
1597: sr.u.fields.r_pcrel = relocs[i].r_pcrel;
1598: sr.u.fields.r_extern = relocs[i].r_extern;
1599: sr.u.fields.r_type = relocs[i].r_type;
1600: sr.r_address = SWAP_LONG(sr.r_address);
1601: sr.u.word = SWAP_LONG(sr.u.word);
1602: memcpy(relocs + i, &sr, sizeof(struct relocation_info));
1603: }
1604: }
1605: else{
1606: ssr = (struct swapped_scattered_relocation_info *)(relocs + i);
1607: ssr->word = SWAP_LONG(ssr->word);
1608: ssr->r_value = SWAP_LONG(ssr->r_value);
1609: }
1610: }
1611: }
1612:
1613: void
1614: swap_indirect_symbols(
1615: unsigned long *indirect_symbols,
1616: unsigned long nindirect_symbols,
1617: enum byte_sex target_byte_sex)
1618: {
1619: unsigned long i;
1620:
1621: for(i = 0; i < nindirect_symbols; i++)
1622: indirect_symbols[i] = SWAP_LONG(indirect_symbols[i]);
1623: }
1624:
1625: void
1626: swap_dylib_reference(
1627: struct dylib_reference *refs,
1628: unsigned long nrefs,
1629: enum byte_sex target_byte_sex)
1630: {
1631: struct swapped_dylib_reference {
1632: union {
1633: struct {
1634: unsigned long
1635: flags:8,
1636: isym:24;
1637: } fields;
1638: unsigned long word;
1639: } u;
1640: } sref;
1641:
1642: unsigned long i;
1643: enum byte_sex host_byte_sex;
1644:
1645: host_byte_sex = get_host_byte_sex();
1646:
1647: for(i = 0; i < nrefs; i++){
1648: if(target_byte_sex == host_byte_sex){
1649: memcpy(&sref, refs + i, sizeof(struct swapped_dylib_reference));
1650: sref.u.word = SWAP_LONG(sref.u.word);
1651: refs[i].flags = sref.u.fields.flags;
1652: refs[i].isym = sref.u.fields.isym;
1653: }
1654: else{
1655: sref.u.fields.isym = refs[i].isym;
1656: sref.u.fields.flags = refs[i].flags;
1657: sref.u.word = SWAP_LONG(sref.u.word);
1658: memcpy(refs + i, &sref, sizeof(struct swapped_dylib_reference));
1659: }
1660: }
1661:
1662: }
1663:
1664: void
1665: swap_dylib_module(
1666: struct dylib_module *mods,
1667: unsigned long nmods,
1668: enum byte_sex target_byte_sex)
1669: {
1670: unsigned long i;
1671:
1672: for(i = 0; i < nmods; i++){
1673: mods[i].module_name = SWAP_LONG(mods[i].module_name);
1674: mods[i].iextdefsym = SWAP_LONG(mods[i].iextdefsym);
1675: mods[i].nextdefsym = SWAP_LONG(mods[i].nextdefsym);
1676: mods[i].irefsym = SWAP_LONG(mods[i].irefsym);
1677: mods[i].nrefsym = SWAP_LONG(mods[i].nrefsym);
1678: mods[i].ilocalsym = SWAP_LONG(mods[i].ilocalsym);
1679: mods[i].nlocalsym = SWAP_LONG(mods[i].nlocalsym);
1680: mods[i].iextrel = SWAP_LONG(mods[i].iextrel);
1681: mods[i].nextrel = SWAP_LONG(mods[i].nextrel);
1682: mods[i].iinit = SWAP_LONG(mods[i].iinit);
1683: mods[i].ninit = SWAP_LONG(mods[i].ninit);
1684: }
1685: }
1686:
1687: void
1688: swap_dylib_table_of_contents(
1689: struct dylib_table_of_contents *tocs,
1690: unsigned long ntocs,
1691: enum byte_sex target_byte_sex)
1692: {
1693: unsigned long i;
1694:
1695: for(i = 0; i < ntocs; i++){
1696: tocs[i].symbol_index = SWAP_LONG(tocs[i].symbol_index);
1697: tocs[i].module_index = SWAP_LONG(tocs[i].module_index);
1698: }
1699: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.