Commit 697a77e6e7357f4ae6c74f06a4fa31701442d79d
Committed by
Blue Swirl
1 parent
ef28c4b0
sparc64 support TSB related MMU registers
Posting updated patch to the list... >>> On Fri, Apr 24, 2009 at 9:42 PM, Blue Swirl <blauwirbel@gmail.com> wrote: >>> > >>> > Nice, though I didn't notice any visible improvement in my tests. >>> >>> This early in boot process there is not much to output; and I test >>> recent kernel which may use different startup sequence. >>> I modified openbios cif handler to output arguments and I now can see >>> visible difference. >>> >>> >>> > >>> > About the patch, there are a few problems: >>> > - it breaks Sparc32 >>> >>> You mean it stops working? >> >> Does not even build. Fixed now. >>> > - commented out code is ugly >>> > - if and else should be on the same line as '{' or '}' >>> > - long lines should be wrapped >>> > - in the line: >>> > + return (((tag_access_register & 0x1fff)<<48)|(tag_access_register >> 22)); >>> > there should be white space between ) and << and 48. >>> > >>> >> >> Also the ")|(" in between is crowded. >> >> Maybe the coding style does not describe this well enough. BTW Supplying indent template would be great. Please see the updated patch qemu-sparc64-tsb-asi-2.patch attached. -- Kind regards, Igor V. Kovalenko
Showing
1 changed file
with
93 additions
and
6 deletions
target-sparc/op_helper.c
... | ... | @@ -39,6 +39,56 @@ do { printf("ASI: " fmt , ##args); } while (0) |
39 | 39 | #endif |
40 | 40 | #endif |
41 | 41 | |
42 | +#ifdef TARGET_SPARC64 | |
43 | +// Calculates TSB pointer value for fault page size 8k or 64k | |
44 | +static uint64_t ultrasparc_tsb_pointer(uint64_t tsb_register, | |
45 | + uint64_t tag_access_register, | |
46 | + int page_size) | |
47 | +{ | |
48 | + uint64_t tsb_base = tsb_register & ~0x1fffULL; | |
49 | + int tsb_split = (env->dmmuregs[5] & 0x1000ULL) ? 1 : 0; | |
50 | + int tsb_size = env->dmmuregs[5] & 0xf; | |
51 | + | |
52 | + // discard lower 13 bits which hold tag access context | |
53 | + uint64_t tag_access_va = tag_access_register & ~0x1fffULL; | |
54 | + | |
55 | + // now reorder bits | |
56 | + uint64_t tsb_base_mask = ~0x1fffULL; | |
57 | + uint64_t va = tag_access_va; | |
58 | + | |
59 | + // move va bits to correct position | |
60 | + if (page_size == 8*1024) { | |
61 | + va >>= 9; | |
62 | + } else if (page_size == 64*1024) { | |
63 | + va >>= 12; | |
64 | + } | |
65 | + | |
66 | + if (tsb_size) { | |
67 | + tsb_base_mask <<= tsb_size; | |
68 | + } | |
69 | + | |
70 | + // calculate tsb_base mask and adjust va if split is in use | |
71 | + if (tsb_split) { | |
72 | + if (page_size == 8*1024) { | |
73 | + va &= ~(1ULL << (13 + tsb_size)); | |
74 | + } else if (page_size == 64*1024) { | |
75 | + va |= (1ULL << (13 + tsb_size)); | |
76 | + } | |
77 | + tsb_base_mask <<= 1; | |
78 | + } | |
79 | + | |
80 | + return ((tsb_base & tsb_base_mask) | (va & ~tsb_base_mask)) & ~0xfULL; | |
81 | +} | |
82 | + | |
83 | +// Calculates tag target register value by reordering bits | |
84 | +// in tag access register | |
85 | +static uint64_t ultrasparc_tag_target(uint64_t tag_access_register) | |
86 | +{ | |
87 | + return ((tag_access_register & 0x1fff) << 48) | (tag_access_register >> 22); | |
88 | +} | |
89 | + | |
90 | +#endif | |
91 | + | |
42 | 92 | static inline void address_mask(CPUState *env1, target_ulong *addr) |
43 | 93 | { |
44 | 94 | #ifdef TARGET_SPARC64 |
... | ... | @@ -1652,13 +1702,31 @@ uint64_t helper_ld_asi(target_ulong addr, int asi, int size, int sign) |
1652 | 1702 | { |
1653 | 1703 | int reg = (addr >> 3) & 0xf; |
1654 | 1704 | |
1655 | - ret = env->immuregs[reg]; | |
1705 | + if (reg == 0) { | |
1706 | + // I-TSB Tag Target register | |
1707 | + ret = ultrasparc_tag_target(env->immuregs[6]); | |
1708 | + } else { | |
1709 | + ret = env->immuregs[reg]; | |
1710 | + } | |
1711 | + | |
1656 | 1712 | break; |
1657 | 1713 | } |
1658 | 1714 | case 0x51: // I-MMU 8k TSB pointer |
1715 | + { | |
1716 | + // env->immuregs[5] holds I-MMU TSB register value | |
1717 | + // env->immuregs[6] holds I-MMU Tag Access register value | |
1718 | + ret = ultrasparc_tsb_pointer(env->immuregs[5], env->immuregs[6], | |
1719 | + 8*1024); | |
1720 | + break; | |
1721 | + } | |
1659 | 1722 | case 0x52: // I-MMU 64k TSB pointer |
1660 | - // XXX | |
1661 | - break; | |
1723 | + { | |
1724 | + // env->immuregs[5] holds I-MMU TSB register value | |
1725 | + // env->immuregs[6] holds I-MMU Tag Access register value | |
1726 | + ret = ultrasparc_tsb_pointer(env->immuregs[5], env->immuregs[6], | |
1727 | + 64*1024); | |
1728 | + break; | |
1729 | + } | |
1662 | 1730 | case 0x55: // I-MMU data access |
1663 | 1731 | { |
1664 | 1732 | int reg = (addr >> 3) & 0x3f; |
... | ... | @@ -1677,7 +1745,28 @@ uint64_t helper_ld_asi(target_ulong addr, int asi, int size, int sign) |
1677 | 1745 | { |
1678 | 1746 | int reg = (addr >> 3) & 0xf; |
1679 | 1747 | |
1680 | - ret = env->dmmuregs[reg]; | |
1748 | + if (reg == 0) { | |
1749 | + // D-TSB Tag Target register | |
1750 | + ret = ultrasparc_tag_target(env->dmmuregs[6]); | |
1751 | + } else { | |
1752 | + ret = env->dmmuregs[reg]; | |
1753 | + } | |
1754 | + break; | |
1755 | + } | |
1756 | + case 0x59: // D-MMU 8k TSB pointer | |
1757 | + { | |
1758 | + // env->dmmuregs[5] holds D-MMU TSB register value | |
1759 | + // env->dmmuregs[6] holds D-MMU Tag Access register value | |
1760 | + ret = ultrasparc_tsb_pointer(env->dmmuregs[5], env->dmmuregs[6], | |
1761 | + 8*1024); | |
1762 | + break; | |
1763 | + } | |
1764 | + case 0x5a: // D-MMU 64k TSB pointer | |
1765 | + { | |
1766 | + // env->dmmuregs[5] holds D-MMU TSB register value | |
1767 | + // env->dmmuregs[6] holds D-MMU Tag Access register value | |
1768 | + ret = ultrasparc_tsb_pointer(env->dmmuregs[5], env->dmmuregs[6], | |
1769 | + 64*1024); | |
1681 | 1770 | break; |
1682 | 1771 | } |
1683 | 1772 | case 0x5d: // D-MMU data access |
... | ... | @@ -1707,8 +1796,6 @@ uint64_t helper_ld_asi(target_ulong addr, int asi, int size, int sign) |
1707 | 1796 | case 0x76: // E-cache tag |
1708 | 1797 | case 0x7e: // E-cache tag |
1709 | 1798 | break; |
1710 | - case 0x59: // D-MMU 8k TSB pointer | |
1711 | - case 0x5a: // D-MMU 64k TSB pointer | |
1712 | 1799 | case 0x5b: // D-MMU data pointer |
1713 | 1800 | case 0x48: // Interrupt dispatch, RO |
1714 | 1801 | case 0x49: // Interrupt data receive | ... | ... |