diff options
author | Ingo Molnar <mingo@kernel.org> | 2017-03-02 02:05:45 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2017-03-02 02:05:45 -0500 |
commit | 9d020d33fc1b2faa0eb35859df1381ca5dc94ffe (patch) | |
tree | adcd4356b93b17b42c9e4ef95c3fea3afa52f3ee | |
parent | 6b0b7551428e4caae1e2c023a529465a9a9ae2d4 (diff) | |
parent | 4977ab6e92e267afe9d8f78438c3db330ca8434c (diff) |
Merge branch 'linus' into perf/urgent, to resolve conflict
Conflicts:
arch/powerpc/configs/85xx/kmp204x_defconfig
Signed-off-by: Ingo Molnar <mingo@kernel.org>
195 files changed, 13074 insertions, 6901 deletions
diff --git a/Documentation/devicetree/bindings/pwm/imx-pwm.txt b/Documentation/devicetree/bindings/pwm/imx-pwm.txt index e00c2e9f484d..c61bdf8cd41b 100644 --- a/Documentation/devicetree/bindings/pwm/imx-pwm.txt +++ b/Documentation/devicetree/bindings/pwm/imx-pwm.txt | |||
@@ -6,8 +6,8 @@ Required properties: | |||
6 | - "fsl,imx1-pwm" for PWM compatible with the one integrated on i.MX1 | 6 | - "fsl,imx1-pwm" for PWM compatible with the one integrated on i.MX1 |
7 | - "fsl,imx27-pwm" for PWM compatible with the one integrated on i.MX27 | 7 | - "fsl,imx27-pwm" for PWM compatible with the one integrated on i.MX27 |
8 | - reg: physical base address and length of the controller's registers | 8 | - reg: physical base address and length of the controller's registers |
9 | - #pwm-cells: should be 2. See pwm.txt in this directory for a description of | 9 | - #pwm-cells: 2 for i.MX1 and 3 for i.MX27 and newer SoCs. See pwm.txt |
10 | the cells format. | 10 | in this directory for a description of the cells format. |
11 | - clocks : Clock specifiers for both ipg and per clocks. | 11 | - clocks : Clock specifiers for both ipg and per clocks. |
12 | - clock-names : Clock names should include both "ipg" and "per" | 12 | - clock-names : Clock names should include both "ipg" and "per" |
13 | See the clock consumer binding, | 13 | See the clock consumer binding, |
@@ -17,7 +17,7 @@ See the clock consumer binding, | |||
17 | Example: | 17 | Example: |
18 | 18 | ||
19 | pwm1: pwm@53fb4000 { | 19 | pwm1: pwm@53fb4000 { |
20 | #pwm-cells = <2>; | 20 | #pwm-cells = <3>; |
21 | compatible = "fsl,imx53-pwm", "fsl,imx27-pwm"; | 21 | compatible = "fsl,imx53-pwm", "fsl,imx27-pwm"; |
22 | reg = <0x53fb4000 0x4000>; | 22 | reg = <0x53fb4000 0x4000>; |
23 | clocks = <&clks IMX5_CLK_PWM1_IPG_GATE>, | 23 | clocks = <&clks IMX5_CLK_PWM1_IPG_GATE>, |
diff --git a/Documentation/devicetree/bindings/thermal/qoriq-thermal.txt b/Documentation/devicetree/bindings/thermal/qoriq-thermal.txt index 66223d561972..20ca4ef9d776 100644 --- a/Documentation/devicetree/bindings/thermal/qoriq-thermal.txt +++ b/Documentation/devicetree/bindings/thermal/qoriq-thermal.txt | |||
@@ -17,6 +17,12 @@ Required properties: | |||
17 | calibration data, as specified by the SoC reference manual. | 17 | calibration data, as specified by the SoC reference manual. |
18 | The first cell of each pair is the value to be written to TTCFGR, | 18 | The first cell of each pair is the value to be written to TTCFGR, |
19 | and the second is the value to be written to TSCFGR. | 19 | and the second is the value to be written to TSCFGR. |
20 | - #thermal-sensor-cells : Must be 1. The sensor specifier is the monitoring | ||
21 | site ID, and represents the "n" in TRITSRn and TRATSRn. | ||
22 | |||
23 | Optional property: | ||
24 | - little-endian : If present, the TMU registers are little endian. If absent, | ||
25 | the default is big endian. | ||
20 | 26 | ||
21 | Example: | 27 | Example: |
22 | 28 | ||
@@ -60,4 +66,5 @@ tmu@f0000 { | |||
60 | 66 | ||
61 | 0x00030000 0x00000012 | 67 | 0x00030000 0x00000012 |
62 | 0x00030001 0x0000001d>; | 68 | 0x00030001 0x0000001d>; |
69 | #thermal-sensor-cells = <1>; | ||
63 | }; | 70 | }; |
diff --git a/Documentation/devicetree/bindings/thermal/rcar-gen3-thermal.txt b/Documentation/devicetree/bindings/thermal/rcar-gen3-thermal.txt new file mode 100644 index 000000000000..07a9713ae6a7 --- /dev/null +++ b/Documentation/devicetree/bindings/thermal/rcar-gen3-thermal.txt | |||
@@ -0,0 +1,56 @@ | |||
1 | * DT bindings for Renesas R-Car Gen3 Thermal Sensor driver | ||
2 | |||
3 | On R-Car Gen3 SoCs, the thermal sensor controllers (TSC) control the thermal | ||
4 | sensors (THS) which are the analog circuits for measuring temperature (Tj) | ||
5 | inside the LSI. | ||
6 | |||
7 | Required properties: | ||
8 | - compatible : "renesas,<soctype>-thermal", | ||
9 | Examples with soctypes are: | ||
10 | - "renesas,r8a7795-thermal" (R-Car H3) | ||
11 | - "renesas,r8a7796-thermal" (R-Car M3-W) | ||
12 | - reg : Address ranges of the thermal registers. Each sensor | ||
13 | needs one address range. Sorting must be done in | ||
14 | increasing order according to datasheet, i.e. | ||
15 | TSC1, TSC2, ... | ||
16 | - clocks : Must contain a reference to the functional clock. | ||
17 | - #thermal-sensor-cells : must be <1>. | ||
18 | |||
19 | Optional properties: | ||
20 | |||
21 | - interrupts : interrupts routed to the TSC (3 for H3 and M3-W) | ||
22 | - power-domain : Must contain a reference to the power domain. This | ||
23 | property is mandatory if the thermal sensor instance | ||
24 | is part of a controllable power domain. | ||
25 | |||
26 | Example: | ||
27 | |||
28 | tsc: thermal@e6198000 { | ||
29 | compatible = "renesas,r8a7795-thermal"; | ||
30 | reg = <0 0xe6198000 0 0x68>, | ||
31 | <0 0xe61a0000 0 0x5c>, | ||
32 | <0 0xe61a8000 0 0x5c>; | ||
33 | interrupts = <GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH>, | ||
34 | <GIC_SPI 68 IRQ_TYPE_LEVEL_HIGH>, | ||
35 | <GIC_SPI 69 IRQ_TYPE_LEVEL_HIGH>; | ||
36 | clocks = <&cpg CPG_MOD 522>; | ||
37 | power-domains = <&sysc R8A7795_PD_ALWAYS_ON>; | ||
38 | #thermal-sensor-cells = <1>; | ||
39 | status = "okay"; | ||
40 | }; | ||
41 | |||
42 | thermal-zones { | ||
43 | sensor_thermal1: sensor-thermal1 { | ||
44 | polling-delay-passive = <250>; | ||
45 | polling-delay = <1000>; | ||
46 | thermal-sensors = <&tsc 0>; | ||
47 | |||
48 | trips { | ||
49 | sensor1_crit: sensor1-crit { | ||
50 | temperature = <90000>; | ||
51 | hysteresis = <2000>; | ||
52 | type = "critical"; | ||
53 | }; | ||
54 | }; | ||
55 | }; | ||
56 | }; | ||
diff --git a/Documentation/devicetree/bindings/thermal/zx2967-thermal.txt b/Documentation/devicetree/bindings/thermal/zx2967-thermal.txt new file mode 100644 index 000000000000..3dc1c6bf0478 --- /dev/null +++ b/Documentation/devicetree/bindings/thermal/zx2967-thermal.txt | |||
@@ -0,0 +1,116 @@ | |||
1 | * ZTE zx2967 family Thermal | ||
2 | |||
3 | Required Properties: | ||
4 | - compatible: should be one of the following. | ||
5 | * zte,zx296718-thermal | ||
6 | - reg: physical base address of the controller and length of memory mapped | ||
7 | region. | ||
8 | - clocks : Pairs of phandle and specifier referencing the controller's clocks. | ||
9 | - clock-names: "topcrm" for the topcrm clock. | ||
10 | "apb" for the apb clock. | ||
11 | - #thermal-sensor-cells: must be 0. | ||
12 | |||
13 | Please note: slope coefficient defined in thermal-zones section need to be | ||
14 | multiplied by 1000. | ||
15 | |||
16 | Example for tempsensor: | ||
17 | |||
18 | tempsensor: tempsensor@148a000 { | ||
19 | compatible = "zte,zx296718-thermal"; | ||
20 | reg = <0x0148a000 0x20>; | ||
21 | clocks = <&topcrm TEMPSENSOR_GATE>, <&audiocrm AUDIO_TS_PCLK>; | ||
22 | clock-names = "topcrm", "apb"; | ||
23 | #thermal-sensor-cells = <0>; | ||
24 | }; | ||
25 | |||
26 | Example for cooling device: | ||
27 | |||
28 | cooling_dev: cooling_dev { | ||
29 | cluster0_cooling_dev: cluster0-cooling-dev { | ||
30 | #cooling-cells = <2>; | ||
31 | cpumask = <0xf>; | ||
32 | capacitance = <1500>; | ||
33 | }; | ||
34 | |||
35 | cluster1_cooling_dev: cluster1-cooling-dev { | ||
36 | #cooling-cells = <2>; | ||
37 | cpumask = <0x30>; | ||
38 | capacitance = <2000>; | ||
39 | }; | ||
40 | }; | ||
41 | |||
42 | Example for thermal zones: | ||
43 | |||
44 | thermal-zones { | ||
45 | zx296718_thermal: zx296718_thermal { | ||
46 | polling-delay-passive = <500>; | ||
47 | polling-delay = <1000>; | ||
48 | sustainable-power = <6500>; | ||
49 | |||
50 | thermal-sensors = <&tempsensor 0>; | ||
51 | /* | ||
52 | * slope need to be multiplied by 1000. | ||
53 | */ | ||
54 | coefficients = <1951 (-922)>; | ||
55 | |||
56 | trips { | ||
57 | trip0: switch_on_temperature { | ||
58 | temperature = <90000>; | ||
59 | hysteresis = <2000>; | ||
60 | type = "passive"; | ||
61 | }; | ||
62 | |||
63 | trip1: desired_temperature { | ||
64 | temperature = <100000>; | ||
65 | hysteresis = <2000>; | ||
66 | type = "passive"; | ||
67 | }; | ||
68 | |||
69 | crit: critical_temperature { | ||
70 | temperature = <110000>; | ||
71 | hysteresis = <2000>; | ||
72 | type = "critical"; | ||
73 | }; | ||
74 | }; | ||
75 | |||
76 | cooling-maps { | ||
77 | map0 { | ||
78 | trip = <&trip0>; | ||
79 | cooling-device = <&gpu 2 5>; | ||
80 | }; | ||
81 | |||
82 | map1 { | ||
83 | trip = <&trip0>; | ||
84 | cooling-device = <&cluster0_cooling_dev 1 2>; | ||
85 | }; | ||
86 | |||
87 | map2 { | ||
88 | trip = <&trip1>; | ||
89 | cooling-device = <&cluster0_cooling_dev 1 2>; | ||
90 | }; | ||
91 | |||
92 | map3 { | ||
93 | trip = <&crit>; | ||
94 | cooling-device = <&cluster0_cooling_dev 1 2>; | ||
95 | }; | ||
96 | |||
97 | map4 { | ||
98 | trip = <&trip0>; | ||
99 | cooling-device = <&cluster1_cooling_dev 1 2>; | ||
100 | contribution = <9000>; | ||
101 | }; | ||
102 | |||
103 | map5 { | ||
104 | trip = <&trip1>; | ||
105 | cooling-device = <&cluster1_cooling_dev 1 2>; | ||
106 | contribution = <4096>; | ||
107 | }; | ||
108 | |||
109 | map6 { | ||
110 | trip = <&crit>; | ||
111 | cooling-device = <&cluster1_cooling_dev 1 2>; | ||
112 | contribution = <4096>; | ||
113 | }; | ||
114 | }; | ||
115 | }; | ||
116 | }; | ||
diff --git a/Documentation/filesystems/f2fs.txt b/Documentation/filesystems/f2fs.txt index 753dd4f96afe..4f6531a4701b 100644 --- a/Documentation/filesystems/f2fs.txt +++ b/Documentation/filesystems/f2fs.txt | |||
@@ -125,13 +125,14 @@ active_logs=%u Support configuring the number of active logs. In the | |||
125 | disable_ext_identify Disable the extension list configured by mkfs, so f2fs | 125 | disable_ext_identify Disable the extension list configured by mkfs, so f2fs |
126 | does not aware of cold files such as media files. | 126 | does not aware of cold files such as media files. |
127 | inline_xattr Enable the inline xattrs feature. | 127 | inline_xattr Enable the inline xattrs feature. |
128 | noinline_xattr Disable the inline xattrs feature. | ||
128 | inline_data Enable the inline data feature: New created small(<~3.4k) | 129 | inline_data Enable the inline data feature: New created small(<~3.4k) |
129 | files can be written into inode block. | 130 | files can be written into inode block. |
130 | inline_dentry Enable the inline dir feature: data in new created | 131 | inline_dentry Enable the inline dir feature: data in new created |
131 | directory entries can be written into inode block. The | 132 | directory entries can be written into inode block. The |
132 | space of inode block which is used to store inline | 133 | space of inode block which is used to store inline |
133 | dentries is limited to ~3.4k. | 134 | dentries is limited to ~3.4k. |
134 | noinline_dentry Diable the inline dentry feature. | 135 | noinline_dentry Disable the inline dentry feature. |
135 | flush_merge Merge concurrent cache_flush commands as much as possible | 136 | flush_merge Merge concurrent cache_flush commands as much as possible |
136 | to eliminate redundant command issues. If the underlying | 137 | to eliminate redundant command issues. If the underlying |
137 | device handles the cache_flush command relatively slowly, | 138 | device handles the cache_flush command relatively slowly, |
@@ -157,6 +158,8 @@ data_flush Enable data flushing before checkpoint in order to | |||
157 | mode=%s Control block allocation mode which supports "adaptive" | 158 | mode=%s Control block allocation mode which supports "adaptive" |
158 | and "lfs". In "lfs" mode, there should be no random | 159 | and "lfs". In "lfs" mode, there should be no random |
159 | writes towards main area. | 160 | writes towards main area. |
161 | io_bits=%u Set the bit size of write IO requests. It should be set | ||
162 | with "mode=lfs". | ||
160 | 163 | ||
161 | ================================================================================ | 164 | ================================================================================ |
162 | DEBUGFS ENTRIES | 165 | DEBUGFS ENTRIES |
@@ -174,7 +177,7 @@ f2fs. Each file shows the whole f2fs information. | |||
174 | SYSFS ENTRIES | 177 | SYSFS ENTRIES |
175 | ================================================================================ | 178 | ================================================================================ |
176 | 179 | ||
177 | Information about mounted f2f2 file systems can be found in | 180 | Information about mounted f2fs file systems can be found in |
178 | /sys/fs/f2fs. Each mounted filesystem will have a directory in | 181 | /sys/fs/f2fs. Each mounted filesystem will have a directory in |
179 | /sys/fs/f2fs based on its device name (i.e., /sys/fs/f2fs/sda). | 182 | /sys/fs/f2fs based on its device name (i.e., /sys/fs/f2fs/sda). |
180 | The files in each per-device directory are shown in table below. | 183 | The files in each per-device directory are shown in table below. |
diff --git a/MAINTAINERS b/MAINTAINERS index 846f97aa3508..00018356f4a5 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
@@ -7483,18 +7483,24 @@ L: linuxppc-dev@lists.ozlabs.org | |||
7483 | Q: http://patchwork.ozlabs.org/project/linuxppc-dev/list/ | 7483 | Q: http://patchwork.ozlabs.org/project/linuxppc-dev/list/ |
7484 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git | 7484 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git |
7485 | S: Supported | 7485 | S: Supported |
7486 | F: Documentation/ABI/stable/sysfs-firmware-opal-* | ||
7487 | F: Documentation/devicetree/bindings/powerpc/opal/ | ||
7488 | F: Documentation/devicetree/bindings/rtc/rtc-opal.txt | ||
7489 | F: Documentation/devicetree/bindings/i2c/i2c-opal.txt | ||
7486 | F: Documentation/powerpc/ | 7490 | F: Documentation/powerpc/ |
7487 | F: arch/powerpc/ | 7491 | F: arch/powerpc/ |
7488 | F: drivers/char/tpm/tpm_ibmvtpm* | 7492 | F: drivers/char/tpm/tpm_ibmvtpm* |
7489 | F: drivers/crypto/nx/ | 7493 | F: drivers/crypto/nx/ |
7490 | F: drivers/crypto/vmx/ | 7494 | F: drivers/crypto/vmx/ |
7495 | F: drivers/i2c/busses/i2c-opal.c | ||
7491 | F: drivers/net/ethernet/ibm/ibmveth.* | 7496 | F: drivers/net/ethernet/ibm/ibmveth.* |
7492 | F: drivers/net/ethernet/ibm/ibmvnic.* | 7497 | F: drivers/net/ethernet/ibm/ibmvnic.* |
7493 | F: drivers/pci/hotplug/pnv_php.c | 7498 | F: drivers/pci/hotplug/pnv_php.c |
7494 | F: drivers/pci/hotplug/rpa* | 7499 | F: drivers/pci/hotplug/rpa* |
7500 | F: drivers/rtc/rtc-opal.c | ||
7495 | F: drivers/scsi/ibmvscsi/ | 7501 | F: drivers/scsi/ibmvscsi/ |
7502 | F: drivers/tty/hvc/hvc_opal.c | ||
7496 | F: tools/testing/selftests/powerpc | 7503 | F: tools/testing/selftests/powerpc |
7497 | N: opal | ||
7498 | N: /pmac | 7504 | N: /pmac |
7499 | N: powermac | 7505 | N: powermac |
7500 | N: powernv | 7506 | N: powernv |
diff --git a/arch/arm64/include/asm/cpufeature.h b/arch/arm64/include/asm/cpufeature.h index 4ce82ed3e7c3..05310ad8c5ab 100644 --- a/arch/arm64/include/asm/cpufeature.h +++ b/arch/arm64/include/asm/cpufeature.h | |||
@@ -184,16 +184,22 @@ static inline u64 arm64_ftr_reg_user_value(const struct arm64_ftr_reg *reg) | |||
184 | } | 184 | } |
185 | 185 | ||
186 | static inline int __attribute_const__ | 186 | static inline int __attribute_const__ |
187 | cpuid_feature_extract_field(u64 features, int field, bool sign) | 187 | cpuid_feature_extract_field_width(u64 features, int field, int width, bool sign) |
188 | { | 188 | { |
189 | return (sign) ? | 189 | return (sign) ? |
190 | cpuid_feature_extract_signed_field(features, field) : | 190 | cpuid_feature_extract_signed_field_width(features, field, width) : |
191 | cpuid_feature_extract_unsigned_field(features, field); | 191 | cpuid_feature_extract_unsigned_field_width(features, field, width); |
192 | } | ||
193 | |||
194 | static inline int __attribute_const__ | ||
195 | cpuid_feature_extract_field(u64 features, int field, bool sign) | ||
196 | { | ||
197 | return cpuid_feature_extract_field_width(features, field, 4, sign); | ||
192 | } | 198 | } |
193 | 199 | ||
194 | static inline s64 arm64_ftr_value(const struct arm64_ftr_bits *ftrp, u64 val) | 200 | static inline s64 arm64_ftr_value(const struct arm64_ftr_bits *ftrp, u64 val) |
195 | { | 201 | { |
196 | return (s64)cpuid_feature_extract_field(val, ftrp->shift, ftrp->sign); | 202 | return (s64)cpuid_feature_extract_field_width(val, ftrp->shift, ftrp->width, ftrp->sign); |
197 | } | 203 | } |
198 | 204 | ||
199 | static inline bool id_aa64mmfr0_mixed_endian_el0(u64 mmfr0) | 205 | static inline bool id_aa64mmfr0_mixed_endian_el0(u64 mmfr0) |
diff --git a/arch/arm64/mm/mmu.c b/arch/arm64/mm/mmu.c index b805c017f789..d28dbcf596b6 100644 --- a/arch/arm64/mm/mmu.c +++ b/arch/arm64/mm/mmu.c | |||
@@ -109,10 +109,8 @@ static bool pgattr_change_is_safe(u64 old, u64 new) | |||
109 | static void alloc_init_pte(pmd_t *pmd, unsigned long addr, | 109 | static void alloc_init_pte(pmd_t *pmd, unsigned long addr, |
110 | unsigned long end, unsigned long pfn, | 110 | unsigned long end, unsigned long pfn, |
111 | pgprot_t prot, | 111 | pgprot_t prot, |
112 | phys_addr_t (*pgtable_alloc)(void), | 112 | phys_addr_t (*pgtable_alloc)(void)) |
113 | bool page_mappings_only) | ||
114 | { | 113 | { |
115 | pgprot_t __prot = prot; | ||
116 | pte_t *pte; | 114 | pte_t *pte; |
117 | 115 | ||
118 | BUG_ON(pmd_sect(*pmd)); | 116 | BUG_ON(pmd_sect(*pmd)); |
@@ -130,18 +128,7 @@ static void alloc_init_pte(pmd_t *pmd, unsigned long addr, | |||
130 | do { | 128 | do { |
131 | pte_t old_pte = *pte; | 129 | pte_t old_pte = *pte; |
132 | 130 | ||
133 | /* | 131 | set_pte(pte, pfn_pte(pfn, prot)); |
134 | * Set the contiguous bit for the subsequent group of PTEs if | ||
135 | * its size and alignment are appropriate. | ||
136 | */ | ||
137 | if (((addr | PFN_PHYS(pfn)) & ~CONT_PTE_MASK) == 0) { | ||
138 | if (end - addr >= CONT_PTE_SIZE && !page_mappings_only) | ||
139 | __prot = __pgprot(pgprot_val(prot) | PTE_CONT); | ||
140 | else | ||
141 | __prot = prot; | ||
142 | } | ||
143 | |||
144 | set_pte(pte, pfn_pte(pfn, __prot)); | ||
145 | pfn++; | 132 | pfn++; |
146 | 133 | ||
147 | /* | 134 | /* |
@@ -160,7 +147,6 @@ static void alloc_init_pmd(pud_t *pud, unsigned long addr, unsigned long end, | |||
160 | phys_addr_t (*pgtable_alloc)(void), | 147 | phys_addr_t (*pgtable_alloc)(void), |
161 | bool page_mappings_only) | 148 | bool page_mappings_only) |
162 | { | 149 | { |
163 | pgprot_t __prot = prot; | ||
164 | pmd_t *pmd; | 150 | pmd_t *pmd; |
165 | unsigned long next; | 151 | unsigned long next; |
166 | 152 | ||
@@ -187,18 +173,7 @@ static void alloc_init_pmd(pud_t *pud, unsigned long addr, unsigned long end, | |||
187 | /* try section mapping first */ | 173 | /* try section mapping first */ |
188 | if (((addr | next | phys) & ~SECTION_MASK) == 0 && | 174 | if (((addr | next | phys) & ~SECTION_MASK) == 0 && |
189 | !page_mappings_only) { | 175 | !page_mappings_only) { |
190 | /* | 176 | pmd_set_huge(pmd, phys, prot); |
191 | * Set the contiguous bit for the subsequent group of | ||
192 | * PMDs if its size and alignment are appropriate. | ||
193 | */ | ||
194 | if (((addr | phys) & ~CONT_PMD_MASK) == 0) { | ||
195 | if (end - addr >= CONT_PMD_SIZE) | ||
196 | __prot = __pgprot(pgprot_val(prot) | | ||
197 | PTE_CONT); | ||
198 | else | ||
199 | __prot = prot; | ||
200 | } | ||
201 | pmd_set_huge(pmd, phys, __prot); | ||
202 | 177 | ||
203 | /* | 178 | /* |
204 | * After the PMD entry has been populated once, we | 179 | * After the PMD entry has been populated once, we |
@@ -208,8 +183,7 @@ static void alloc_init_pmd(pud_t *pud, unsigned long addr, unsigned long end, | |||
208 | pmd_val(*pmd))); | 183 | pmd_val(*pmd))); |
209 | } else { | 184 | } else { |
210 | alloc_init_pte(pmd, addr, next, __phys_to_pfn(phys), | 185 | alloc_init_pte(pmd, addr, next, __phys_to_pfn(phys), |
211 | prot, pgtable_alloc, | 186 | prot, pgtable_alloc); |
212 | page_mappings_only); | ||
213 | 187 | ||
214 | BUG_ON(pmd_val(old_pmd) != 0 && | 188 | BUG_ON(pmd_val(old_pmd) != 0 && |
215 | pmd_val(old_pmd) != pmd_val(*pmd)); | 189 | pmd_val(old_pmd) != pmd_val(*pmd)); |
diff --git a/arch/arm64/mm/proc.S b/arch/arm64/mm/proc.S index cd4d53d7e458..877d42fb0df6 100644 --- a/arch/arm64/mm/proc.S +++ b/arch/arm64/mm/proc.S | |||
@@ -138,7 +138,7 @@ ENDPROC(cpu_do_resume) | |||
138 | * - pgd_phys - physical address of new TTB | 138 | * - pgd_phys - physical address of new TTB |
139 | */ | 139 | */ |
140 | ENTRY(cpu_do_switch_mm) | 140 | ENTRY(cpu_do_switch_mm) |
141 | pre_ttbr0_update_workaround x0, x1, x2 | 141 | pre_ttbr0_update_workaround x0, x2, x3 |
142 | mmid x1, x1 // get mm->context.id | 142 | mmid x1, x1 // get mm->context.id |
143 | bfi x0, x1, #48, #16 // set the ASID | 143 | bfi x0, x1, #48, #16 // set the ASID |
144 | msr ttbr0_el1, x0 // set TTBR0 | 144 | msr ttbr0_el1, x0 // set TTBR0 |
diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig index 8582121d7a45..494091762bd7 100644 --- a/arch/powerpc/Kconfig +++ b/arch/powerpc/Kconfig | |||
@@ -115,7 +115,7 @@ config PPC | |||
115 | select HAVE_PERF_REGS | 115 | select HAVE_PERF_REGS |
116 | select HAVE_PERF_USER_STACK_DUMP | 116 | select HAVE_PERF_USER_STACK_DUMP |
117 | select HAVE_REGS_AND_STACK_ACCESS_API | 117 | select HAVE_REGS_AND_STACK_ACCESS_API |
118 | select HAVE_HW_BREAKPOINT if PERF_EVENTS && PPC_BOOK3S_64 | 118 | select HAVE_HW_BREAKPOINT if PERF_EVENTS && (PPC_BOOK3S || PPC_8xx) |
119 | select ARCH_WANT_IPC_PARSE_VERSION | 119 | select ARCH_WANT_IPC_PARSE_VERSION |
120 | select SPARSE_IRQ | 120 | select SPARSE_IRQ |
121 | select IRQ_DOMAIN | 121 | select IRQ_DOMAIN |
diff --git a/arch/powerpc/boot/dts/fsl/kmcent2.dts b/arch/powerpc/boot/dts/fsl/kmcent2.dts new file mode 100644 index 000000000000..47afa438602e --- /dev/null +++ b/arch/powerpc/boot/dts/fsl/kmcent2.dts | |||
@@ -0,0 +1,303 @@ | |||
1 | /* | ||
2 | * Keymile kmcent2 Device Tree Source, based on T1040RDB DTS | ||
3 | * | ||
4 | * (C) Copyright 2016 | ||
5 | * Valentin Longchamp, Keymile AG, valentin.longchamp@keymile.com | ||
6 | * | ||
7 | * Copyright 2014 - 2015 Freescale Semiconductor Inc. | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or modify it | ||
10 | * under the terms of the GNU General Public License as published by the | ||
11 | * Free Software Foundation; either version 2 of the License, or (at your | ||
12 | * option) any later version. | ||
13 | */ | ||
14 | |||
15 | /include/ "t104xsi-pre.dtsi" | ||
16 | |||
17 | / { | ||
18 | model = "keymile,kmcent2"; | ||
19 | compatible = "keymile,kmcent2"; | ||
20 | |||
21 | aliases { | ||
22 | front_phy = &front_phy; | ||
23 | }; | ||
24 | |||
25 | reserved-memory { | ||
26 | #address-cells = <2>; | ||
27 | #size-cells = <2>; | ||
28 | ranges; | ||
29 | |||
30 | bman_fbpr: bman-fbpr { | ||
31 | size = <0 0x1000000>; | ||
32 | alignment = <0 0x1000000>; | ||
33 | }; | ||
34 | qman_fqd: qman-fqd { | ||
35 | size = <0 0x400000>; | ||
36 | alignment = <0 0x400000>; | ||
37 | }; | ||
38 | qman_pfdr: qman-pfdr { | ||
39 | size = <0 0x2000000>; | ||
40 | alignment = <0 0x2000000>; | ||
41 | }; | ||
42 | }; | ||
43 | |||
44 | ifc: localbus@ffe124000 { | ||
45 | reg = <0xf 0xfe124000 0 0x2000>; | ||
46 | ranges = <0 0 0xf 0xe8000000 0x04000000 | ||
47 | 1 0 0xf 0xfa000000 0x00010000 | ||
48 | 2 0 0xf 0xfb000000 0x00010000 | ||
49 | 4 0 0xf 0xc0000000 0x08000000 | ||
50 | 6 0 0xf 0xd0000000 0x08000000 | ||
51 | 7 0 0xf 0xd8000000 0x08000000>; | ||
52 | |||
53 | nor@0,0 { | ||
54 | #address-cells = <1>; | ||
55 | #size-cells = <1>; | ||
56 | compatible = "cfi-flash"; | ||
57 | reg = <0x0 0x0 0x04000000>; | ||
58 | bank-width = <2>; | ||
59 | device-width = <2>; | ||
60 | }; | ||
61 | |||
62 | nand@1,0 { | ||
63 | #address-cells = <1>; | ||
64 | #size-cells = <1>; | ||
65 | compatible = "fsl,ifc-nand"; | ||
66 | reg = <0x1 0x0 0x10000>; | ||
67 | }; | ||
68 | |||
69 | board-control@2,0 { | ||
70 | compatible = "keymile,qriox"; | ||
71 | reg = <0x2 0x0 0x80>; | ||
72 | }; | ||
73 | |||
74 | chassis-mgmt@6,0 { | ||
75 | compatible = "keymile,bfticu"; | ||
76 | reg = <6 0 0x100>; | ||
77 | interrupt-controller; | ||
78 | interrupt-parent = <&mpic>; | ||
79 | interrupts = <11 1 0 0>; | ||
80 | #interrupt-cells = <1>; | ||
81 | }; | ||
82 | |||
83 | }; | ||
84 | |||
85 | memory { | ||
86 | device_type = "memory"; | ||
87 | }; | ||
88 | |||
89 | dcsr: dcsr@f00000000 { | ||
90 | ranges = <0x00000000 0xf 0x00000000 0x01072000>; | ||
91 | }; | ||
92 | |||
93 | bportals: bman-portals@ff4000000 { | ||
94 | ranges = <0x0 0xf 0xf4000000 0x2000000>; | ||
95 | }; | ||
96 | |||
97 | qportals: qman-portals@ff6000000 { | ||
98 | ranges = <0x0 0xf 0xf6000000 0x2000000>; | ||
99 | }; | ||
100 | |||
101 | soc: soc@ffe000000 { | ||
102 | ranges = <0x00000000 0xf 0xfe000000 0x1000000>; | ||
103 | reg = <0xf 0xfe000000 0 0x00001000>; | ||
104 | |||
105 | spi@110000 { | ||
106 | network-clock@1 { | ||
107 | compatible = "zarlink,zl30364"; | ||
108 | reg = <1>; | ||
109 | spi-max-frequency = <1000000>; | ||
110 | }; | ||
111 | }; | ||
112 | |||
113 | sdhc@114000 { | ||
114 | status = "disabled"; | ||
115 | }; | ||
116 | |||
117 | i2c@118000 { | ||
118 | clock-frequency = <100000>; | ||
119 | |||
120 | mux@70 { | ||
121 | compatible = "nxp,pca9547"; | ||
122 | reg = <0x70>; | ||
123 | #address-cells = <1>; | ||
124 | #size-cells = <0>; | ||
125 | i2c-mux-idle-disconnect; | ||
126 | |||
127 | i2c@0 { | ||
128 | reg = <0>; | ||
129 | #address-cells = <1>; | ||
130 | #size-cells = <0>; | ||
131 | |||
132 | eeprom@54 { | ||
133 | compatible = "24c02"; | ||
134 | reg = <0x54>; | ||
135 | pagesize = <2>; | ||
136 | read-only; | ||
137 | label = "ddr3-spd"; | ||
138 | }; | ||
139 | }; | ||
140 | |||
141 | i2c@7 { | ||
142 | reg = <7>; | ||
143 | #address-cells = <1>; | ||
144 | #size-cells = <0>; | ||
145 | |||
146 | temp-sensor@48 { | ||
147 | compatible = "national,lm75"; | ||
148 | reg = <0x48>; | ||
149 | label = "SENSOR_0"; | ||
150 | }; | ||
151 | temp-sensor@4a { | ||
152 | compatible = "national,lm75"; | ||
153 | reg = <0x4a>; | ||
154 | label = "SENSOR_2"; | ||
155 | }; | ||
156 | temp-sensor@4b { | ||
157 | compatible = "national,lm75"; | ||
158 | reg = <0x4b>; | ||
159 | label = "SENSOR_3"; | ||
160 | }; | ||
161 | }; | ||
162 | }; | ||
163 | }; | ||
164 | |||
165 | i2c@118100 { | ||
166 | clock-frequency = <100000>; | ||
167 | |||
168 | eeprom@50 { | ||
169 | compatible = "atmel,24c08"; | ||
170 | reg = <0x50>; | ||
171 | pagesize = <16>; | ||
172 | }; | ||
173 | |||
174 | eeprom@54 { | ||
175 | compatible = "atmel,24c08"; | ||
176 | reg = <0x54>; | ||
177 | pagesize = <16>; | ||
178 | }; | ||
179 | }; | ||
180 | |||
181 | i2c@119000 { | ||
182 | status = "disabled"; | ||
183 | }; | ||
184 | |||
185 | i2c@119100 { | ||
186 | status = "disabled"; | ||
187 | }; | ||
188 | |||
189 | serial2: serial@11d500 { | ||
190 | status = "disabled"; | ||
191 | }; | ||
192 | |||
193 | serial3: serial@11d600 { | ||
194 | status = "disabled"; | ||
195 | }; | ||
196 | |||
197 | usb0: usb@210000 { | ||
198 | status = "disabled"; | ||
199 | }; | ||
200 | usb1: usb@211000 { | ||
201 | status = "disabled"; | ||
202 | }; | ||
203 | |||
204 | display@180000 { | ||
205 | status = "disabled"; | ||
206 | }; | ||
207 | |||
208 | sata@220000 { | ||
209 | status = "disabled"; | ||
210 | }; | ||
211 | sata@221000 { | ||
212 | status = "disabled"; | ||
213 | }; | ||
214 | |||
215 | fman@400000 { | ||
216 | ethernet@e0000 { | ||
217 | fixed-link = <0 1 1000 0 0>; | ||
218 | phy-connection-type = "sgmii"; | ||
219 | }; | ||
220 | |||
221 | ethernet@e2000 { | ||
222 | fixed-link = <1 1 1000 0 0>; | ||
223 | phy-connection-type = "sgmii"; | ||
224 | }; | ||
225 | |||
226 | ethernet@e4000 { | ||
227 | status = "disabled"; | ||
228 | }; | ||
229 | |||
230 | ethernet@e6000 { | ||
231 | status = "disabled"; | ||
232 | }; | ||
233 | |||
234 | ethernet@e8000 { | ||
235 | phy-handle = <&front_phy>; | ||
236 | phy-connection-type = "rgmii"; | ||
237 | }; | ||
238 | |||
239 | mdio0: mdio@fc000 { | ||
240 | front_phy: ethernet-phy@11 { | ||
241 | reg = <0x11>; | ||
242 | }; | ||
243 | }; | ||
244 | }; | ||
245 | }; | ||
246 | |||
247 | |||
248 | pci0: pcie@ffe240000 { | ||
249 | reg = <0xf 0xfe240000 0 0x10000>; | ||
250 | ranges = <0x02000000 0 0xe0000000 0xc 0x00000000 0x0 0x20000000 | ||
251 | 0x01000000 0 0x00000000 0xf 0xf8000000 0x0 0x00010000>; | ||
252 | pcie@0 { | ||
253 | ranges = <0x02000000 0 0xe0000000 | ||
254 | 0x02000000 0 0xe0000000 | ||
255 | 0 0x20000000 | ||
256 | |||
257 | 0x01000000 0 0x00000000 | ||
258 | 0x01000000 0 0x00000000 | ||
259 | 0 0x00010000>; | ||
260 | }; | ||
261 | }; | ||
262 | |||
263 | pci1: pcie@ffe250000 { | ||
264 | status = "disabled"; | ||
265 | }; | ||
266 | |||
267 | pci2: pcie@ffe260000 { | ||
268 | status = "disabled"; | ||
269 | }; | ||
270 | |||
271 | pci3: pcie@ffe270000 { | ||
272 | status = "disabled"; | ||
273 | }; | ||
274 | |||
275 | qe: qe@ffe140000 { | ||
276 | ranges = <0x0 0xf 0xfe140000 0x40000>; | ||
277 | reg = <0xf 0xfe140000 0 0x480>; | ||
278 | brg-frequency = <0>; | ||
279 | bus-frequency = <0>; | ||
280 | |||
281 | si1: si@700 { | ||
282 | compatible = "fsl,t1040-qe-si"; | ||
283 | reg = <0x700 0x80>; | ||
284 | }; | ||
285 | |||
286 | siram1: siram@1000 { | ||
287 | compatible = "fsl,t1040-qe-siram"; | ||
288 | reg = <0x1000 0x800>; | ||
289 | }; | ||
290 | |||
291 | ucc_hdlc: ucc@2000 { | ||
292 | device_type = "hdlc"; | ||
293 | compatible = "fsl,ucc-hdlc"; | ||
294 | rx-clock-name = "clk9"; | ||
295 | tx-clock-name = "clk9"; | ||
296 | fsl,tx-timeslot-mask = <0xfffffffe>; | ||
297 | fsl,rx-timeslot-mask = <0xfffffffe>; | ||
298 | fsl,siram-entry-id = <0>; | ||
299 | }; | ||
300 | }; | ||
301 | }; | ||
302 | |||
303 | #include "t1040si-post.dtsi" | ||
diff --git a/arch/powerpc/boot/dts/fsl/kmcoge4.dts b/arch/powerpc/boot/dts/fsl/kmcoge4.dts index ae70a24094b0..e103c0f3f650 100644 --- a/arch/powerpc/boot/dts/fsl/kmcoge4.dts +++ b/arch/powerpc/boot/dts/fsl/kmcoge4.dts | |||
@@ -83,6 +83,10 @@ | |||
83 | }; | 83 | }; |
84 | }; | 84 | }; |
85 | 85 | ||
86 | sdhc@114000 { | ||
87 | status = "disabled"; | ||
88 | }; | ||
89 | |||
86 | i2c@119000 { | 90 | i2c@119000 { |
87 | status = "disabled"; | 91 | status = "disabled"; |
88 | }; | 92 | }; |
diff --git a/arch/powerpc/boot/dts/fsl/t1023si-post.dtsi b/arch/powerpc/boot/dts/fsl/t1023si-post.dtsi index da2894c59479..4908af501098 100644 --- a/arch/powerpc/boot/dts/fsl/t1023si-post.dtsi +++ b/arch/powerpc/boot/dts/fsl/t1023si-post.dtsi | |||
@@ -422,7 +422,7 @@ | |||
422 | 0x00030001 0x0000000d | 422 | 0x00030001 0x0000000d |
423 | 0x00030002 0x00000019 | 423 | 0x00030002 0x00000019 |
424 | 0x00030003 0x00000024>; | 424 | 0x00030003 0x00000024>; |
425 | #thermal-sensor-cells = <0>; | 425 | #thermal-sensor-cells = <1>; |
426 | }; | 426 | }; |
427 | 427 | ||
428 | thermal-zones { | 428 | thermal-zones { |
@@ -430,7 +430,7 @@ | |||
430 | polling-delay-passive = <1000>; | 430 | polling-delay-passive = <1000>; |
431 | polling-delay = <5000>; | 431 | polling-delay = <5000>; |
432 | 432 | ||
433 | thermal-sensors = <&tmu>; | 433 | thermal-sensors = <&tmu 0>; |
434 | 434 | ||
435 | trips { | 435 | trips { |
436 | cpu_alert: cpu-alert { | 436 | cpu_alert: cpu-alert { |
diff --git a/arch/powerpc/boot/dts/fsl/t1040si-post.dtsi b/arch/powerpc/boot/dts/fsl/t1040si-post.dtsi index 44e399b17f6f..145c7f43b5b6 100644 --- a/arch/powerpc/boot/dts/fsl/t1040si-post.dtsi +++ b/arch/powerpc/boot/dts/fsl/t1040si-post.dtsi | |||
@@ -526,7 +526,7 @@ | |||
526 | 526 | ||
527 | 0x00030000 0x00000012 | 527 | 0x00030000 0x00000012 |
528 | 0x00030001 0x0000001d>; | 528 | 0x00030001 0x0000001d>; |
529 | #thermal-sensor-cells = <0>; | 529 | #thermal-sensor-cells = <1>; |
530 | }; | 530 | }; |
531 | 531 | ||
532 | thermal-zones { | 532 | thermal-zones { |
@@ -534,7 +534,7 @@ | |||
534 | polling-delay-passive = <1000>; | 534 | polling-delay-passive = <1000>; |
535 | polling-delay = <5000>; | 535 | polling-delay = <5000>; |
536 | 536 | ||
537 | thermal-sensors = <&tmu>; | 537 | thermal-sensors = <&tmu 2>; |
538 | 538 | ||
539 | trips { | 539 | trips { |
540 | cpu_alert: cpu-alert { | 540 | cpu_alert: cpu-alert { |
diff --git a/arch/powerpc/configs/85xx/kmp204x_defconfig b/arch/powerpc/configs/85xx/kmp204x_defconfig deleted file mode 100644 index 34a4da23f000..000000000000 --- a/arch/powerpc/configs/85xx/kmp204x_defconfig +++ /dev/null | |||
@@ -1,220 +0,0 @@ | |||
1 | CONFIG_PPC_85xx=y | ||
2 | CONFIG_SMP=y | ||
3 | CONFIG_NR_CPUS=8 | ||
4 | CONFIG_SYSVIPC=y | ||
5 | CONFIG_POSIX_MQUEUE=y | ||
6 | CONFIG_AUDIT=y | ||
7 | CONFIG_NO_HZ=y | ||
8 | CONFIG_HIGH_RES_TIMERS=y | ||
9 | CONFIG_BSD_PROCESS_ACCT=y | ||
10 | CONFIG_IKCONFIG=y | ||
11 | CONFIG_IKCONFIG_PROC=y | ||
12 | CONFIG_LOG_BUF_SHIFT=14 | ||
13 | CONFIG_CGROUPS=y | ||
14 | CONFIG_CGROUP_SCHED=y | ||
15 | CONFIG_RELAY=y | ||
16 | CONFIG_BLK_DEV_INITRD=y | ||
17 | CONFIG_KALLSYMS_ALL=y | ||
18 | CONFIG_EMBEDDED=y | ||
19 | CONFIG_PERF_EVENTS=y | ||
20 | CONFIG_SLAB=y | ||
21 | CONFIG_MODULES=y | ||
22 | CONFIG_MODULE_UNLOAD=y | ||
23 | CONFIG_MODULE_FORCE_UNLOAD=y | ||
24 | CONFIG_MODVERSIONS=y | ||
25 | # CONFIG_BLK_DEV_BSG is not set | ||
26 | CONFIG_PARTITION_ADVANCED=y | ||
27 | CONFIG_MAC_PARTITION=y | ||
28 | CONFIG_CORENET_GENERIC=y | ||
29 | CONFIG_MPIC_MSGR=y | ||
30 | CONFIG_HIGHMEM=y | ||
31 | # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set | ||
32 | CONFIG_BINFMT_MISC=m | ||
33 | CONFIG_KEXEC=y | ||
34 | CONFIG_FORCE_MAX_ZONEORDER=13 | ||
35 | CONFIG_PCI=y | ||
36 | CONFIG_PCIEPORTBUS=y | ||
37 | # CONFIG_PCIEASPM is not set | ||
38 | CONFIG_PCI_MSI=y | ||
39 | CONFIG_ADVANCED_OPTIONS=y | ||
40 | CONFIG_LOWMEM_SIZE_BOOL=y | ||
41 | CONFIG_LOWMEM_SIZE=0x20000000 | ||
42 | CONFIG_NET=y | ||
43 | CONFIG_PACKET=y | ||
44 | CONFIG_UNIX=y | ||
45 | CONFIG_XFRM_USER=y | ||
46 | CONFIG_XFRM_SUB_POLICY=y | ||
47 | CONFIG_XFRM_STATISTICS=y | ||
48 | CONFIG_NET_KEY=y | ||
49 | CONFIG_NET_KEY_MIGRATE=y | ||
50 | CONFIG_INET=y | ||
51 | CONFIG_IP_MULTICAST=y | ||
52 | CONFIG_IP_ADVANCED_ROUTER=y | ||
53 | CONFIG_IP_MULTIPLE_TABLES=y | ||
54 | CONFIG_IP_ROUTE_MULTIPATH=y | ||
55 | CONFIG_IP_ROUTE_VERBOSE=y | ||
56 | CONFIG_IP_PNP=y | ||
57 | CONFIG_IP_PNP_DHCP=y | ||
58 | CONFIG_IP_PNP_BOOTP=y | ||
59 | CONFIG_IP_PNP_RARP=y | ||
60 | CONFIG_NET_IPIP=y | ||
61 | CONFIG_IP_MROUTE=y | ||
62 | CONFIG_IP_PIMSM_V1=y | ||
63 | CONFIG_IP_PIMSM_V2=y | ||
64 | CONFIG_INET_AH=y | ||
65 | CONFIG_INET_ESP=y | ||
66 | CONFIG_INET_IPCOMP=y | ||
67 | CONFIG_IPV6=y | ||
68 | CONFIG_IP_SCTP=m | ||
69 | CONFIG_TIPC=y | ||
70 | CONFIG_NET_SCHED=y | ||
71 | CONFIG_NET_SCH_CBQ=y | ||
72 | CONFIG_NET_SCH_HTB=y | ||
73 | CONFIG_NET_SCH_HFSC=y | ||
74 | CONFIG_NET_SCH_PRIO=y | ||
75 | CONFIG_NET_SCH_MULTIQ=y | ||
76 | CONFIG_NET_SCH_RED=y | ||
77 | CONFIG_NET_SCH_SFQ=y | ||
78 | CONFIG_NET_SCH_TEQL=y | ||
79 | CONFIG_NET_SCH_TBF=y | ||
80 | CONFIG_NET_SCH_GRED=y | ||
81 | CONFIG_NET_CLS_BASIC=y | ||
82 | CONFIG_NET_CLS_TCINDEX=y | ||
83 | CONFIG_NET_CLS_U32=y | ||
84 | CONFIG_CLS_U32_PERF=y | ||
85 | CONFIG_CLS_U32_MARK=y | ||
86 | CONFIG_NET_CLS_FLOW=y | ||
87 | CONFIG_NET_CLS_CGROUP=y | ||
88 | CONFIG_UEVENT_HELPER_PATH="/sbin/mdev" | ||
89 | CONFIG_DEVTMPFS=y | ||
90 | CONFIG_MTD=y | ||
91 | CONFIG_MTD_CMDLINE_PARTS=y | ||
92 | CONFIG_MTD_BLOCK=y | ||
93 | CONFIG_MTD_CFI=y | ||
94 | CONFIG_MTD_CFI_AMDSTD=y | ||
95 | CONFIG_MTD_PHYSMAP_OF=y | ||
96 | CONFIG_MTD_PHRAM=y | ||
97 | CONFIG_MTD_NAND=y | ||
98 | CONFIG_MTD_NAND_ECC_BCH=y | ||
99 | CONFIG_MTD_NAND_FSL_ELBC=y | ||
100 | CONFIG_MTD_UBI=y | ||
101 | CONFIG_MTD_UBI_GLUEBI=y | ||
102 | CONFIG_BLK_DEV_LOOP=y | ||
103 | CONFIG_BLK_DEV_RAM=y | ||
104 | CONFIG_BLK_DEV_RAM_COUNT=2 | ||
105 | CONFIG_BLK_DEV_RAM_SIZE=2048 | ||
106 | CONFIG_EEPROM_AT24=y | ||
107 | CONFIG_SCSI=y | ||
108 | CONFIG_BLK_DEV_SD=y | ||
109 | CONFIG_CHR_DEV_ST=y | ||
110 | CONFIG_BLK_DEV_SR=y | ||
111 | CONFIG_CHR_DEV_SG=y | ||
112 | CONFIG_SCSI_LOGGING=y | ||
113 | CONFIG_SCSI_SYM53C8XX_2=y | ||
114 | CONFIG_NETDEVICES=y | ||
115 | # CONFIG_NET_VENDOR_3COM is not set | ||
116 | # CONFIG_NET_VENDOR_ADAPTEC is not set | ||
117 | # CONFIG_NET_VENDOR_ALTEON is not set | ||
118 | # CONFIG_NET_VENDOR_AMD is not set | ||
119 | # CONFIG_NET_VENDOR_ATHEROS is not set | ||
120 | # CONFIG_NET_VENDOR_BROADCOM is not set | ||
121 | # CONFIG_NET_VENDOR_BROCADE is not set | ||
122 | # CONFIG_NET_VENDOR_CHELSIO is not set | ||
123 | # CONFIG_NET_VENDOR_CISCO is not set | ||
124 | # CONFIG_NET_VENDOR_DEC is not set | ||
125 | # CONFIG_NET_VENDOR_DLINK is not set | ||
126 | # CONFIG_NET_VENDOR_EMULEX is not set | ||
127 | # CONFIG_NET_VENDOR_EXAR is not set | ||
128 | CONFIG_FSL_PQ_MDIO=y | ||
129 | CONFIG_FSL_XGMAC_MDIO=y | ||
130 | # CONFIG_NET_VENDOR_HP is not set | ||
131 | # CONFIG_NET_VENDOR_INTEL is not set | ||
132 | # CONFIG_NET_VENDOR_MARVELL is not set | ||
133 | # CONFIG_NET_VENDOR_MELLANOX is not set | ||
134 | # CONFIG_NET_VENDOR_MICREL is not set | ||
135 | # CONFIG_NET_VENDOR_MICROCHIP is not set | ||
136 | # CONFIG_NET_VENDOR_MYRI is not set | ||
137 | # CONFIG_NET_VENDOR_NATSEMI is not set | ||
138 | # CONFIG_NET_VENDOR_NVIDIA is not set | ||
139 | # CONFIG_NET_VENDOR_OKI is not set | ||
140 | # CONFIG_NET_PACKET_ENGINE is not set | ||
141 | # CONFIG_NET_VENDOR_QLOGIC is not set | ||
142 | # CONFIG_NET_VENDOR_REALTEK is not set | ||
143 | # CONFIG_NET_VENDOR_RDC is not set | ||
144 | # CONFIG_NET_VENDOR_SEEQ is not set | ||
145 | # CONFIG_NET_VENDOR_SILAN is not set | ||
146 | # CONFIG_NET_VENDOR_SIS is not set | ||
147 | # CONFIG_NET_VENDOR_SMSC is not set | ||
148 | # CONFIG_NET_VENDOR_STMICRO is not set | ||
149 | # CONFIG_NET_VENDOR_SUN is not set | ||
150 | # CONFIG_NET_VENDOR_TEHUTI is not set | ||
151 | # CONFIG_NET_VENDOR_TI is not set | ||
152 | # CONFIG_NET_VENDOR_VIA is not set | ||
153 | # CONFIG_NET_VENDOR_WIZNET is not set | ||
154 | # CONFIG_NET_VENDOR_XILINX is not set | ||
155 | CONFIG_MARVELL_PHY=y | ||
156 | CONFIG_VITESSE_PHY=y | ||
157 | CONFIG_FIXED_PHY=y | ||
158 | # CONFIG_WLAN is not set | ||
159 | # CONFIG_INPUT_MOUSEDEV is not set | ||
160 | # CONFIG_INPUT_KEYBOARD is not set | ||
161 | # CONFIG_INPUT_MOUSE is not set | ||
162 | CONFIG_SERIO_LIBPS2=y | ||
163 | # CONFIG_LEGACY_PTYS is not set | ||
164 | CONFIG_PPC_EPAPR_HV_BYTECHAN=y | ||
165 | CONFIG_SERIAL_8250=y | ||
166 | CONFIG_SERIAL_8250_CONSOLE=y | ||
167 | CONFIG_SERIAL_8250_MANY_PORTS=y | ||
168 | CONFIG_SERIAL_8250_DETECT_IRQ=y | ||
169 | CONFIG_SERIAL_8250_RSA=y | ||
170 | CONFIG_NVRAM=y | ||
171 | CONFIG_I2C=y | ||
172 | CONFIG_I2C_CHARDEV=y | ||
173 | CONFIG_I2C_MUX=y | ||
174 | CONFIG_I2C_MUX_PCA954x=y | ||
175 | CONFIG_I2C_MPC=y | ||
176 | CONFIG_SPI=y | ||
177 | CONFIG_SPI_FSL_SPI=y | ||
178 | CONFIG_SPI_FSL_ESPI=y | ||
179 | CONFIG_SPI_SPIDEV=m | ||
180 | CONFIG_PTP_1588_CLOCK=y | ||
181 | # CONFIG_HWMON is not set | ||
182 | # CONFIG_USB_SUPPORT is not set | ||
183 | CONFIG_EDAC=y | ||
184 | CONFIG_EDAC_MM_EDAC=y | ||
185 | CONFIG_EDAC_MPC85XX=y | ||
186 | CONFIG_RTC_CLASS=y | ||
187 | CONFIG_RTC_DRV_DS3232=y | ||
188 | CONFIG_RTC_DRV_CMOS=y | ||
189 | CONFIG_UIO=y | ||
190 | CONFIG_STAGING=y | ||
191 | CONFIG_CLK_QORIQ=y | ||
192 | CONFIG_EXT2_FS=y | ||
193 | CONFIG_NTFS_FS=y | ||
194 | CONFIG_PROC_KCORE=y | ||
195 | CONFIG_TMPFS=y | ||
196 | CONFIG_JFFS2_FS=y | ||
197 | CONFIG_UBIFS_FS=y | ||
198 | CONFIG_CRAMFS=y | ||
199 | CONFIG_SQUASHFS=y | ||
200 | CONFIG_SQUASHFS_XZ=y | ||
201 | CONFIG_NFS_FS=y | ||
202 | CONFIG_NFS_V4=y | ||
203 | CONFIG_ROOT_NFS=y | ||
204 | CONFIG_NLS_ISO8859_1=y | ||
205 | CONFIG_NLS_UTF8=m | ||
206 | CONFIG_CRC_ITU_T=m | ||
207 | CONFIG_DEBUG_INFO=y | ||
208 | CONFIG_MAGIC_SYSRQ=y | ||
209 | CONFIG_DEBUG_SHIRQ=y | ||
210 | CONFIG_DETECT_HUNG_TASK=y | ||
211 | CONFIG_SCHEDSTATS=y | ||
212 | CONFIG_RCU_TRACE=y | ||
213 | CONFIG_UPROBE_EVENTS=y | ||
214 | CONFIG_CRYPTO_NULL=y | ||
215 | CONFIG_CRYPTO_PCBC=m | ||
216 | CONFIG_CRYPTO_MD4=y | ||
217 | CONFIG_CRYPTO_SHA256=y | ||
218 | CONFIG_CRYPTO_SHA512=y | ||
219 | # CONFIG_CRYPTO_ANSI_CPRNG is not set | ||
220 | CONFIG_CRYPTO_DEV_FSL_CAAM=y | ||
diff --git a/arch/powerpc/configs/pseries_defconfig b/arch/powerpc/configs/pseries_defconfig index 6d0eb02fefa4..4ff68b752618 100644 --- a/arch/powerpc/configs/pseries_defconfig +++ b/arch/powerpc/configs/pseries_defconfig | |||
@@ -58,7 +58,6 @@ CONFIG_KEXEC_FILE=y | |||
58 | CONFIG_IRQ_ALL_CPUS=y | 58 | CONFIG_IRQ_ALL_CPUS=y |
59 | CONFIG_MEMORY_HOTPLUG=y | 59 | CONFIG_MEMORY_HOTPLUG=y |
60 | CONFIG_MEMORY_HOTREMOVE=y | 60 | CONFIG_MEMORY_HOTREMOVE=y |
61 | CONFIG_MEMORY_HOTPLUG_DEFAULT_ONLINE=y | ||
62 | CONFIG_KSM=y | 61 | CONFIG_KSM=y |
63 | CONFIG_TRANSPARENT_HUGEPAGE=y | 62 | CONFIG_TRANSPARENT_HUGEPAGE=y |
64 | CONFIG_PPC_64K_PAGES=y | 63 | CONFIG_PPC_64K_PAGES=y |
diff --git a/arch/powerpc/include/asm/bitops.h b/arch/powerpc/include/asm/bitops.h index 59abc620f8e8..73eb794d6163 100644 --- a/arch/powerpc/include/asm/bitops.h +++ b/arch/powerpc/include/asm/bitops.h | |||
@@ -154,6 +154,34 @@ static __inline__ int test_and_change_bit(unsigned long nr, | |||
154 | return test_and_change_bits(BIT_MASK(nr), addr + BIT_WORD(nr)) != 0; | 154 | return test_and_change_bits(BIT_MASK(nr), addr + BIT_WORD(nr)) != 0; |
155 | } | 155 | } |
156 | 156 | ||
157 | #ifdef CONFIG_PPC64 | ||
158 | static __inline__ unsigned long clear_bit_unlock_return_word(int nr, | ||
159 | volatile unsigned long *addr) | ||
160 | { | ||
161 | unsigned long old, t; | ||
162 | unsigned long *p = (unsigned long *)addr + BIT_WORD(nr); | ||
163 | unsigned long mask = BIT_MASK(nr); | ||
164 | |||
165 | __asm__ __volatile__ ( | ||
166 | PPC_RELEASE_BARRIER | ||
167 | "1:" PPC_LLARX(%0,0,%3,0) "\n" | ||
168 | "andc %1,%0,%2\n" | ||
169 | PPC405_ERR77(0,%3) | ||
170 | PPC_STLCX "%1,0,%3\n" | ||
171 | "bne- 1b\n" | ||
172 | : "=&r" (old), "=&r" (t) | ||
173 | : "r" (mask), "r" (p) | ||
174 | : "cc", "memory"); | ||
175 | |||
176 | return old; | ||
177 | } | ||
178 | |||
179 | /* This is a special function for mm/filemap.c */ | ||
180 | #define clear_bit_unlock_is_negative_byte(nr, addr) \ | ||
181 | (clear_bit_unlock_return_word(nr, addr) & BIT_MASK(PG_waiters)) | ||
182 | |||
183 | #endif /* CONFIG_PPC64 */ | ||
184 | |||
157 | #include <asm-generic/bitops/non-atomic.h> | 185 | #include <asm-generic/bitops/non-atomic.h> |
158 | 186 | ||
159 | static __inline__ void __clear_bit_unlock(int nr, volatile unsigned long *addr) | 187 | static __inline__ void __clear_bit_unlock(int nr, volatile unsigned long *addr) |
diff --git a/arch/powerpc/include/asm/pnv-pci.h b/arch/powerpc/include/asm/pnv-pci.h index 696438f09aea..de9681034353 100644 --- a/arch/powerpc/include/asm/pnv-pci.h +++ b/arch/powerpc/include/asm/pnv-pci.h | |||
@@ -57,6 +57,8 @@ struct pnv_php_slot { | |||
57 | uint64_t id; | 57 | uint64_t id; |
58 | char *name; | 58 | char *name; |
59 | int slot_no; | 59 | int slot_no; |
60 | unsigned int flags; | ||
61 | #define PNV_PHP_FLAG_BROKEN_PDC 0x1 | ||
60 | struct kref kref; | 62 | struct kref kref; |
61 | #define PNV_PHP_STATE_INITIALIZED 0 | 63 | #define PNV_PHP_STATE_INITIALIZED 0 |
62 | #define PNV_PHP_STATE_REGISTERED 1 | 64 | #define PNV_PHP_STATE_REGISTERED 1 |
diff --git a/arch/powerpc/include/asm/ppc_asm.h b/arch/powerpc/include/asm/ppc_asm.h index 025833b8df9f..359c44341761 100644 --- a/arch/powerpc/include/asm/ppc_asm.h +++ b/arch/powerpc/include/asm/ppc_asm.h | |||
@@ -505,7 +505,6 @@ END_FTR_SECTION_IFCLR(CPU_FTR_601) | |||
505 | #define MTMSRD(r) mtmsrd r | 505 | #define MTMSRD(r) mtmsrd r |
506 | #define MTMSR_EERI(reg) mtmsrd reg,1 | 506 | #define MTMSR_EERI(reg) mtmsrd reg,1 |
507 | #else | 507 | #else |
508 | #define FIX_SRR1(ra, rb) | ||
509 | #ifndef CONFIG_40x | 508 | #ifndef CONFIG_40x |
510 | #define RFI rfi | 509 | #define RFI rfi |
511 | #else | 510 | #else |
diff --git a/arch/powerpc/include/asm/processor.h b/arch/powerpc/include/asm/processor.h index 21e0b52685b5..e0fecbcea2a2 100644 --- a/arch/powerpc/include/asm/processor.h +++ b/arch/powerpc/include/asm/processor.h | |||
@@ -225,6 +225,7 @@ struct thread_struct { | |||
225 | #ifdef CONFIG_PPC64 | 225 | #ifdef CONFIG_PPC64 |
226 | unsigned long start_tb; /* Start purr when proc switched in */ | 226 | unsigned long start_tb; /* Start purr when proc switched in */ |
227 | unsigned long accum_tb; /* Total accumulated purr for process */ | 227 | unsigned long accum_tb; /* Total accumulated purr for process */ |
228 | #endif | ||
228 | #ifdef CONFIG_HAVE_HW_BREAKPOINT | 229 | #ifdef CONFIG_HAVE_HW_BREAKPOINT |
229 | struct perf_event *ptrace_bps[HBP_NUM]; | 230 | struct perf_event *ptrace_bps[HBP_NUM]; |
230 | /* | 231 | /* |
@@ -233,7 +234,6 @@ struct thread_struct { | |||
233 | */ | 234 | */ |
234 | struct perf_event *last_hit_ubp; | 235 | struct perf_event *last_hit_ubp; |
235 | #endif /* CONFIG_HAVE_HW_BREAKPOINT */ | 236 | #endif /* CONFIG_HAVE_HW_BREAKPOINT */ |
236 | #endif | ||
237 | struct arch_hw_breakpoint hw_brk; /* info on the hardware breakpoint */ | 237 | struct arch_hw_breakpoint hw_brk; /* info on the hardware breakpoint */ |
238 | unsigned long trap_nr; /* last trap # on this thread */ | 238 | unsigned long trap_nr; /* last trap # on this thread */ |
239 | u8 load_fp; | 239 | u8 load_fp; |
diff --git a/arch/powerpc/include/asm/prom.h b/arch/powerpc/include/asm/prom.h index 2c8001cc93b6..4a90634e8322 100644 --- a/arch/powerpc/include/asm/prom.h +++ b/arch/powerpc/include/asm/prom.h | |||
@@ -153,6 +153,7 @@ struct of_drconf_cell { | |||
153 | #define OV5_XCMO 0x0440 /* Page Coalescing */ | 153 | #define OV5_XCMO 0x0440 /* Page Coalescing */ |
154 | #define OV5_TYPE1_AFFINITY 0x0580 /* Type 1 NUMA affinity */ | 154 | #define OV5_TYPE1_AFFINITY 0x0580 /* Type 1 NUMA affinity */ |
155 | #define OV5_PRRN 0x0540 /* Platform Resource Reassignment */ | 155 | #define OV5_PRRN 0x0540 /* Platform Resource Reassignment */ |
156 | #define OV5_HP_EVT 0x0604 /* Hot Plug Event support */ | ||
156 | #define OV5_RESIZE_HPT 0x0601 /* Hash Page Table resizing */ | 157 | #define OV5_RESIZE_HPT 0x0601 /* Hash Page Table resizing */ |
157 | #define OV5_PFO_HW_RNG 0x1180 /* PFO Random Number Generator */ | 158 | #define OV5_PFO_HW_RNG 0x1180 /* PFO Random Number Generator */ |
158 | #define OV5_PFO_HW_842 0x1140 /* PFO Compression Accelerator */ | 159 | #define OV5_PFO_HW_842 0x1140 /* PFO Compression Accelerator */ |
diff --git a/arch/powerpc/include/asm/reg.h b/arch/powerpc/include/asm/reg.h index cb02d32db147..fc879fd6bdae 100644 --- a/arch/powerpc/include/asm/reg.h +++ b/arch/powerpc/include/asm/reg.h | |||
@@ -552,7 +552,9 @@ | |||
552 | #define SPRN_IBAT7U 0x236 /* Instruction BAT 7 Upper Register */ | 552 | #define SPRN_IBAT7U 0x236 /* Instruction BAT 7 Upper Register */ |
553 | #define SPRN_ICMP 0x3D5 /* Instruction TLB Compare Register */ | 553 | #define SPRN_ICMP 0x3D5 /* Instruction TLB Compare Register */ |
554 | #define SPRN_ICTC 0x3FB /* Instruction Cache Throttling Control Reg */ | 554 | #define SPRN_ICTC 0x3FB /* Instruction Cache Throttling Control Reg */ |
555 | #ifndef SPRN_ICTRL | ||
555 | #define SPRN_ICTRL 0x3F3 /* 1011 7450 icache and interrupt ctrl */ | 556 | #define SPRN_ICTRL 0x3F3 /* 1011 7450 icache and interrupt ctrl */ |
557 | #endif | ||
556 | #define ICTRL_EICE 0x08000000 /* enable icache parity errs */ | 558 | #define ICTRL_EICE 0x08000000 /* enable icache parity errs */ |
557 | #define ICTRL_EDC 0x04000000 /* enable dcache parity errs */ | 559 | #define ICTRL_EDC 0x04000000 /* enable dcache parity errs */ |
558 | #define ICTRL_EICP 0x00000100 /* enable icache par. check */ | 560 | #define ICTRL_EICP 0x00000100 /* enable icache par. check */ |
diff --git a/arch/powerpc/include/asm/reg_8xx.h b/arch/powerpc/include/asm/reg_8xx.h index 1f1636124a04..ae16fef7a4d6 100644 --- a/arch/powerpc/include/asm/reg_8xx.h +++ b/arch/powerpc/include/asm/reg_8xx.h | |||
@@ -28,6 +28,17 @@ | |||
28 | /* Special MSR manipulation registers */ | 28 | /* Special MSR manipulation registers */ |
29 | #define SPRN_EIE 80 /* External interrupt enable (EE=1, RI=1) */ | 29 | #define SPRN_EIE 80 /* External interrupt enable (EE=1, RI=1) */ |
30 | #define SPRN_EID 81 /* External interrupt disable (EE=0, RI=1) */ | 30 | #define SPRN_EID 81 /* External interrupt disable (EE=0, RI=1) */ |
31 | #define SPRN_NRI 82 /* Non recoverable interrupt (EE=0, RI=0) */ | ||
32 | |||
33 | /* Debug registers */ | ||
34 | #define SPRN_CMPA 144 | ||
35 | #define SPRN_COUNTA 150 | ||
36 | #define SPRN_CMPE 152 | ||
37 | #define SPRN_CMPF 153 | ||
38 | #define SPRN_LCTRL1 156 | ||
39 | #define SPRN_LCTRL2 157 | ||
40 | #define SPRN_ICTRL 158 | ||
41 | #define SPRN_BAR 159 | ||
31 | 42 | ||
32 | /* Commands. Only the first few are available to the instruction cache. | 43 | /* Commands. Only the first few are available to the instruction cache. |
33 | */ | 44 | */ |
diff --git a/arch/powerpc/include/asm/rtas.h b/arch/powerpc/include/asm/rtas.h index 076b89247ab5..ec9dd79398ee 100644 --- a/arch/powerpc/include/asm/rtas.h +++ b/arch/powerpc/include/asm/rtas.h | |||
@@ -307,6 +307,7 @@ struct pseries_hp_errorlog { | |||
307 | union { | 307 | union { |
308 | __be32 drc_index; | 308 | __be32 drc_index; |
309 | __be32 drc_count; | 309 | __be32 drc_count; |
310 | struct { __be32 count, index; } ic; | ||
310 | char drc_name[1]; | 311 | char drc_name[1]; |
311 | } _drc_u; | 312 | } _drc_u; |
312 | }; | 313 | }; |
@@ -323,6 +324,7 @@ struct pseries_hp_errorlog { | |||
323 | #define PSERIES_HP_ELOG_ID_DRC_NAME 1 | 324 | #define PSERIES_HP_ELOG_ID_DRC_NAME 1 |
324 | #define PSERIES_HP_ELOG_ID_DRC_INDEX 2 | 325 | #define PSERIES_HP_ELOG_ID_DRC_INDEX 2 |
325 | #define PSERIES_HP_ELOG_ID_DRC_COUNT 3 | 326 | #define PSERIES_HP_ELOG_ID_DRC_COUNT 3 |
327 | #define PSERIES_HP_ELOG_ID_DRC_IC 4 | ||
326 | 328 | ||
327 | struct pseries_errorlog *get_pseries_errorlog(struct rtas_error_log *log, | 329 | struct pseries_errorlog *get_pseries_errorlog(struct rtas_error_log *log, |
328 | uint16_t section_id); | 330 | uint16_t section_id); |
diff --git a/arch/powerpc/kernel/asm-offsets.c b/arch/powerpc/kernel/asm-offsets.c index f25239b3a06f..4367e7df51a1 100644 --- a/arch/powerpc/kernel/asm-offsets.c +++ b/arch/powerpc/kernel/asm-offsets.c | |||
@@ -72,205 +72,190 @@ | |||
72 | #include <asm/fixmap.h> | 72 | #include <asm/fixmap.h> |
73 | #endif | 73 | #endif |
74 | 74 | ||
75 | #define STACK_PT_REGS_OFFSET(sym, val) \ | ||
76 | DEFINE(sym, STACK_FRAME_OVERHEAD + offsetof(struct pt_regs, val)) | ||
77 | |||
75 | int main(void) | 78 | int main(void) |
76 | { | 79 | { |
77 | DEFINE(THREAD, offsetof(struct task_struct, thread)); | 80 | OFFSET(THREAD, task_struct, thread); |
78 | DEFINE(MM, offsetof(struct task_struct, mm)); | 81 | OFFSET(MM, task_struct, mm); |
79 | DEFINE(MMCONTEXTID, offsetof(struct mm_struct, context.id)); | 82 | OFFSET(MMCONTEXTID, mm_struct, context.id); |
80 | #ifdef CONFIG_PPC64 | 83 | #ifdef CONFIG_PPC64 |
81 | DEFINE(SIGSEGV, SIGSEGV); | 84 | DEFINE(SIGSEGV, SIGSEGV); |
82 | DEFINE(NMI_MASK, NMI_MASK); | 85 | DEFINE(NMI_MASK, NMI_MASK); |
83 | DEFINE(TASKTHREADPPR, offsetof(struct task_struct, thread.ppr)); | 86 | OFFSET(TASKTHREADPPR, task_struct, thread.ppr); |
84 | #else | 87 | #else |
85 | DEFINE(THREAD_INFO, offsetof(struct task_struct, stack)); | 88 | OFFSET(THREAD_INFO, task_struct, stack); |
86 | DEFINE(THREAD_INFO_GAP, _ALIGN_UP(sizeof(struct thread_info), 16)); | 89 | DEFINE(THREAD_INFO_GAP, _ALIGN_UP(sizeof(struct thread_info), 16)); |
87 | DEFINE(KSP_LIMIT, offsetof(struct thread_struct, ksp_limit)); | 90 | OFFSET(KSP_LIMIT, thread_struct, ksp_limit); |
88 | #endif /* CONFIG_PPC64 */ | 91 | #endif /* CONFIG_PPC64 */ |
89 | 92 | ||
90 | #ifdef CONFIG_LIVEPATCH | 93 | #ifdef CONFIG_LIVEPATCH |
91 | DEFINE(TI_livepatch_sp, offsetof(struct thread_info, livepatch_sp)); | 94 | OFFSET(TI_livepatch_sp, thread_info, livepatch_sp); |
92 | #endif | 95 | #endif |
93 | 96 | ||
94 | DEFINE(KSP, offsetof(struct thread_struct, ksp)); | 97 | OFFSET(KSP, thread_struct, ksp); |
95 | DEFINE(PT_REGS, offsetof(struct thread_struct, regs)); | 98 | OFFSET(PT_REGS, thread_struct, regs); |
96 | #ifdef CONFIG_BOOKE | 99 | #ifdef CONFIG_BOOKE |
97 | DEFINE(THREAD_NORMSAVES, offsetof(struct thread_struct, normsave[0])); | 100 | OFFSET(THREAD_NORMSAVES, thread_struct, normsave[0]); |
98 | #endif | 101 | #endif |
99 | DEFINE(THREAD_FPEXC_MODE, offsetof(struct thread_struct, fpexc_mode)); | 102 | OFFSET(THREAD_FPEXC_MODE, thread_struct, fpexc_mode); |
100 | DEFINE(THREAD_FPSTATE, offsetof(struct thread_struct, fp_state)); | 103 | OFFSET(THREAD_FPSTATE, thread_struct, fp_state); |
101 | DEFINE(THREAD_FPSAVEAREA, offsetof(struct thread_struct, fp_save_area)); | 104 | OFFSET(THREAD_FPSAVEAREA, thread_struct, fp_save_area); |
102 | DEFINE(FPSTATE_FPSCR, offsetof(struct thread_fp_state, fpscr)); | 105 | OFFSET(FPSTATE_FPSCR, thread_fp_state, fpscr); |
103 | DEFINE(THREAD_LOAD_FP, offsetof(struct thread_struct, load_fp)); | 106 | OFFSET(THREAD_LOAD_FP, thread_struct, load_fp); |
104 | #ifdef CONFIG_ALTIVEC | 107 | #ifdef CONFIG_ALTIVEC |
105 | DEFINE(THREAD_VRSTATE, offsetof(struct thread_struct, vr_state)); | 108 | OFFSET(THREAD_VRSTATE, thread_struct, vr_state); |
106 | DEFINE(THREAD_VRSAVEAREA, offsetof(struct thread_struct, vr_save_area)); | 109 | OFFSET(THREAD_VRSAVEAREA, thread_struct, vr_save_area); |
107 | DEFINE(THREAD_VRSAVE, offsetof(struct thread_struct, vrsave)); | 110 | OFFSET(THREAD_VRSAVE, thread_struct, vrsave); |
108 | DEFINE(THREAD_USED_VR, offsetof(struct thread_struct, used_vr)); | 111 | OFFSET(THREAD_USED_VR, thread_struct, used_vr); |
109 | DEFINE(VRSTATE_VSCR, offsetof(struct thread_vr_state, vscr)); | 112 | OFFSET(VRSTATE_VSCR, thread_vr_state, vscr); |
110 | DEFINE(THREAD_LOAD_VEC, offsetof(struct thread_struct, load_vec)); | 113 | OFFSET(THREAD_LOAD_VEC, thread_struct, load_vec); |
111 | #endif /* CONFIG_ALTIVEC */ | 114 | #endif /* CONFIG_ALTIVEC */ |
112 | #ifdef CONFIG_VSX | 115 | #ifdef CONFIG_VSX |
113 | DEFINE(THREAD_USED_VSR, offsetof(struct thread_struct, used_vsr)); | 116 | OFFSET(THREAD_USED_VSR, thread_struct, used_vsr); |
114 | #endif /* CONFIG_VSX */ | 117 | #endif /* CONFIG_VSX */ |
115 | #ifdef CONFIG_PPC64 | 118 | #ifdef CONFIG_PPC64 |
116 | DEFINE(KSP_VSID, offsetof(struct thread_struct, ksp_vsid)); | 119 | OFFSET(KSP_VSID, thread_struct, ksp_vsid); |
117 | #else /* CONFIG_PPC64 */ | 120 | #else /* CONFIG_PPC64 */ |
118 | DEFINE(PGDIR, offsetof(struct thread_struct, pgdir)); | 121 | OFFSET(PGDIR, thread_struct, pgdir); |
119 | #ifdef CONFIG_SPE | 122 | #ifdef CONFIG_SPE |
120 | DEFINE(THREAD_EVR0, offsetof(struct thread_struct, evr[0])); | 123 | OFFSET(THREAD_EVR0, thread_struct, evr[0]); |
121 | DEFINE(THREAD_ACC, offsetof(struct thread_struct, acc)); | 124 | OFFSET(THREAD_ACC, thread_struct, acc); |
122 | DEFINE(THREAD_SPEFSCR, offsetof(struct thread_struct, spefscr)); | 125 | OFFSET(THREAD_SPEFSCR, thread_struct, spefscr); |
123 | DEFINE(THREAD_USED_SPE, offsetof(struct thread_struct, used_spe)); | 126 | OFFSET(THREAD_USED_SPE, thread_struct, used_spe); |
124 | #endif /* CONFIG_SPE */ | 127 | #endif /* CONFIG_SPE */ |
125 | #endif /* CONFIG_PPC64 */ | 128 | #endif /* CONFIG_PPC64 */ |
126 | #if defined(CONFIG_4xx) || defined(CONFIG_BOOKE) | 129 | #if defined(CONFIG_4xx) || defined(CONFIG_BOOKE) |
127 | DEFINE(THREAD_DBCR0, offsetof(struct thread_struct, debug.dbcr0)); | 130 | OFFSET(THREAD_DBCR0, thread_struct, debug.dbcr0); |
128 | #endif | 131 | #endif |
129 | #ifdef CONFIG_KVM_BOOK3S_32_HANDLER | 132 | #ifdef CONFIG_KVM_BOOK3S_32_HANDLER |
130 | DEFINE(THREAD_KVM_SVCPU, offsetof(struct thread_struct, kvm_shadow_vcpu)); | 133 | OFFSET(THREAD_KVM_SVCPU, thread_struct, kvm_shadow_vcpu); |
131 | #endif | 134 | #endif |
132 | #if defined(CONFIG_KVM) && defined(CONFIG_BOOKE) | 135 | #if defined(CONFIG_KVM) && defined(CONFIG_BOOKE) |
133 | DEFINE(THREAD_KVM_VCPU, offsetof(struct thread_struct, kvm_vcpu)); | 136 | OFFSET(THREAD_KVM_VCPU, thread_struct, kvm_vcpu); |
134 | #endif | 137 | #endif |
135 | 138 | ||
136 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM | 139 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM |
137 | DEFINE(PACATMSCRATCH, offsetof(struct paca_struct, tm_scratch)); | 140 | OFFSET(PACATMSCRATCH, paca_struct, tm_scratch); |
138 | DEFINE(THREAD_TM_TFHAR, offsetof(struct thread_struct, tm_tfhar)); | 141 | OFFSET(THREAD_TM_TFHAR, thread_struct, tm_tfhar); |
139 | DEFINE(THREAD_TM_TEXASR, offsetof(struct thread_struct, tm_texasr)); | 142 | OFFSET(THREAD_TM_TEXASR, thread_struct, tm_texasr); |
140 | DEFINE(THREAD_TM_TFIAR, offsetof(struct thread_struct, tm_tfiar)); | 143 | OFFSET(THREAD_TM_TFIAR, thread_struct, tm_tfiar); |
141 | DEFINE(THREAD_TM_TAR, offsetof(struct thread_struct, tm_tar)); | 144 | OFFSET(THREAD_TM_TAR, thread_struct, tm_tar); |
142 | DEFINE(THREAD_TM_PPR, offsetof(struct thread_struct, tm_ppr)); | 145 | OFFSET(THREAD_TM_PPR, thread_struct, tm_ppr); |
143 | DEFINE(THREAD_TM_DSCR, offsetof(struct thread_struct, tm_dscr)); | 146 | OFFSET(THREAD_TM_DSCR, thread_struct, tm_dscr); |
144 | DEFINE(PT_CKPT_REGS, offsetof(struct thread_struct, ckpt_regs)); | 147 | OFFSET(PT_CKPT_REGS, thread_struct, ckpt_regs); |
145 | DEFINE(THREAD_CKVRSTATE, offsetof(struct thread_struct, | 148 | OFFSET(THREAD_CKVRSTATE, thread_struct, ckvr_state); |
146 | ckvr_state)); | 149 | OFFSET(THREAD_CKVRSAVE, thread_struct, ckvrsave); |
147 | DEFINE(THREAD_CKVRSAVE, offsetof(struct thread_struct, | 150 | OFFSET(THREAD_CKFPSTATE, thread_struct, ckfp_state); |
148 | ckvrsave)); | ||
149 | DEFINE(THREAD_CKFPSTATE, offsetof(struct thread_struct, | ||
150 | ckfp_state)); | ||
151 | /* Local pt_regs on stack for Transactional Memory funcs. */ | 151 | /* Local pt_regs on stack for Transactional Memory funcs. */ |
152 | DEFINE(TM_FRAME_SIZE, STACK_FRAME_OVERHEAD + | 152 | DEFINE(TM_FRAME_SIZE, STACK_FRAME_OVERHEAD + |
153 | sizeof(struct pt_regs) + 16); | 153 | sizeof(struct pt_regs) + 16); |
154 | #endif /* CONFIG_PPC_TRANSACTIONAL_MEM */ | 154 | #endif /* CONFIG_PPC_TRANSACTIONAL_MEM */ |
155 | 155 | ||
156 | DEFINE(TI_FLAGS, offsetof(struct thread_info, flags)); | 156 | OFFSET(TI_FLAGS, thread_info, flags); |
157 | DEFINE(TI_LOCAL_FLAGS, offsetof(struct thread_info, local_flags)); | 157 | OFFSET(TI_LOCAL_FLAGS, thread_info, local_flags); |
158 | DEFINE(TI_PREEMPT, offsetof(struct thread_info, preempt_count)); | 158 | OFFSET(TI_PREEMPT, thread_info, preempt_count); |
159 | DEFINE(TI_TASK, offsetof(struct thread_info, task)); | 159 | OFFSET(TI_TASK, thread_info, task); |
160 | DEFINE(TI_CPU, offsetof(struct thread_info, cpu)); | 160 | OFFSET(TI_CPU, thread_info, cpu); |
161 | 161 | ||
162 | #ifdef CONFIG_PPC64 | 162 | #ifdef CONFIG_PPC64 |
163 | DEFINE(DCACHEL1BLOCKSIZE, offsetof(struct ppc64_caches, l1d.block_size)); | 163 | OFFSET(DCACHEL1BLOCKSIZE, ppc64_caches, l1d.block_size); |
164 | DEFINE(DCACHEL1LOGBLOCKSIZE, offsetof(struct ppc64_caches, l1d.log_block_size)); | 164 | OFFSET(DCACHEL1LOGBLOCKSIZE, ppc64_caches, l1d.log_block_size); |
165 | DEFINE(DCACHEL1BLOCKSPERPAGE, offsetof(struct ppc64_caches, l1d.blocks_per_page)); | 165 | OFFSET(DCACHEL1BLOCKSPERPAGE, ppc64_caches, l1d.blocks_per_page); |
166 | DEFINE(ICACHEL1BLOCKSIZE, offsetof(struct ppc64_caches, l1i.block_size)); | 166 | OFFSET(ICACHEL1BLOCKSIZE, ppc64_caches, l1i.block_size); |
167 | DEFINE(ICACHEL1LOGBLOCKSIZE, offsetof(struct ppc64_caches, l1i.log_block_size)); | 167 | OFFSET(ICACHEL1LOGBLOCKSIZE, ppc64_caches, l1i.log_block_size); |
168 | DEFINE(ICACHEL1BLOCKSPERPAGE, offsetof(struct ppc64_caches, l1i.blocks_per_page)); | 168 | OFFSET(ICACHEL1BLOCKSPERPAGE, ppc64_caches, l1i.blocks_per_page); |
169 | /* paca */ | 169 | /* paca */ |
170 | DEFINE(PACA_SIZE, sizeof(struct paca_struct)); | 170 | DEFINE(PACA_SIZE, sizeof(struct paca_struct)); |
171 | DEFINE(PACAPACAINDEX, offsetof(struct paca_struct, paca_index)); | 171 | OFFSET(PACAPACAINDEX, paca_struct, paca_index); |
172 | DEFINE(PACAPROCSTART, offsetof(struct paca_struct, cpu_start)); | 172 | OFFSET(PACAPROCSTART, paca_struct, cpu_start); |
173 | DEFINE(PACAKSAVE, offsetof(struct paca_struct, kstack)); | 173 | OFFSET(PACAKSAVE, paca_struct, kstack); |
174 | DEFINE(PACACURRENT, offsetof(struct paca_struct, __current)); | 174 | OFFSET(PACACURRENT, paca_struct, __current); |
175 | DEFINE(PACASAVEDMSR, offsetof(struct paca_struct, saved_msr)); | 175 | OFFSET(PACASAVEDMSR, paca_struct, saved_msr); |
176 | DEFINE(PACASTABRR, offsetof(struct paca_struct, stab_rr)); | 176 | OFFSET(PACASTABRR, paca_struct, stab_rr); |
177 | DEFINE(PACAR1, offsetof(struct paca_struct, saved_r1)); | 177 | OFFSET(PACAR1, paca_struct, saved_r1); |
178 | DEFINE(PACATOC, offsetof(struct paca_struct, kernel_toc)); | 178 | OFFSET(PACATOC, paca_struct, kernel_toc); |
179 | DEFINE(PACAKBASE, offsetof(struct paca_struct, kernelbase)); | 179 | OFFSET(PACAKBASE, paca_struct, kernelbase); |
180 | DEFINE(PACAKMSR, offsetof(struct paca_struct, kernel_msr)); | 180 | OFFSET(PACAKMSR, paca_struct, kernel_msr); |
181 | DEFINE(PACASOFTIRQEN, offsetof(struct paca_struct, soft_enabled)); | 181 | OFFSET(PACASOFTIRQEN, paca_struct, soft_enabled); |
182 | DEFINE(PACAIRQHAPPENED, offsetof(struct paca_struct, irq_happened)); | 182 | OFFSET(PACAIRQHAPPENED, paca_struct, irq_happened); |
183 | #ifdef CONFIG_PPC_BOOK3S | 183 | #ifdef CONFIG_PPC_BOOK3S |
184 | DEFINE(PACACONTEXTID, offsetof(struct paca_struct, mm_ctx_id)); | 184 | OFFSET(PACACONTEXTID, paca_struct, mm_ctx_id); |
185 | #ifdef CONFIG_PPC_MM_SLICES | 185 | #ifdef CONFIG_PPC_MM_SLICES |
186 | DEFINE(PACALOWSLICESPSIZE, offsetof(struct paca_struct, | 186 | OFFSET(PACALOWSLICESPSIZE, paca_struct, mm_ctx_low_slices_psize); |
187 | mm_ctx_low_slices_psize)); | 187 | OFFSET(PACAHIGHSLICEPSIZE, paca_struct, mm_ctx_high_slices_psize); |
188 | DEFINE(PACAHIGHSLICEPSIZE, offsetof(struct paca_struct, | ||
189 | mm_ctx_high_slices_psize)); | ||
190 | DEFINE(MMUPSIZEDEFSIZE, sizeof(struct mmu_psize_def)); | 188 | DEFINE(MMUPSIZEDEFSIZE, sizeof(struct mmu_psize_def)); |
191 | #endif /* CONFIG_PPC_MM_SLICES */ | 189 | #endif /* CONFIG_PPC_MM_SLICES */ |
192 | #endif | 190 | #endif |
193 | 191 | ||
194 | #ifdef CONFIG_PPC_BOOK3E | 192 | #ifdef CONFIG_PPC_BOOK3E |
195 | DEFINE(PACAPGD, offsetof(struct paca_struct, pgd)); | 193 | OFFSET(PACAPGD, paca_struct, pgd); |
196 | DEFINE(PACA_KERNELPGD, offsetof(struct paca_struct, kernel_pgd)); | 194 | OFFSET(PACA_KERNELPGD, paca_struct, kernel_pgd); |
197 | DEFINE(PACA_EXGEN, offsetof(struct paca_struct, exgen)); | 195 | OFFSET(PACA_EXGEN, paca_struct, exgen); |
198 | DEFINE(PACA_EXTLB, offsetof(struct paca_struct, extlb)); | 196 | OFFSET(PACA_EXTLB, paca_struct, extlb); |
199 | DEFINE(PACA_EXMC, offsetof(struct paca_struct, exmc)); | 197 | OFFSET(PACA_EXMC, paca_struct, exmc); |
200 | DEFINE(PACA_EXCRIT, offsetof(struct paca_struct, excrit)); | 198 | OFFSET(PACA_EXCRIT, paca_struct, excrit); |
201 | DEFINE(PACA_EXDBG, offsetof(struct paca_struct, exdbg)); | 199 | OFFSET(PACA_EXDBG, paca_struct, exdbg); |
202 | DEFINE(PACA_MC_STACK, offsetof(struct paca_struct, mc_kstack)); | 200 | OFFSET(PACA_MC_STACK, paca_struct, mc_kstack); |
203 | DEFINE(PACA_CRIT_STACK, offsetof(struct paca_struct, crit_kstack)); | 201 | OFFSET(PACA_CRIT_STACK, paca_struct, crit_kstack); |
204 | DEFINE(PACA_DBG_STACK, offsetof(struct paca_struct, dbg_kstack)); | 202 | OFFSET(PACA_DBG_STACK, paca_struct, dbg_kstack); |
205 | DEFINE(PACA_TCD_PTR, offsetof(struct paca_struct, tcd_ptr)); | 203 | OFFSET(PACA_TCD_PTR, paca_struct, tcd_ptr); |
206 | 204 | ||
207 | DEFINE(TCD_ESEL_NEXT, | 205 | OFFSET(TCD_ESEL_NEXT, tlb_core_data, esel_next); |
208 | offsetof(struct tlb_core_data, esel_next)); | 206 | OFFSET(TCD_ESEL_MAX, tlb_core_data, esel_max); |
209 | DEFINE(TCD_ESEL_MAX, | 207 | OFFSET(TCD_ESEL_FIRST, tlb_core_data, esel_first); |
210 | offsetof(struct tlb_core_data, esel_max)); | ||
211 | DEFINE(TCD_ESEL_FIRST, | ||
212 | offsetof(struct tlb_core_data, esel_first)); | ||
213 | #endif /* CONFIG_PPC_BOOK3E */ | 208 | #endif /* CONFIG_PPC_BOOK3E */ |
214 | 209 | ||
215 | #ifdef CONFIG_PPC_STD_MMU_64 | 210 | #ifdef CONFIG_PPC_STD_MMU_64 |
216 | DEFINE(PACASLBCACHE, offsetof(struct paca_struct, slb_cache)); | 211 | OFFSET(PACASLBCACHE, paca_struct, slb_cache); |
217 | DEFINE(PACASLBCACHEPTR, offsetof(struct paca_struct, slb_cache_ptr)); | 212 | OFFSET(PACASLBCACHEPTR, paca_struct, slb_cache_ptr); |
218 | DEFINE(PACAVMALLOCSLLP, offsetof(struct paca_struct, vmalloc_sllp)); | 213 | OFFSET(PACAVMALLOCSLLP, paca_struct, vmalloc_sllp); |
219 | #ifdef CONFIG_PPC_MM_SLICES | 214 | #ifdef CONFIG_PPC_MM_SLICES |
220 | DEFINE(MMUPSIZESLLP, offsetof(struct mmu_psize_def, sllp)); | 215 | OFFSET(MMUPSIZESLLP, mmu_psize_def, sllp); |
221 | #else | 216 | #else |
222 | DEFINE(PACACONTEXTSLLP, offsetof(struct paca_struct, mm_ctx_sllp)); | 217 | OFFSET(PACACONTEXTSLLP, paca_struct, mm_ctx_sllp); |
223 | #endif /* CONFIG_PPC_MM_SLICES */ | 218 | #endif /* CONFIG_PPC_MM_SLICES */ |
224 | DEFINE(PACA_EXGEN, offsetof(struct paca_struct, exgen)); | 219 | OFFSET(PACA_EXGEN, paca_struct, exgen); |
225 | DEFINE(PACA_EXMC, offsetof(struct paca_struct, exmc)); | 220 | OFFSET(PACA_EXMC, paca_struct, exmc); |
226 | DEFINE(PACA_EXSLB, offsetof(struct paca_struct, exslb)); | 221 | OFFSET(PACA_EXSLB, paca_struct, exslb); |
227 | DEFINE(PACALPPACAPTR, offsetof(struct paca_struct, lppaca_ptr)); | 222 | OFFSET(PACALPPACAPTR, paca_struct, lppaca_ptr); |
228 | DEFINE(PACA_SLBSHADOWPTR, offsetof(struct paca_struct, slb_shadow_ptr)); | 223 | OFFSET(PACA_SLBSHADOWPTR, paca_struct, slb_shadow_ptr); |
229 | DEFINE(SLBSHADOW_STACKVSID, | 224 | OFFSET(SLBSHADOW_STACKVSID, slb_shadow, save_area[SLB_NUM_BOLTED - 1].vsid); |
230 | offsetof(struct slb_shadow, save_area[SLB_NUM_BOLTED - 1].vsid)); | 225 | OFFSET(SLBSHADOW_STACKESID, slb_shadow, save_area[SLB_NUM_BOLTED - 1].esid); |
231 | DEFINE(SLBSHADOW_STACKESID, | 226 | OFFSET(SLBSHADOW_SAVEAREA, slb_shadow, save_area); |
232 | offsetof(struct slb_shadow, save_area[SLB_NUM_BOLTED - 1].esid)); | 227 | OFFSET(LPPACA_PMCINUSE, lppaca, pmcregs_in_use); |
233 | DEFINE(SLBSHADOW_SAVEAREA, offsetof(struct slb_shadow, save_area)); | 228 | OFFSET(LPPACA_DTLIDX, lppaca, dtl_idx); |
234 | DEFINE(LPPACA_PMCINUSE, offsetof(struct lppaca, pmcregs_in_use)); | 229 | OFFSET(LPPACA_YIELDCOUNT, lppaca, yield_count); |
235 | DEFINE(LPPACA_DTLIDX, offsetof(struct lppaca, dtl_idx)); | 230 | OFFSET(PACA_DTL_RIDX, paca_struct, dtl_ridx); |
236 | DEFINE(LPPACA_YIELDCOUNT, offsetof(struct lppaca, yield_count)); | ||
237 | DEFINE(PACA_DTL_RIDX, offsetof(struct paca_struct, dtl_ridx)); | ||
238 | #endif /* CONFIG_PPC_STD_MMU_64 */ | 231 | #endif /* CONFIG_PPC_STD_MMU_64 */ |
239 | DEFINE(PACAEMERGSP, offsetof(struct paca_struct, emergency_sp)); | 232 | OFFSET(PACAEMERGSP, paca_struct, emergency_sp); |
240 | #ifdef CONFIG_PPC_BOOK3S_64 | 233 | #ifdef CONFIG_PPC_BOOK3S_64 |
241 | DEFINE(PACAMCEMERGSP, offsetof(struct paca_struct, mc_emergency_sp)); | 234 | OFFSET(PACAMCEMERGSP, paca_struct, mc_emergency_sp); |
242 | DEFINE(PACA_IN_MCE, offsetof(struct paca_struct, in_mce)); | 235 | OFFSET(PACA_IN_MCE, paca_struct, in_mce); |
243 | #endif | 236 | #endif |
244 | DEFINE(PACAHWCPUID, offsetof(struct paca_struct, hw_cpu_id)); | 237 | OFFSET(PACAHWCPUID, paca_struct, hw_cpu_id); |
245 | DEFINE(PACAKEXECSTATE, offsetof(struct paca_struct, kexec_state)); | 238 | OFFSET(PACAKEXECSTATE, paca_struct, kexec_state); |
246 | DEFINE(PACA_DSCR_DEFAULT, offsetof(struct paca_struct, dscr_default)); | 239 | OFFSET(PACA_DSCR_DEFAULT, paca_struct, dscr_default); |
247 | DEFINE(ACCOUNT_STARTTIME, | 240 | OFFSET(ACCOUNT_STARTTIME, paca_struct, accounting.starttime); |
248 | offsetof(struct paca_struct, accounting.starttime)); | 241 | OFFSET(ACCOUNT_STARTTIME_USER, paca_struct, accounting.starttime_user); |
249 | DEFINE(ACCOUNT_STARTTIME_USER, | 242 | OFFSET(ACCOUNT_USER_TIME, paca_struct, accounting.utime); |
250 | offsetof(struct paca_struct, accounting.starttime_user)); | 243 | OFFSET(ACCOUNT_SYSTEM_TIME, paca_struct, accounting.stime); |
251 | DEFINE(ACCOUNT_USER_TIME, | 244 | OFFSET(PACA_TRAP_SAVE, paca_struct, trap_save); |
252 | offsetof(struct paca_struct, accounting.utime)); | 245 | OFFSET(PACA_NAPSTATELOST, paca_struct, nap_state_lost); |
253 | DEFINE(ACCOUNT_SYSTEM_TIME, | 246 | OFFSET(PACA_SPRG_VDSO, paca_struct, sprg_vdso); |
254 | offsetof(struct paca_struct, accounting.stime)); | ||
255 | DEFINE(PACA_TRAP_SAVE, offsetof(struct paca_struct, trap_save)); | ||
256 | DEFINE(PACA_NAPSTATELOST, offsetof(struct paca_struct, nap_state_lost)); | ||
257 | DEFINE(PACA_SPRG_VDSO, offsetof(struct paca_struct, sprg_vdso)); | ||
258 | #else /* CONFIG_PPC64 */ | 247 | #else /* CONFIG_PPC64 */ |
259 | #ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE | 248 | #ifdef CONFIG_VIRT_CPU_ACCOUNTING_NATIVE |
260 | DEFINE(ACCOUNT_STARTTIME, | 249 | OFFSET(ACCOUNT_STARTTIME, thread_info, accounting.starttime); |
261 | offsetof(struct thread_info, accounting.starttime)); | 250 | OFFSET(ACCOUNT_STARTTIME_USER, thread_info, accounting.starttime_user); |
262 | DEFINE(ACCOUNT_STARTTIME_USER, | 251 | OFFSET(ACCOUNT_USER_TIME, thread_info, accounting.utime); |
263 | offsetof(struct thread_info, accounting.starttime_user)); | 252 | OFFSET(ACCOUNT_SYSTEM_TIME, thread_info, accounting.stime); |
264 | DEFINE(ACCOUNT_USER_TIME, | ||
265 | offsetof(struct thread_info, accounting.utime)); | ||
266 | DEFINE(ACCOUNT_SYSTEM_TIME, | ||
267 | offsetof(struct thread_info, accounting.stime)); | ||
268 | #endif | 253 | #endif |
269 | #endif /* CONFIG_PPC64 */ | 254 | #endif /* CONFIG_PPC64 */ |
270 | 255 | ||
271 | /* RTAS */ | 256 | /* RTAS */ |
272 | DEFINE(RTASBASE, offsetof(struct rtas_t, base)); | 257 | OFFSET(RTASBASE, rtas_t, base); |
273 | DEFINE(RTASENTRY, offsetof(struct rtas_t, entry)); | 258 | OFFSET(RTASENTRY, rtas_t, entry); |
274 | 259 | ||
275 | /* Interrupt register frame */ | 260 | /* Interrupt register frame */ |
276 | DEFINE(INT_FRAME_SIZE, STACK_INT_FRAME_SIZE); | 261 | DEFINE(INT_FRAME_SIZE, STACK_INT_FRAME_SIZE); |
@@ -280,38 +265,38 @@ int main(void) | |||
280 | DEFINE(PROM_FRAME_SIZE, STACK_FRAME_OVERHEAD + sizeof(struct pt_regs) + 16); | 265 | DEFINE(PROM_FRAME_SIZE, STACK_FRAME_OVERHEAD + sizeof(struct pt_regs) + 16); |
281 | DEFINE(RTAS_FRAME_SIZE, STACK_FRAME_OVERHEAD + sizeof(struct pt_regs) + 16); | 266 | DEFINE(RTAS_FRAME_SIZE, STACK_FRAME_OVERHEAD + sizeof(struct pt_regs) + 16); |
282 | #endif /* CONFIG_PPC64 */ | 267 | #endif /* CONFIG_PPC64 */ |
283 | DEFINE(GPR0, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, gpr[0])); | 268 | STACK_PT_REGS_OFFSET(GPR0, gpr[0]); |
284 | DEFINE(GPR1, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, gpr[1])); | 269 | STACK_PT_REGS_OFFSET(GPR1, gpr[1]); |
285 | DEFINE(GPR2, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, gpr[2])); | 270 | STACK_PT_REGS_OFFSET(GPR2, gpr[2]); |
286 | DEFINE(GPR3, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, gpr[3])); | 271 | STACK_PT_REGS_OFFSET(GPR3, gpr[3]); |
287 | DEFINE(GPR4, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, gpr[4])); | 272 | STACK_PT_REGS_OFFSET(GPR4, gpr[4]); |
288 | DEFINE(GPR5, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, gpr[5])); | 273 | STACK_PT_REGS_OFFSET(GPR5, gpr[5]); |
289 | DEFINE(GPR6, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, gpr[6])); | 274 | STACK_PT_REGS_OFFSET(GPR6, gpr[6]); |
290 | DEFINE(GPR7, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, gpr[7])); | 275 | STACK_PT_REGS_OFFSET(GPR7, gpr[7]); |
291 | DEFINE(GPR8, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, gpr[8])); | 276 | STACK_PT_REGS_OFFSET(GPR8, gpr[8]); |
292 | DEFINE(GPR9, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, gpr[9])); | 277 | STACK_PT_REGS_OFFSET(GPR9, gpr[9]); |
293 | DEFINE(GPR10, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, gpr[10])); | 278 | STACK_PT_REGS_OFFSET(GPR10, gpr[10]); |
294 | DEFINE(GPR11, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, gpr[11])); | 279 | STACK_PT_REGS_OFFSET(GPR11, gpr[11]); |
295 | DEFINE(GPR12, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, gpr[12])); | 280 | STACK_PT_REGS_OFFSET(GPR12, gpr[12]); |
296 | DEFINE(GPR13, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, gpr[13])); | 281 | STACK_PT_REGS_OFFSET(GPR13, gpr[13]); |
297 | #ifndef CONFIG_PPC64 | 282 | #ifndef CONFIG_PPC64 |
298 | DEFINE(GPR14, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, gpr[14])); | 283 | STACK_PT_REGS_OFFSET(GPR14, gpr[14]); |
299 | #endif /* CONFIG_PPC64 */ | 284 | #endif /* CONFIG_PPC64 */ |
300 | /* | 285 | /* |
301 | * Note: these symbols include _ because they overlap with special | 286 | * Note: these symbols include _ because they overlap with special |
302 | * register names | 287 | * register names |
303 | */ | 288 | */ |
304 | DEFINE(_NIP, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, nip)); | 289 | STACK_PT_REGS_OFFSET(_NIP, nip); |
305 | DEFINE(_MSR, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, msr)); | 290 | STACK_PT_REGS_OFFSET(_MSR, msr); |
306 | DEFINE(_CTR, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, ctr)); | 291 | STACK_PT_REGS_OFFSET(_CTR, ctr); |
307 | DEFINE(_LINK, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, link)); | 292 | STACK_PT_REGS_OFFSET(_LINK, link); |
308 | DEFINE(_CCR, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, ccr)); | 293 | STACK_PT_REGS_OFFSET(_CCR, ccr); |
309 | DEFINE(_XER, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, xer)); | 294 | STACK_PT_REGS_OFFSET(_XER, xer); |
310 | DEFINE(_DAR, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, dar)); | 295 | STACK_PT_REGS_OFFSET(_DAR, dar); |
311 | DEFINE(_DSISR, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, dsisr)); | 296 | STACK_PT_REGS_OFFSET(_DSISR, dsisr); |
312 | DEFINE(ORIG_GPR3, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, orig_gpr3)); | 297 | STACK_PT_REGS_OFFSET(ORIG_GPR3, orig_gpr3); |
313 | DEFINE(RESULT, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, result)); | 298 | STACK_PT_REGS_OFFSET(RESULT, result); |
314 | DEFINE(_TRAP, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, trap)); | 299 | STACK_PT_REGS_OFFSET(_TRAP, trap); |
315 | #ifndef CONFIG_PPC64 | 300 | #ifndef CONFIG_PPC64 |
316 | /* | 301 | /* |
317 | * The PowerPC 400-class & Book-E processors have neither the DAR | 302 | * The PowerPC 400-class & Book-E processors have neither the DAR |
@@ -319,10 +304,10 @@ int main(void) | |||
319 | * DEAR and ESR SPRs for such processors. For critical interrupts | 304 | * DEAR and ESR SPRs for such processors. For critical interrupts |
320 | * we use them to hold SRR0 and SRR1. | 305 | * we use them to hold SRR0 and SRR1. |
321 | */ | 306 | */ |
322 | DEFINE(_DEAR, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, dar)); | 307 | STACK_PT_REGS_OFFSET(_DEAR, dar); |
323 | DEFINE(_ESR, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, dsisr)); | 308 | STACK_PT_REGS_OFFSET(_ESR, dsisr); |
324 | #else /* CONFIG_PPC64 */ | 309 | #else /* CONFIG_PPC64 */ |
325 | DEFINE(SOFTE, STACK_FRAME_OVERHEAD+offsetof(struct pt_regs, softe)); | 310 | STACK_PT_REGS_OFFSET(SOFTE, softe); |
326 | 311 | ||
327 | /* These _only_ to be used with {PROM,RTAS}_FRAME_SIZE!!! */ | 312 | /* These _only_ to be used with {PROM,RTAS}_FRAME_SIZE!!! */ |
328 | DEFINE(_SRR0, STACK_FRAME_OVERHEAD+sizeof(struct pt_regs)); | 313 | DEFINE(_SRR0, STACK_FRAME_OVERHEAD+sizeof(struct pt_regs)); |
@@ -351,17 +336,17 @@ int main(void) | |||
351 | #endif | 336 | #endif |
352 | 337 | ||
353 | #ifndef CONFIG_PPC64 | 338 | #ifndef CONFIG_PPC64 |
354 | DEFINE(MM_PGD, offsetof(struct mm_struct, pgd)); | 339 | OFFSET(MM_PGD, mm_struct, pgd); |
355 | #endif /* ! CONFIG_PPC64 */ | 340 | #endif /* ! CONFIG_PPC64 */ |
356 | 341 | ||
357 | /* About the CPU features table */ | 342 | /* About the CPU features table */ |
358 | DEFINE(CPU_SPEC_FEATURES, offsetof(struct cpu_spec, cpu_features)); | 343 | OFFSET(CPU_SPEC_FEATURES, cpu_spec, cpu_features); |
359 | DEFINE(CPU_SPEC_SETUP, offsetof(struct cpu_spec, cpu_setup)); | 344 | OFFSET(CPU_SPEC_SETUP, cpu_spec, cpu_setup); |
360 | DEFINE(CPU_SPEC_RESTORE, offsetof(struct cpu_spec, cpu_restore)); | 345 | OFFSET(CPU_SPEC_RESTORE, cpu_spec, cpu_restore); |
361 | 346 | ||
362 | DEFINE(pbe_address, offsetof(struct pbe, address)); | 347 | OFFSET(pbe_address, pbe, address); |
363 | DEFINE(pbe_orig_address, offsetof(struct pbe, orig_address)); | 348 | OFFSET(pbe_orig_address, pbe, orig_address); |
364 | DEFINE(pbe_next, offsetof(struct pbe, next)); | 349 | OFFSET(pbe_next, pbe, next); |
365 | 350 | ||
366 | #ifndef CONFIG_PPC64 | 351 | #ifndef CONFIG_PPC64 |
367 | DEFINE(TASK_SIZE, TASK_SIZE); | 352 | DEFINE(TASK_SIZE, TASK_SIZE); |
@@ -369,40 +354,40 @@ int main(void) | |||
369 | #endif /* ! CONFIG_PPC64 */ | 354 | #endif /* ! CONFIG_PPC64 */ |
370 | 355 | ||
371 | /* datapage offsets for use by vdso */ | 356 | /* datapage offsets for use by vdso */ |
372 | DEFINE(CFG_TB_ORIG_STAMP, offsetof(struct vdso_data, tb_orig_stamp)); | 357 | OFFSET(CFG_TB_ORIG_STAMP, vdso_data, tb_orig_stamp); |
373 | DEFINE(CFG_TB_TICKS_PER_SEC, offsetof(struct vdso_data, tb_ticks_per_sec)); | 358 | OFFSET(CFG_TB_TICKS_PER_SEC, vdso_data, tb_ticks_per_sec); |
374 | DEFINE(CFG_TB_TO_XS, offsetof(struct vdso_data, tb_to_xs)); | 359 | OFFSET(CFG_TB_TO_XS, vdso_data, tb_to_xs); |
375 | DEFINE(CFG_TB_UPDATE_COUNT, offsetof(struct vdso_data, tb_update_count)); | 360 | OFFSET(CFG_TB_UPDATE_COUNT, vdso_data, tb_update_count); |
376 | DEFINE(CFG_TZ_MINUTEWEST, offsetof(struct vdso_data, tz_minuteswest)); | 361 | OFFSET(CFG_TZ_MINUTEWEST, vdso_data, tz_minuteswest); |
377 | DEFINE(CFG_TZ_DSTTIME, offsetof(struct vdso_data, tz_dsttime)); | 362 | OFFSET(CFG_TZ_DSTTIME, vdso_data, tz_dsttime); |
378 | DEFINE(CFG_SYSCALL_MAP32, offsetof(struct vdso_data, syscall_map_32)); | 363 | OFFSET(CFG_SYSCALL_MAP32, vdso_data, syscall_map_32); |
379 | DEFINE(WTOM_CLOCK_SEC, offsetof(struct vdso_data, wtom_clock_sec)); | 364 | OFFSET(WTOM_CLOCK_SEC, vdso_data, wtom_clock_sec); |
380 | DEFINE(WTOM_CLOCK_NSEC, offsetof(struct vdso_data, wtom_clock_nsec)); | 365 | OFFSET(WTOM_CLOCK_NSEC, vdso_data, wtom_clock_nsec); |
381 | DEFINE(STAMP_XTIME, offsetof(struct vdso_data, stamp_xtime)); | 366 | OFFSET(STAMP_XTIME, vdso_data, stamp_xtime); |
382 | DEFINE(STAMP_SEC_FRAC, offsetof(struct vdso_data, stamp_sec_fraction)); | 367 | OFFSET(STAMP_SEC_FRAC, vdso_data, stamp_sec_fraction); |
383 | DEFINE(CFG_ICACHE_BLOCKSZ, offsetof(struct vdso_data, icache_block_size)); | 368 | OFFSET(CFG_ICACHE_BLOCKSZ, vdso_data, icache_block_size); |
384 | DEFINE(CFG_DCACHE_BLOCKSZ, offsetof(struct vdso_data, dcache_block_size)); | 369 | OFFSET(CFG_DCACHE_BLOCKSZ, vdso_data, dcache_block_size); |
385 | DEFINE(CFG_ICACHE_LOGBLOCKSZ, offsetof(struct vdso_data, icache_log_block_size)); | 370 | OFFSET(CFG_ICACHE_LOGBLOCKSZ, vdso_data, icache_log_block_size); |
386 | DEFINE(CFG_DCACHE_LOGBLOCKSZ, offsetof(struct vdso_data, dcache_log_block_size)); | 371 | OFFSET(CFG_DCACHE_LOGBLOCKSZ, vdso_data, dcache_log_block_size); |
387 | #ifdef CONFIG_PPC64 | 372 | #ifdef CONFIG_PPC64 |
388 | DEFINE(CFG_SYSCALL_MAP64, offsetof(struct vdso_data, syscall_map_64)); | 373 | OFFSET(CFG_SYSCALL_MAP64, vdso_data, syscall_map_64); |
389 | DEFINE(TVAL64_TV_SEC, offsetof(struct timeval, tv_sec)); | 374 | OFFSET(TVAL64_TV_SEC, timeval, tv_sec); |
390 | DEFINE(TVAL64_TV_USEC, offsetof(struct timeval, tv_usec)); | 375 | OFFSET(TVAL64_TV_USEC, timeval, tv_usec); |
391 | DEFINE(TVAL32_TV_SEC, offsetof(struct compat_timeval, tv_sec)); | 376 | OFFSET(TVAL32_TV_SEC, compat_timeval, tv_sec); |
392 | DEFINE(TVAL32_TV_USEC, offsetof(struct compat_timeval, tv_usec)); | 377 | OFFSET(TVAL32_TV_USEC, compat_timeval, tv_usec); |
393 | DEFINE(TSPC64_TV_SEC, offsetof(struct timespec, tv_sec)); | 378 | OFFSET(TSPC64_TV_SEC, timespec, tv_sec); |
394 | DEFINE(TSPC64_TV_NSEC, offsetof(struct timespec, tv_nsec)); | 379 | OFFSET(TSPC64_TV_NSEC, timespec, tv_nsec); |
395 | DEFINE(TSPC32_TV_SEC, offsetof(struct compat_timespec, tv_sec)); | 380 | OFFSET(TSPC32_TV_SEC, compat_timespec, tv_sec); |
396 | DEFINE(TSPC32_TV_NSEC, offsetof(struct compat_timespec, tv_nsec)); | 381 | OFFSET(TSPC32_TV_NSEC, compat_timespec, tv_nsec); |
397 | #else | 382 | #else |
398 | DEFINE(TVAL32_TV_SEC, offsetof(struct timeval, tv_sec)); | 383 | OFFSET(TVAL32_TV_SEC, timeval, tv_sec); |
399 | DEFINE(TVAL32_TV_USEC, offsetof(struct timeval, tv_usec)); | 384 | OFFSET(TVAL32_TV_USEC, timeval, tv_usec); |
400 | DEFINE(TSPC32_TV_SEC, offsetof(struct timespec, tv_sec)); | 385 | OFFSET(TSPC32_TV_SEC, timespec, tv_sec); |
401 | DEFINE(TSPC32_TV_NSEC, offsetof(struct timespec, tv_nsec)); | 386 | OFFSET(TSPC32_TV_NSEC, timespec, tv_nsec); |
402 | #endif | 387 | #endif |
403 | /* timeval/timezone offsets for use by vdso */ | 388 | /* timeval/timezone offsets for use by vdso */ |
404 | DEFINE(TZONE_TZ_MINWEST, offsetof(struct timezone, tz_minuteswest)); | 389 | OFFSET(TZONE_TZ_MINWEST, timezone, tz_minuteswest); |
405 | DEFINE(TZONE_TZ_DSTTIME, offsetof(struct timezone, tz_dsttime)); | 390 | OFFSET(TZONE_TZ_DSTTIME, timezone, tz_dsttime); |
406 | 391 | ||
407 | /* Other bits used by the vdso */ | 392 | /* Other bits used by the vdso */ |
408 | DEFINE(CLOCK_REALTIME, CLOCK_REALTIME); | 393 | DEFINE(CLOCK_REALTIME, CLOCK_REALTIME); |
@@ -422,170 +407,170 @@ int main(void) | |||
422 | DEFINE(PTE_SIZE, sizeof(pte_t)); | 407 | DEFINE(PTE_SIZE, sizeof(pte_t)); |
423 | 408 | ||
424 | #ifdef CONFIG_KVM | 409 | #ifdef CONFIG_KVM |
425 | DEFINE(VCPU_HOST_STACK, offsetof(struct kvm_vcpu, arch.host_stack)); | 410 | OFFSET(VCPU_HOST_STACK, kvm_vcpu, arch.host_stack); |
426 | DEFINE(VCPU_HOST_PID, offsetof(struct kvm_vcpu, arch.host_pid)); | 411 | OFFSET(VCPU_HOST_PID, kvm_vcpu, arch.host_pid); |
427 | DEFINE(VCPU_GUEST_PID, offsetof(struct kvm_vcpu, arch.pid)); | 412 | OFFSET(VCPU_GUEST_PID, kvm_vcpu, arch.pid); |
428 | DEFINE(VCPU_GPRS, offsetof(struct kvm_vcpu, arch.gpr)); | 413 | OFFSET(VCPU_GPRS, kvm_vcpu, arch.gpr); |
429 | DEFINE(VCPU_VRSAVE, offsetof(struct kvm_vcpu, arch.vrsave)); | 414 | OFFSET(VCPU_VRSAVE, kvm_vcpu, arch.vrsave); |
430 | DEFINE(VCPU_FPRS, offsetof(struct kvm_vcpu, arch.fp.fpr)); | 415 | OFFSET(VCPU_FPRS, kvm_vcpu, arch.fp.fpr); |
431 | #ifdef CONFIG_ALTIVEC | 416 | #ifdef CONFIG_ALTIVEC |
432 | DEFINE(VCPU_VRS, offsetof(struct kvm_vcpu, arch.vr.vr)); | 417 | OFFSET(VCPU_VRS, kvm_vcpu, arch.vr.vr); |
433 | #endif | 418 | #endif |
434 | DEFINE(VCPU_XER, offsetof(struct kvm_vcpu, arch.xer)); | 419 | OFFSET(VCPU_XER, kvm_vcpu, arch.xer); |
435 | DEFINE(VCPU_CTR, offsetof(struct kvm_vcpu, arch.ctr)); | 420 | OFFSET(VCPU_CTR, kvm_vcpu, arch.ctr); |
436 | DEFINE(VCPU_LR, offsetof(struct kvm_vcpu, arch.lr)); | 421 | OFFSET(VCPU_LR, kvm_vcpu, arch.lr); |
437 | #ifdef CONFIG_PPC_BOOK3S | 422 | #ifdef CONFIG_PPC_BOOK3S |
438 | DEFINE(VCPU_TAR, offsetof(struct kvm_vcpu, arch.tar)); | 423 | OFFSET(VCPU_TAR, kvm_vcpu, arch.tar); |
439 | #endif | 424 | #endif |
440 | DEFINE(VCPU_CR, offsetof(struct kvm_vcpu, arch.cr)); | 425 | OFFSET(VCPU_CR, kvm_vcpu, arch.cr); |
441 | DEFINE(VCPU_PC, offsetof(struct kvm_vcpu, arch.pc)); | 426 | OFFSET(VCPU_PC, kvm_vcpu, arch.pc); |
442 | #ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE | 427 | #ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE |
443 | DEFINE(VCPU_MSR, offsetof(struct kvm_vcpu, arch.shregs.msr)); | 428 | OFFSET(VCPU_MSR, kvm_vcpu, arch.shregs.msr); |
444 | DEFINE(VCPU_SRR0, offsetof(struct kvm_vcpu, arch.shregs.srr0)); | 429 | OFFSET(VCPU_SRR0, kvm_vcpu, arch.shregs.srr0); |
445 | DEFINE(VCPU_SRR1, offsetof(struct kvm_vcpu, arch.shregs.srr1)); | 430 | OFFSET(VCPU_SRR1, kvm_vcpu, arch.shregs.srr1); |
446 | DEFINE(VCPU_SPRG0, offsetof(struct kvm_vcpu, arch.shregs.sprg0)); | 431 | OFFSET(VCPU_SPRG0, kvm_vcpu, arch.shregs.sprg0); |
447 | DEFINE(VCPU_SPRG1, offsetof(struct kvm_vcpu, arch.shregs.sprg1)); | 432 | OFFSET(VCPU_SPRG1, kvm_vcpu, arch.shregs.sprg1); |
448 | DEFINE(VCPU_SPRG2, offsetof(struct kvm_vcpu, arch.shregs.sprg2)); | 433 | OFFSET(VCPU_SPRG2, kvm_vcpu, arch.shregs.sprg2); |
449 | DEFINE(VCPU_SPRG3, offsetof(struct kvm_vcpu, arch.shregs.sprg3)); | 434 | OFFSET(VCPU_SPRG3, kvm_vcpu, arch.shregs.sprg3); |
450 | #endif | 435 | #endif |
451 | #ifdef CONFIG_KVM_BOOK3S_HV_EXIT_TIMING | 436 | #ifdef CONFIG_KVM_BOOK3S_HV_EXIT_TIMING |
452 | DEFINE(VCPU_TB_RMENTRY, offsetof(struct kvm_vcpu, arch.rm_entry)); | 437 | OFFSET(VCPU_TB_RMENTRY, kvm_vcpu, arch.rm_entry); |
453 | DEFINE(VCPU_TB_RMINTR, offsetof(struct kvm_vcpu, arch.rm_intr)); | 438 | OFFSET(VCPU_TB_RMINTR, kvm_vcpu, arch.rm_intr); |
454 | DEFINE(VCPU_TB_RMEXIT, offsetof(struct kvm_vcpu, arch.rm_exit)); | 439 | OFFSET(VCPU_TB_RMEXIT, kvm_vcpu, arch.rm_exit); |
455 | DEFINE(VCPU_TB_GUEST, offsetof(struct kvm_vcpu, arch.guest_time)); | 440 | OFFSET(VCPU_TB_GUEST, kvm_vcpu, arch.guest_time); |
456 | DEFINE(VCPU_TB_CEDE, offsetof(struct kvm_vcpu, arch.cede_time)); | 441 | OFFSET(VCPU_TB_CEDE, kvm_vcpu, arch.cede_time); |
457 | DEFINE(VCPU_CUR_ACTIVITY, offsetof(struct kvm_vcpu, arch.cur_activity)); | 442 | OFFSET(VCPU_CUR_ACTIVITY, kvm_vcpu, arch.cur_activity); |
458 | DEFINE(VCPU_ACTIVITY_START, offsetof(struct kvm_vcpu, arch.cur_tb_start)); | 443 | OFFSET(VCPU_ACTIVITY_START, kvm_vcpu, arch.cur_tb_start); |
459 | DEFINE(TAS_SEQCOUNT, offsetof(struct kvmhv_tb_accumulator, seqcount)); | 444 | OFFSET(TAS_SEQCOUNT, kvmhv_tb_accumulator, seqcount); |
460 | DEFINE(TAS_TOTAL, offsetof(struct kvmhv_tb_accumulator, tb_total)); | 445 | OFFSET(TAS_TOTAL, kvmhv_tb_accumulator, tb_total); |
461 | DEFINE(TAS_MIN, offsetof(struct kvmhv_tb_accumulator, tb_min)); | 446 | OFFSET(TAS_MIN, kvmhv_tb_accumulator, tb_min); |
462 | DEFINE(TAS_MAX, offsetof(struct kvmhv_tb_accumulator, tb_max)); | 447 | OFFSET(TAS_MAX, kvmhv_tb_accumulator, tb_max); |
463 | #endif | 448 | #endif |
464 | DEFINE(VCPU_SHARED_SPRG3, offsetof(struct kvm_vcpu_arch_shared, sprg3)); | 449 | OFFSET(VCPU_SHARED_SPRG3, kvm_vcpu_arch_shared, sprg3); |
465 | DEFINE(VCPU_SHARED_SPRG4, offsetof(struct kvm_vcpu_arch_shared, sprg4)); | 450 | OFFSET(VCPU_SHARED_SPRG4, kvm_vcpu_arch_shared, sprg4); |
466 | DEFINE(VCPU_SHARED_SPRG5, offsetof(struct kvm_vcpu_arch_shared, sprg5)); | 451 | OFFSET(VCPU_SHARED_SPRG5, kvm_vcpu_arch_shared, sprg5); |
467 | DEFINE(VCPU_SHARED_SPRG6, offsetof(struct kvm_vcpu_arch_shared, sprg6)); | 452 | OFFSET(VCPU_SHARED_SPRG6, kvm_vcpu_arch_shared, sprg6); |
468 | DEFINE(VCPU_SHARED_SPRG7, offsetof(struct kvm_vcpu_arch_shared, sprg7)); | 453 | OFFSET(VCPU_SHARED_SPRG7, kvm_vcpu_arch_shared, sprg7); |
469 | DEFINE(VCPU_SHADOW_PID, offsetof(struct kvm_vcpu, arch.shadow_pid)); | 454 | OFFSET(VCPU_SHADOW_PID, kvm_vcpu, arch.shadow_pid); |
470 | DEFINE(VCPU_SHADOW_PID1, offsetof(struct kvm_vcpu, arch.shadow_pid1)); | 455 | OFFSET(VCPU_SHADOW_PID1, kvm_vcpu, arch.shadow_pid1); |
471 | DEFINE(VCPU_SHARED, offsetof(struct kvm_vcpu, arch.shared)); | 456 | OFFSET(VCPU_SHARED, kvm_vcpu, arch.shared); |
472 | DEFINE(VCPU_SHARED_MSR, offsetof(struct kvm_vcpu_arch_shared, msr)); | 457 | OFFSET(VCPU_SHARED_MSR, kvm_vcpu_arch_shared, msr); |
473 | DEFINE(VCPU_SHADOW_MSR, offsetof(struct kvm_vcpu, arch.shadow_msr)); | 458 | OFFSET(VCPU_SHADOW_MSR, kvm_vcpu, arch.shadow_msr); |
474 | #if defined(CONFIG_PPC_BOOK3S_64) && defined(CONFIG_KVM_BOOK3S_PR_POSSIBLE) | 459 | #if defined(CONFIG_PPC_BOOK3S_64) && defined(CONFIG_KVM_BOOK3S_PR_POSSIBLE) |
475 | DEFINE(VCPU_SHAREDBE, offsetof(struct kvm_vcpu, arch.shared_big_endian)); | 460 | OFFSET(VCPU_SHAREDBE, kvm_vcpu, arch.shared_big_endian); |
476 | #endif | 461 | #endif |
477 | 462 | ||
478 | DEFINE(VCPU_SHARED_MAS0, offsetof(struct kvm_vcpu_arch_shared, mas0)); | 463 | OFFSET(VCPU_SHARED_MAS0, kvm_vcpu_arch_shared, mas0); |
479 | DEFINE(VCPU_SHARED_MAS1, offsetof(struct kvm_vcpu_arch_shared, mas1)); | 464 | OFFSET(VCPU_SHARED_MAS1, kvm_vcpu_arch_shared, mas1); |
480 | DEFINE(VCPU_SHARED_MAS2, offsetof(struct kvm_vcpu_arch_shared, mas2)); | 465 | OFFSET(VCPU_SHARED_MAS2, kvm_vcpu_arch_shared, mas2); |
481 | DEFINE(VCPU_SHARED_MAS7_3, offsetof(struct kvm_vcpu_arch_shared, mas7_3)); | 466 | OFFSET(VCPU_SHARED_MAS7_3, kvm_vcpu_arch_shared, mas7_3); |
482 | DEFINE(VCPU_SHARED_MAS4, offsetof(struct kvm_vcpu_arch_shared, mas4)); | 467 | OFFSET(VCPU_SHARED_MAS4, kvm_vcpu_arch_shared, mas4); |
483 | DEFINE(VCPU_SHARED_MAS6, offsetof(struct kvm_vcpu_arch_shared, mas6)); | 468 | OFFSET(VCPU_SHARED_MAS6, kvm_vcpu_arch_shared, mas6); |
484 | 469 | ||
485 | DEFINE(VCPU_KVM, offsetof(struct kvm_vcpu, kvm)); | 470 | OFFSET(VCPU_KVM, kvm_vcpu, kvm); |
486 | DEFINE(KVM_LPID, offsetof(struct kvm, arch.lpid)); | 471 | OFFSET(KVM_LPID, kvm, arch.lpid); |
487 | 472 | ||
488 | /* book3s */ | 473 | /* book3s */ |
489 | #ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE | 474 | #ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE |
490 | DEFINE(KVM_TLB_SETS, offsetof(struct kvm, arch.tlb_sets)); | 475 | OFFSET(KVM_TLB_SETS, kvm, arch.tlb_sets); |
491 | DEFINE(KVM_SDR1, offsetof(struct kvm, arch.sdr1)); | 476 | OFFSET(KVM_SDR1, kvm, arch.sdr1); |
492 | DEFINE(KVM_HOST_LPID, offsetof(struct kvm, arch.host_lpid)); | 477 | OFFSET(KVM_HOST_LPID, kvm, arch.host_lpid); |
493 | DEFINE(KVM_HOST_LPCR, offsetof(struct kvm, arch.host_lpcr)); | 478 | OFFSET(KVM_HOST_LPCR, kvm, arch.host_lpcr); |
494 | DEFINE(KVM_HOST_SDR1, offsetof(struct kvm, arch.host_sdr1)); | 479 | OFFSET(KVM_HOST_SDR1, kvm, arch.host_sdr1); |
495 | DEFINE(KVM_NEED_FLUSH, offsetof(struct kvm, arch.need_tlb_flush.bits)); | 480 | OFFSET(KVM_NEED_FLUSH, kvm, arch.need_tlb_flush.bits); |
496 | DEFINE(KVM_ENABLED_HCALLS, offsetof(struct kvm, arch.enabled_hcalls)); | 481 | OFFSET(KVM_ENABLED_HCALLS, kvm, arch.enabled_hcalls); |
497 | DEFINE(KVM_VRMA_SLB_V, offsetof(struct kvm, arch.vrma_slb_v)); | 482 | OFFSET(KVM_VRMA_SLB_V, kvm, arch.vrma_slb_v); |
498 | DEFINE(KVM_RADIX, offsetof(struct kvm, arch.radix)); | 483 | OFFSET(KVM_RADIX, kvm, arch.radix); |
499 | DEFINE(VCPU_DSISR, offsetof(struct kvm_vcpu, arch.shregs.dsisr)); | 484 | OFFSET(VCPU_DSISR, kvm_vcpu, arch.shregs.dsisr); |
500 | DEFINE(VCPU_DAR, offsetof(struct kvm_vcpu, arch.shregs.dar)); | 485 | OFFSET(VCPU_DAR, kvm_vcpu, arch.shregs.dar); |
501 | DEFINE(VCPU_VPA, offsetof(struct kvm_vcpu, arch.vpa.pinned_addr)); | 486 | OFFSET(VCPU_VPA, kvm_vcpu, arch.vpa.pinned_addr); |
502 | DEFINE(VCPU_VPA_DIRTY, offsetof(struct kvm_vcpu, arch.vpa.dirty)); | 487 | OFFSET(VCPU_VPA_DIRTY, kvm_vcpu, arch.vpa.dirty); |
503 | DEFINE(VCPU_HEIR, offsetof(struct kvm_vcpu, arch.emul_inst)); | 488 | OFFSET(VCPU_HEIR, kvm_vcpu, arch.emul_inst); |
504 | DEFINE(VCPU_CPU, offsetof(struct kvm_vcpu, cpu)); | 489 | OFFSET(VCPU_CPU, kvm_vcpu, cpu); |
505 | DEFINE(VCPU_THREAD_CPU, offsetof(struct kvm_vcpu, arch.thread_cpu)); | 490 | OFFSET(VCPU_THREAD_CPU, kvm_vcpu, arch.thread_cpu); |
506 | #endif | 491 | #endif |
507 | #ifdef CONFIG_PPC_BOOK3S | 492 | #ifdef CONFIG_PPC_BOOK3S |
508 | DEFINE(VCPU_PURR, offsetof(struct kvm_vcpu, arch.purr)); | 493 | OFFSET(VCPU_PURR, kvm_vcpu, arch.purr); |
509 | DEFINE(VCPU_SPURR, offsetof(struct kvm_vcpu, arch.spurr)); | 494 | OFFSET(VCPU_SPURR, kvm_vcpu, arch.spurr); |
510 | DEFINE(VCPU_IC, offsetof(struct kvm_vcpu, arch.ic)); | 495 | OFFSET(VCPU_IC, kvm_vcpu, arch.ic); |
511 | DEFINE(VCPU_DSCR, offsetof(struct kvm_vcpu, arch.dscr)); | 496 | OFFSET(VCPU_DSCR, kvm_vcpu, arch.dscr); |
512 | DEFINE(VCPU_AMR, offsetof(struct kvm_vcpu, arch.amr)); | 497 | OFFSET(VCPU_AMR, kvm_vcpu, arch.amr); |
513 | DEFINE(VCPU_UAMOR, offsetof(struct kvm_vcpu, arch.uamor)); | 498 | OFFSET(VCPU_UAMOR, kvm_vcpu, arch.uamor); |
514 | DEFINE(VCPU_IAMR, offsetof(struct kvm_vcpu, arch.iamr)); | 499 | OFFSET(VCPU_IAMR, kvm_vcpu, arch.iamr); |
515 | DEFINE(VCPU_CTRL, offsetof(struct kvm_vcpu, arch.ctrl)); | 500 | OFFSET(VCPU_CTRL, kvm_vcpu, arch.ctrl); |
516 | DEFINE(VCPU_DABR, offsetof(struct kvm_vcpu, arch.dabr)); | 501 | OFFSET(VCPU_DABR, kvm_vcpu, arch.dabr); |
517 | DEFINE(VCPU_DABRX, offsetof(struct kvm_vcpu, arch.dabrx)); | 502 | OFFSET(VCPU_DABRX, kvm_vcpu, arch.dabrx); |
518 | DEFINE(VCPU_DAWR, offsetof(struct kvm_vcpu, arch.dawr)); | 503 | OFFSET(VCPU_DAWR, kvm_vcpu, arch.dawr); |
519 | DEFINE(VCPU_DAWRX, offsetof(struct kvm_vcpu, arch.dawrx)); | 504 | OFFSET(VCPU_DAWRX, kvm_vcpu, arch.dawrx); |
520 | DEFINE(VCPU_CIABR, offsetof(struct kvm_vcpu, arch.ciabr)); | 505 | OFFSET(VCPU_CIABR, kvm_vcpu, arch.ciabr); |
521 | DEFINE(VCPU_HFLAGS, offsetof(struct kvm_vcpu, arch.hflags)); | 506 | OFFSET(VCPU_HFLAGS, kvm_vcpu, arch.hflags); |
522 | DEFINE(VCPU_DEC, offsetof(struct kvm_vcpu, arch.dec)); | 507 | OFFSET(VCPU_DEC, kvm_vcpu, arch.dec); |
523 | DEFINE(VCPU_DEC_EXPIRES, offsetof(struct kvm_vcpu, arch.dec_expires)); | 508 | OFFSET(VCPU_DEC_EXPIRES, kvm_vcpu, arch.dec_expires); |
524 | DEFINE(VCPU_PENDING_EXC, offsetof(struct kvm_vcpu, arch.pending_exceptions)); | 509 | OFFSET(VCPU_PENDING_EXC, kvm_vcpu, arch.pending_exceptions); |
525 | DEFINE(VCPU_CEDED, offsetof(struct kvm_vcpu, arch.ceded)); | 510 | OFFSET(VCPU_CEDED, kvm_vcpu, arch.ceded); |
526 | DEFINE(VCPU_PRODDED, offsetof(struct kvm_vcpu, arch.prodded)); | 511 | OFFSET(VCPU_PRODDED, kvm_vcpu, arch.prodded); |
527 | DEFINE(VCPU_MMCR, offsetof(struct kvm_vcpu, arch.mmcr)); | 512 | OFFSET(VCPU_MMCR, kvm_vcpu, arch.mmcr); |
528 | DEFINE(VCPU_PMC, offsetof(struct kvm_vcpu, arch.pmc)); | 513 | OFFSET(VCPU_PMC, kvm_vcpu, arch.pmc); |
529 | DEFINE(VCPU_SPMC, offsetof(struct kvm_vcpu, arch.spmc)); | 514 | OFFSET(VCPU_SPMC, kvm_vcpu, arch.spmc); |
530 | DEFINE(VCPU_SIAR, offsetof(struct kvm_vcpu, arch.siar)); | 515 | OFFSET(VCPU_SIAR, kvm_vcpu, arch.siar); |
531 | DEFINE(VCPU_SDAR, offsetof(struct kvm_vcpu, arch.sdar)); | 516 | OFFSET(VCPU_SDAR, kvm_vcpu, arch.sdar); |
532 | DEFINE(VCPU_SIER, offsetof(struct kvm_vcpu, arch.sier)); | 517 | OFFSET(VCPU_SIER, kvm_vcpu, arch.sier); |
533 | DEFINE(VCPU_SLB, offsetof(struct kvm_vcpu, arch.slb)); | 518 | OFFSET(VCPU_SLB, kvm_vcpu, arch.slb); |
534 | DEFINE(VCPU_SLB_MAX, offsetof(struct kvm_vcpu, arch.slb_max)); | 519 | OFFSET(VCPU_SLB_MAX, kvm_vcpu, arch.slb_max); |
535 | DEFINE(VCPU_SLB_NR, offsetof(struct kvm_vcpu, arch.slb_nr)); | 520 | OFFSET(VCPU_SLB_NR, kvm_vcpu, arch.slb_nr); |
536 | DEFINE(VCPU_FAULT_DSISR, offsetof(struct kvm_vcpu, arch.fault_dsisr)); | 521 | OFFSET(VCPU_FAULT_DSISR, kvm_vcpu, arch.fault_dsisr); |
537 | DEFINE(VCPU_FAULT_DAR, offsetof(struct kvm_vcpu, arch.fault_dar)); | 522 | OFFSET(VCPU_FAULT_DAR, kvm_vcpu, arch.fault_dar); |
538 | DEFINE(VCPU_FAULT_GPA, offsetof(struct kvm_vcpu, arch.fault_gpa)); | 523 | OFFSET(VCPU_FAULT_GPA, kvm_vcpu, arch.fault_gpa); |
539 | DEFINE(VCPU_INTR_MSR, offsetof(struct kvm_vcpu, arch.intr_msr)); | 524 | OFFSET(VCPU_INTR_MSR, kvm_vcpu, arch.intr_msr); |
540 | DEFINE(VCPU_LAST_INST, offsetof(struct kvm_vcpu, arch.last_inst)); | 525 | OFFSET(VCPU_LAST_INST, kvm_vcpu, arch.last_inst); |
541 | DEFINE(VCPU_TRAP, offsetof(struct kvm_vcpu, arch.trap)); | 526 | OFFSET(VCPU_TRAP, kvm_vcpu, arch.trap); |
542 | DEFINE(VCPU_CFAR, offsetof(struct kvm_vcpu, arch.cfar)); | 527 | OFFSET(VCPU_CFAR, kvm_vcpu, arch.cfar); |
543 | DEFINE(VCPU_PPR, offsetof(struct kvm_vcpu, arch.ppr)); | 528 | OFFSET(VCPU_PPR, kvm_vcpu, arch.ppr); |
544 | DEFINE(VCPU_FSCR, offsetof(struct kvm_vcpu, arch.fscr)); | 529 | OFFSET(VCPU_FSCR, kvm_vcpu, arch.fscr); |
545 | DEFINE(VCPU_PSPB, offsetof(struct kvm_vcpu, arch.pspb)); | 530 | OFFSET(VCPU_PSPB, kvm_vcpu, arch.pspb); |
546 | DEFINE(VCPU_EBBHR, offsetof(struct kvm_vcpu, arch.ebbhr)); | 531 | OFFSET(VCPU_EBBHR, kvm_vcpu, arch.ebbhr); |
547 | DEFINE(VCPU_EBBRR, offsetof(struct kvm_vcpu, arch.ebbrr)); | 532 | OFFSET(VCPU_EBBRR, kvm_vcpu, arch.ebbrr); |
548 | DEFINE(VCPU_BESCR, offsetof(struct kvm_vcpu, arch.bescr)); | 533 | OFFSET(VCPU_BESCR, kvm_vcpu, arch.bescr); |
549 | DEFINE(VCPU_CSIGR, offsetof(struct kvm_vcpu, arch.csigr)); | 534 | OFFSET(VCPU_CSIGR, kvm_vcpu, arch.csigr); |
550 | DEFINE(VCPU_TACR, offsetof(struct kvm_vcpu, arch.tacr)); | 535 | OFFSET(VCPU_TACR, kvm_vcpu, arch.tacr); |
551 | DEFINE(VCPU_TCSCR, offsetof(struct kvm_vcpu, arch.tcscr)); | 536 | OFFSET(VCPU_TCSCR, kvm_vcpu, arch.tcscr); |
552 | DEFINE(VCPU_ACOP, offsetof(struct kvm_vcpu, arch.acop)); | 537 | OFFSET(VCPU_ACOP, kvm_vcpu, arch.acop); |
553 | DEFINE(VCPU_WORT, offsetof(struct kvm_vcpu, arch.wort)); | 538 | OFFSET(VCPU_WORT, kvm_vcpu, arch.wort); |
554 | DEFINE(VCPU_TID, offsetof(struct kvm_vcpu, arch.tid)); | 539 | OFFSET(VCPU_TID, kvm_vcpu, arch.tid); |
555 | DEFINE(VCPU_PSSCR, offsetof(struct kvm_vcpu, arch.psscr)); | 540 | OFFSET(VCPU_PSSCR, kvm_vcpu, arch.psscr); |
556 | DEFINE(VCORE_ENTRY_EXIT, offsetof(struct kvmppc_vcore, entry_exit_map)); | 541 | OFFSET(VCORE_ENTRY_EXIT, kvmppc_vcore, entry_exit_map); |
557 | DEFINE(VCORE_IN_GUEST, offsetof(struct kvmppc_vcore, in_guest)); | 542 | OFFSET(VCORE_IN_GUEST, kvmppc_vcore, in_guest); |
558 | DEFINE(VCORE_NAPPING_THREADS, offsetof(struct kvmppc_vcore, napping_threads)); | 543 | OFFSET(VCORE_NAPPING_THREADS, kvmppc_vcore, napping_threads); |
559 | DEFINE(VCORE_KVM, offsetof(struct kvmppc_vcore, kvm)); | 544 | OFFSET(VCORE_KVM, kvmppc_vcore, kvm); |
560 | DEFINE(VCORE_TB_OFFSET, offsetof(struct kvmppc_vcore, tb_offset)); | 545 | OFFSET(VCORE_TB_OFFSET, kvmppc_vcore, tb_offset); |
561 | DEFINE(VCORE_LPCR, offsetof(struct kvmppc_vcore, lpcr)); | 546 | OFFSET(VCORE_LPCR, kvmppc_vcore, lpcr); |
562 | DEFINE(VCORE_PCR, offsetof(struct kvmppc_vcore, pcr)); | 547 | OFFSET(VCORE_PCR, kvmppc_vcore, pcr); |
563 | DEFINE(VCORE_DPDES, offsetof(struct kvmppc_vcore, dpdes)); | 548 | OFFSET(VCORE_DPDES, kvmppc_vcore, dpdes); |
564 | DEFINE(VCORE_VTB, offsetof(struct kvmppc_vcore, vtb)); | 549 | OFFSET(VCORE_VTB, kvmppc_vcore, vtb); |
565 | DEFINE(VCPU_SLB_E, offsetof(struct kvmppc_slb, orige)); | 550 | OFFSET(VCPU_SLB_E, kvmppc_slb, orige); |
566 | DEFINE(VCPU_SLB_V, offsetof(struct kvmppc_slb, origv)); | 551 | OFFSET(VCPU_SLB_V, kvmppc_slb, origv); |
567 | DEFINE(VCPU_SLB_SIZE, sizeof(struct kvmppc_slb)); | 552 | DEFINE(VCPU_SLB_SIZE, sizeof(struct kvmppc_slb)); |
568 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM | 553 | #ifdef CONFIG_PPC_TRANSACTIONAL_MEM |
569 | DEFINE(VCPU_TFHAR, offsetof(struct kvm_vcpu, arch.tfhar)); | 554 | OFFSET(VCPU_TFHAR, kvm_vcpu, arch.tfhar); |
570 | DEFINE(VCPU_TFIAR, offsetof(struct kvm_vcpu, arch.tfiar)); | 555 | OFFSET(VCPU_TFIAR, kvm_vcpu, arch.tfiar); |
571 | DEFINE(VCPU_TEXASR, offsetof(struct kvm_vcpu, arch.texasr)); | 556 | OFFSET(VCPU_TEXASR, kvm_vcpu, arch.texasr); |
572 | DEFINE(VCPU_GPR_TM, offsetof(struct kvm_vcpu, arch.gpr_tm)); | 557 | OFFSET(VCPU_GPR_TM, kvm_vcpu, arch.gpr_tm); |
573 | DEFINE(VCPU_FPRS_TM, offsetof(struct kvm_vcpu, arch.fp_tm.fpr)); | 558 | OFFSET(VCPU_FPRS_TM, kvm_vcpu, arch.fp_tm.fpr); |
574 | DEFINE(VCPU_VRS_TM, offsetof(struct kvm_vcpu, arch.vr_tm.vr)); | 559 | OFFSET(VCPU_VRS_TM, kvm_vcpu, arch.vr_tm.vr); |
575 | DEFINE(VCPU_VRSAVE_TM, offsetof(struct kvm_vcpu, arch.vrsave_tm)); | 560 | OFFSET(VCPU_VRSAVE_TM, kvm_vcpu, arch.vrsave_tm); |
576 | DEFINE(VCPU_CR_TM, offsetof(struct kvm_vcpu, arch.cr_tm)); | 561 | OFFSET(VCPU_CR_TM, kvm_vcpu, arch.cr_tm); |
577 | DEFINE(VCPU_XER_TM, offsetof(struct kvm_vcpu, arch.xer_tm)); | 562 | OFFSET(VCPU_XER_TM, kvm_vcpu, arch.xer_tm); |
578 | DEFINE(VCPU_LR_TM, offsetof(struct kvm_vcpu, arch.lr_tm)); | 563 | OFFSET(VCPU_LR_TM, kvm_vcpu, arch.lr_tm); |
579 | DEFINE(VCPU_CTR_TM, offsetof(struct kvm_vcpu, arch.ctr_tm)); | 564 | OFFSET(VCPU_CTR_TM, kvm_vcpu, arch.ctr_tm); |
580 | DEFINE(VCPU_AMR_TM, offsetof(struct kvm_vcpu, arch.amr_tm)); | 565 | OFFSET(VCPU_AMR_TM, kvm_vcpu, arch.amr_tm); |
581 | DEFINE(VCPU_PPR_TM, offsetof(struct kvm_vcpu, arch.ppr_tm)); | 566 | OFFSET(VCPU_PPR_TM, kvm_vcpu, arch.ppr_tm); |
582 | DEFINE(VCPU_DSCR_TM, offsetof(struct kvm_vcpu, arch.dscr_tm)); | 567 | OFFSET(VCPU_DSCR_TM, kvm_vcpu, arch.dscr_tm); |
583 | DEFINE(VCPU_TAR_TM, offsetof(struct kvm_vcpu, arch.tar_tm)); | 568 | OFFSET(VCPU_TAR_TM, kvm_vcpu, arch.tar_tm); |
584 | #endif | 569 | #endif |
585 | 570 | ||
586 | #ifdef CONFIG_PPC_BOOK3S_64 | 571 | #ifdef CONFIG_PPC_BOOK3S_64 |
587 | #ifdef CONFIG_KVM_BOOK3S_PR_POSSIBLE | 572 | #ifdef CONFIG_KVM_BOOK3S_PR_POSSIBLE |
588 | DEFINE(PACA_SVCPU, offsetof(struct paca_struct, shadow_vcpu)); | 573 | OFFSET(PACA_SVCPU, paca_struct, shadow_vcpu); |
589 | # define SVCPU_FIELD(x, f) DEFINE(x, offsetof(struct paca_struct, shadow_vcpu.f)) | 574 | # define SVCPU_FIELD(x, f) DEFINE(x, offsetof(struct paca_struct, shadow_vcpu.f)) |
590 | #else | 575 | #else |
591 | # define SVCPU_FIELD(x, f) | 576 | # define SVCPU_FIELD(x, f) |
@@ -668,11 +653,11 @@ int main(void) | |||
668 | HSTATE_FIELD(HSTATE_DECEXP, dec_expires); | 653 | HSTATE_FIELD(HSTATE_DECEXP, dec_expires); |
669 | HSTATE_FIELD(HSTATE_SPLIT_MODE, kvm_split_mode); | 654 | HSTATE_FIELD(HSTATE_SPLIT_MODE, kvm_split_mode); |
670 | DEFINE(IPI_PRIORITY, IPI_PRIORITY); | 655 | DEFINE(IPI_PRIORITY, IPI_PRIORITY); |
671 | DEFINE(KVM_SPLIT_RPR, offsetof(struct kvm_split_mode, rpr)); | 656 | OFFSET(KVM_SPLIT_RPR, kvm_split_mode, rpr); |
672 | DEFINE(KVM_SPLIT_PMMAR, offsetof(struct kvm_split_mode, pmmar)); | 657 | OFFSET(KVM_SPLIT_PMMAR, kvm_split_mode, pmmar); |
673 | DEFINE(KVM_SPLIT_LDBAR, offsetof(struct kvm_split_mode, ldbar)); | 658 | OFFSET(KVM_SPLIT_LDBAR, kvm_split_mode, ldbar); |
674 | DEFINE(KVM_SPLIT_DO_NAP, offsetof(struct kvm_split_mode, do_nap)); | 659 | OFFSET(KVM_SPLIT_DO_NAP, kvm_split_mode, do_nap); |
675 | DEFINE(KVM_SPLIT_NAPPED, offsetof(struct kvm_split_mode, napped)); | 660 | OFFSET(KVM_SPLIT_NAPPED, kvm_split_mode, napped); |
676 | #endif /* CONFIG_KVM_BOOK3S_HV_POSSIBLE */ | 661 | #endif /* CONFIG_KVM_BOOK3S_HV_POSSIBLE */ |
677 | 662 | ||
678 | #ifdef CONFIG_PPC_BOOK3S_64 | 663 | #ifdef CONFIG_PPC_BOOK3S_64 |
@@ -682,32 +667,27 @@ int main(void) | |||
682 | #endif /* CONFIG_PPC_BOOK3S_64 */ | 667 | #endif /* CONFIG_PPC_BOOK3S_64 */ |
683 | 668 | ||
684 | #else /* CONFIG_PPC_BOOK3S */ | 669 | #else /* CONFIG_PPC_BOOK3S */ |
685 | DEFINE(VCPU_CR, offsetof(struct kvm_vcpu, arch.cr)); | 670 | OFFSET(VCPU_CR, kvm_vcpu, arch.cr); |
686 | DEFINE(VCPU_XER, offsetof(struct kvm_vcpu, arch.xer)); | 671 | OFFSET(VCPU_XER, kvm_vcpu, arch.xer); |
687 | DEFINE(VCPU_LR, offsetof(struct kvm_vcpu, arch.lr)); | 672 | OFFSET(VCPU_LR, kvm_vcpu, arch.lr); |
688 | DEFINE(VCPU_CTR, offsetof(struct kvm_vcpu, arch.ctr)); | 673 | OFFSET(VCPU_CTR, kvm_vcpu, arch.ctr); |
689 | DEFINE(VCPU_PC, offsetof(struct kvm_vcpu, arch.pc)); | 674 | OFFSET(VCPU_PC, kvm_vcpu, arch.pc); |
690 | DEFINE(VCPU_SPRG9, offsetof(struct kvm_vcpu, arch.sprg9)); | 675 | OFFSET(VCPU_SPRG9, kvm_vcpu, arch.sprg9); |
691 | DEFINE(VCPU_LAST_INST, offsetof(struct kvm_vcpu, arch.last_inst)); | 676 | OFFSET(VCPU_LAST_INST, kvm_vcpu, arch.last_inst); |
692 | DEFINE(VCPU_FAULT_DEAR, offsetof(struct kvm_vcpu, arch.fault_dear)); | 677 | OFFSET(VCPU_FAULT_DEAR, kvm_vcpu, arch.fault_dear); |
693 | DEFINE(VCPU_FAULT_ESR, offsetof(struct kvm_vcpu, arch.fault_esr)); | 678 | OFFSET(VCPU_FAULT_ESR, kvm_vcpu, arch.fault_esr); |
694 | DEFINE(VCPU_CRIT_SAVE, offsetof(struct kvm_vcpu, arch.crit_save)); | 679 | OFFSET(VCPU_CRIT_SAVE, kvm_vcpu, arch.crit_save); |
695 | #endif /* CONFIG_PPC_BOOK3S */ | 680 | #endif /* CONFIG_PPC_BOOK3S */ |
696 | #endif /* CONFIG_KVM */ | 681 | #endif /* CONFIG_KVM */ |
697 | 682 | ||
698 | #ifdef CONFIG_KVM_GUEST | 683 | #ifdef CONFIG_KVM_GUEST |
699 | DEFINE(KVM_MAGIC_SCRATCH1, offsetof(struct kvm_vcpu_arch_shared, | 684 | OFFSET(KVM_MAGIC_SCRATCH1, kvm_vcpu_arch_shared, scratch1); |
700 | scratch1)); | 685 | OFFSET(KVM_MAGIC_SCRATCH2, kvm_vcpu_arch_shared, scratch2); |
701 | DEFINE(KVM_MAGIC_SCRATCH2, offsetof(struct kvm_vcpu_arch_shared, | 686 | OFFSET(KVM_MAGIC_SCRATCH3, kvm_vcpu_arch_shared, scratch3); |
702 | scratch2)); | 687 | OFFSET(KVM_MAGIC_INT, kvm_vcpu_arch_shared, int_pending); |
703 | DEFINE(KVM_MAGIC_SCRATCH3, offsetof(struct kvm_vcpu_arch_shared, | 688 | OFFSET(KVM_MAGIC_MSR, kvm_vcpu_arch_shared, msr); |
704 | scratch3)); | 689 | OFFSET(KVM_MAGIC_CRITICAL, kvm_vcpu_arch_shared, critical); |
705 | DEFINE(KVM_MAGIC_INT, offsetof(struct kvm_vcpu_arch_shared, | 690 | OFFSET(KVM_MAGIC_SR, kvm_vcpu_arch_shared, sr); |
706 | int_pending)); | ||
707 | DEFINE(KVM_MAGIC_MSR, offsetof(struct kvm_vcpu_arch_shared, msr)); | ||
708 | DEFINE(KVM_MAGIC_CRITICAL, offsetof(struct kvm_vcpu_arch_shared, | ||
709 | critical)); | ||
710 | DEFINE(KVM_MAGIC_SR, offsetof(struct kvm_vcpu_arch_shared, sr)); | ||
711 | #endif | 691 | #endif |
712 | 692 | ||
713 | #ifdef CONFIG_44x | 693 | #ifdef CONFIG_44x |
@@ -716,45 +696,37 @@ int main(void) | |||
716 | #endif | 696 | #endif |
717 | #ifdef CONFIG_PPC_FSL_BOOK3E | 697 | #ifdef CONFIG_PPC_FSL_BOOK3E |
718 | DEFINE(TLBCAM_SIZE, sizeof(struct tlbcam)); | 698 | DEFINE(TLBCAM_SIZE, sizeof(struct tlbcam)); |
719 | DEFINE(TLBCAM_MAS0, offsetof(struct tlbcam, MAS0)); | 699 | OFFSET(TLBCAM_MAS0, tlbcam, MAS0); |
720 | DEFINE(TLBCAM_MAS1, offsetof(struct tlbcam, MAS1)); | 700 | OFFSET(TLBCAM_MAS1, tlbcam, MAS1); |
721 | DEFINE(TLBCAM_MAS2, offsetof(struct tlbcam, MAS2)); | 701 | OFFSET(TLBCAM_MAS2, tlbcam, MAS2); |
722 | DEFINE(TLBCAM_MAS3, offsetof(struct tlbcam, MAS3)); | 702 | OFFSET(TLBCAM_MAS3, tlbcam, MAS3); |
723 | DEFINE(TLBCAM_MAS7, offsetof(struct tlbcam, MAS7)); | 703 | OFFSET(TLBCAM_MAS7, tlbcam, MAS7); |
724 | #endif | 704 | #endif |
725 | 705 | ||
726 | #if defined(CONFIG_KVM) && defined(CONFIG_SPE) | 706 | #if defined(CONFIG_KVM) && defined(CONFIG_SPE) |
727 | DEFINE(VCPU_EVR, offsetof(struct kvm_vcpu, arch.evr[0])); | 707 | OFFSET(VCPU_EVR, kvm_vcpu, arch.evr[0]); |
728 | DEFINE(VCPU_ACC, offsetof(struct kvm_vcpu, arch.acc)); | 708 | OFFSET(VCPU_ACC, kvm_vcpu, arch.acc); |
729 | DEFINE(VCPU_SPEFSCR, offsetof(struct kvm_vcpu, arch.spefscr)); | 709 | OFFSET(VCPU_SPEFSCR, kvm_vcpu, arch.spefscr); |
730 | DEFINE(VCPU_HOST_SPEFSCR, offsetof(struct kvm_vcpu, arch.host_spefscr)); | 710 | OFFSET(VCPU_HOST_SPEFSCR, kvm_vcpu, arch.host_spefscr); |
731 | #endif | 711 | #endif |
732 | 712 | ||
733 | #ifdef CONFIG_KVM_BOOKE_HV | 713 | #ifdef CONFIG_KVM_BOOKE_HV |
734 | DEFINE(VCPU_HOST_MAS4, offsetof(struct kvm_vcpu, arch.host_mas4)); | 714 | OFFSET(VCPU_HOST_MAS4, kvm_vcpu, arch.host_mas4); |
735 | DEFINE(VCPU_HOST_MAS6, offsetof(struct kvm_vcpu, arch.host_mas6)); | 715 | OFFSET(VCPU_HOST_MAS6, kvm_vcpu, arch.host_mas6); |
736 | #endif | 716 | #endif |
737 | 717 | ||
738 | #ifdef CONFIG_KVM_EXIT_TIMING | 718 | #ifdef CONFIG_KVM_EXIT_TIMING |
739 | DEFINE(VCPU_TIMING_EXIT_TBU, offsetof(struct kvm_vcpu, | 719 | OFFSET(VCPU_TIMING_EXIT_TBU, kvm_vcpu, arch.timing_exit.tv32.tbu); |
740 | arch.timing_exit.tv32.tbu)); | 720 | OFFSET(VCPU_TIMING_EXIT_TBL, kvm_vcpu, arch.timing_exit.tv32.tbl); |
741 | DEFINE(VCPU_TIMING_EXIT_TBL, offsetof(struct kvm_vcpu, | 721 | OFFSET(VCPU_TIMING_LAST_ENTER_TBU, kvm_vcpu, arch.timing_last_enter.tv32.tbu); |
742 | arch.timing_exit.tv32.tbl)); | 722 | OFFSET(VCPU_TIMING_LAST_ENTER_TBL, kvm_vcpu, arch.timing_last_enter.tv32.tbl); |
743 | DEFINE(VCPU_TIMING_LAST_ENTER_TBU, offsetof(struct kvm_vcpu, | ||
744 | arch.timing_last_enter.tv32.tbu)); | ||
745 | DEFINE(VCPU_TIMING_LAST_ENTER_TBL, offsetof(struct kvm_vcpu, | ||
746 | arch.timing_last_enter.tv32.tbl)); | ||
747 | #endif | 723 | #endif |
748 | 724 | ||
749 | #ifdef CONFIG_PPC_POWERNV | 725 | #ifdef CONFIG_PPC_POWERNV |
750 | DEFINE(PACA_CORE_IDLE_STATE_PTR, | 726 | OFFSET(PACA_CORE_IDLE_STATE_PTR, paca_struct, core_idle_state_ptr); |
751 | offsetof(struct paca_struct, core_idle_state_ptr)); | 727 | OFFSET(PACA_THREAD_IDLE_STATE, paca_struct, thread_idle_state); |
752 | DEFINE(PACA_THREAD_IDLE_STATE, | 728 | OFFSET(PACA_THREAD_MASK, paca_struct, thread_mask); |
753 | offsetof(struct paca_struct, thread_idle_state)); | 729 | OFFSET(PACA_SUBCORE_SIBLING_MASK, paca_struct, subcore_sibling_mask); |
754 | DEFINE(PACA_THREAD_MASK, | ||
755 | offsetof(struct paca_struct, thread_mask)); | ||
756 | DEFINE(PACA_SUBCORE_SIBLING_MASK, | ||
757 | offsetof(struct paca_struct, subcore_sibling_mask)); | ||
758 | #endif | 730 | #endif |
759 | 731 | ||
760 | DEFINE(PPC_DBELL_SERVER, PPC_DBELL_SERVER); | 732 | DEFINE(PPC_DBELL_SERVER, PPC_DBELL_SERVER); |
diff --git a/arch/powerpc/kernel/cpu_setup_power.S b/arch/powerpc/kernel/cpu_setup_power.S index 917188615bf5..7fe8c79e6937 100644 --- a/arch/powerpc/kernel/cpu_setup_power.S +++ b/arch/powerpc/kernel/cpu_setup_power.S | |||
@@ -101,6 +101,8 @@ _GLOBAL(__setup_cpu_power9) | |||
101 | mfspr r3,SPRN_LPCR | 101 | mfspr r3,SPRN_LPCR |
102 | LOAD_REG_IMMEDIATE(r4, LPCR_PECEDH | LPCR_PECE_HVEE | LPCR_HVICE) | 102 | LOAD_REG_IMMEDIATE(r4, LPCR_PECEDH | LPCR_PECE_HVEE | LPCR_HVICE) |
103 | or r3, r3, r4 | 103 | or r3, r3, r4 |
104 | LOAD_REG_IMMEDIATE(r4, LPCR_UPRT | LPCR_HR) | ||
105 | andc r3, r3, r4 | ||
104 | bl __init_LPCR | 106 | bl __init_LPCR |
105 | bl __init_HFSCR | 107 | bl __init_HFSCR |
106 | bl __init_tlb_power9 | 108 | bl __init_tlb_power9 |
@@ -122,6 +124,8 @@ _GLOBAL(__restore_cpu_power9) | |||
122 | mfspr r3,SPRN_LPCR | 124 | mfspr r3,SPRN_LPCR |
123 | LOAD_REG_IMMEDIATE(r4, LPCR_PECEDH | LPCR_PECE_HVEE | LPCR_HVICE) | 125 | LOAD_REG_IMMEDIATE(r4, LPCR_PECEDH | LPCR_PECE_HVEE | LPCR_HVICE) |
124 | or r3, r3, r4 | 126 | or r3, r3, r4 |
127 | LOAD_REG_IMMEDIATE(r4, LPCR_UPRT | LPCR_HR) | ||
128 | andc r3, r3, r4 | ||
125 | bl __init_LPCR | 129 | bl __init_LPCR |
126 | bl __init_HFSCR | 130 | bl __init_HFSCR |
127 | bl __init_tlb_power9 | 131 | bl __init_tlb_power9 |
diff --git a/arch/powerpc/kernel/cputable.c b/arch/powerpc/kernel/cputable.c index 6a82ef039c50..bb7a1890aeb7 100644 --- a/arch/powerpc/kernel/cputable.c +++ b/arch/powerpc/kernel/cputable.c | |||
@@ -386,6 +386,23 @@ static struct cpu_spec __initdata cpu_specs[] = { | |||
386 | .machine_check_early = __machine_check_early_realmode_p8, | 386 | .machine_check_early = __machine_check_early_realmode_p8, |
387 | .platform = "power8", | 387 | .platform = "power8", |
388 | }, | 388 | }, |
389 | { /* 3.00-compliant processor, i.e. Power9 "architected" mode */ | ||
390 | .pvr_mask = 0xffffffff, | ||
391 | .pvr_value = 0x0f000005, | ||
392 | .cpu_name = "POWER9 (architected)", | ||
393 | .cpu_features = CPU_FTRS_POWER9, | ||
394 | .cpu_user_features = COMMON_USER_POWER9, | ||
395 | .cpu_user_features2 = COMMON_USER2_POWER9, | ||
396 | .mmu_features = MMU_FTRS_POWER9, | ||
397 | .icache_bsize = 128, | ||
398 | .dcache_bsize = 128, | ||
399 | .oprofile_type = PPC_OPROFILE_INVALID, | ||
400 | .oprofile_cpu_type = "ppc64/ibm-compat-v1", | ||
401 | .cpu_setup = __setup_cpu_power9, | ||
402 | .cpu_restore = __restore_cpu_power9, | ||
403 | .flush_tlb = __flush_tlb_power9, | ||
404 | .platform = "power9", | ||
405 | }, | ||
389 | { /* Power7 */ | 406 | { /* Power7 */ |
390 | .pvr_mask = 0xffff0000, | 407 | .pvr_mask = 0xffff0000, |
391 | .pvr_value = 0x003f0000, | 408 | .pvr_value = 0x003f0000, |
diff --git a/arch/powerpc/kernel/entry_32.S b/arch/powerpc/kernel/entry_32.S index 3841d749a430..a38600949f3a 100644 --- a/arch/powerpc/kernel/entry_32.S +++ b/arch/powerpc/kernel/entry_32.S | |||
@@ -205,6 +205,9 @@ transfer_to_handler_cont: | |||
205 | mflr r9 | 205 | mflr r9 |
206 | lwz r11,0(r9) /* virtual address of handler */ | 206 | lwz r11,0(r9) /* virtual address of handler */ |
207 | lwz r9,4(r9) /* where to go when done */ | 207 | lwz r9,4(r9) /* where to go when done */ |
208 | #ifdef CONFIG_PPC_8xx_PERF_EVENT | ||
209 | mtspr SPRN_NRI, r0 | ||
210 | #endif | ||
208 | #ifdef CONFIG_TRACE_IRQFLAGS | 211 | #ifdef CONFIG_TRACE_IRQFLAGS |
209 | lis r12,reenable_mmu@h | 212 | lis r12,reenable_mmu@h |
210 | ori r12,r12,reenable_mmu@l | 213 | ori r12,r12,reenable_mmu@l |
@@ -292,7 +295,9 @@ stack_ovf: | |||
292 | lis r9,StackOverflow@ha | 295 | lis r9,StackOverflow@ha |
293 | addi r9,r9,StackOverflow@l | 296 | addi r9,r9,StackOverflow@l |
294 | LOAD_MSR_KERNEL(r10,MSR_KERNEL) | 297 | LOAD_MSR_KERNEL(r10,MSR_KERNEL) |
295 | FIX_SRR1(r10,r12) | 298 | #ifdef CONFIG_PPC_8xx_PERF_EVENT |
299 | mtspr SPRN_NRI, r0 | ||
300 | #endif | ||
296 | mtspr SPRN_SRR0,r9 | 301 | mtspr SPRN_SRR0,r9 |
297 | mtspr SPRN_SRR1,r10 | 302 | mtspr SPRN_SRR1,r10 |
298 | SYNC | 303 | SYNC |
@@ -417,9 +422,11 @@ END_FTR_SECTION_IFSET(CPU_FTR_NEED_PAIRED_STWCX) | |||
417 | mtlr r4 | 422 | mtlr r4 |
418 | mtcr r5 | 423 | mtcr r5 |
419 | lwz r7,_NIP(r1) | 424 | lwz r7,_NIP(r1) |
420 | FIX_SRR1(r8, r0) | ||
421 | lwz r2,GPR2(r1) | 425 | lwz r2,GPR2(r1) |
422 | lwz r1,GPR1(r1) | 426 | lwz r1,GPR1(r1) |
427 | #ifdef CONFIG_PPC_8xx_PERF_EVENT | ||
428 | mtspr SPRN_NRI, r0 | ||
429 | #endif | ||
423 | mtspr SPRN_SRR0,r7 | 430 | mtspr SPRN_SRR0,r7 |
424 | mtspr SPRN_SRR1,r8 | 431 | mtspr SPRN_SRR1,r8 |
425 | SYNC | 432 | SYNC |
@@ -699,6 +706,9 @@ fast_exception_return: | |||
699 | lwz r10,_LINK(r11) | 706 | lwz r10,_LINK(r11) |
700 | mtlr r10 | 707 | mtlr r10 |
701 | REST_GPR(10, r11) | 708 | REST_GPR(10, r11) |
709 | #ifdef CONFIG_PPC_8xx_PERF_EVENT | ||
710 | mtspr SPRN_NRI, r0 | ||
711 | #endif | ||
702 | mtspr SPRN_SRR1,r9 | 712 | mtspr SPRN_SRR1,r9 |
703 | mtspr SPRN_SRR0,r12 | 713 | mtspr SPRN_SRR0,r12 |
704 | REST_GPR(9, r11) | 714 | REST_GPR(9, r11) |
@@ -947,7 +957,9 @@ END_FTR_SECTION_IFSET(CPU_FTR_NEED_PAIRED_STWCX) | |||
947 | .globl exc_exit_restart | 957 | .globl exc_exit_restart |
948 | exc_exit_restart: | 958 | exc_exit_restart: |
949 | lwz r12,_NIP(r1) | 959 | lwz r12,_NIP(r1) |
950 | FIX_SRR1(r9,r10) | 960 | #ifdef CONFIG_PPC_8xx_PERF_EVENT |
961 | mtspr SPRN_NRI, r0 | ||
962 | #endif | ||
951 | mtspr SPRN_SRR0,r12 | 963 | mtspr SPRN_SRR0,r12 |
952 | mtspr SPRN_SRR1,r9 | 964 | mtspr SPRN_SRR1,r9 |
953 | REST_4GPRS(9, r1) | 965 | REST_4GPRS(9, r1) |
@@ -1290,7 +1302,6 @@ _GLOBAL(enter_rtas) | |||
1290 | 1: tophys(r9,r1) | 1302 | 1: tophys(r9,r1) |
1291 | lwz r8,INT_FRAME_SIZE+4(r9) /* get return address */ | 1303 | lwz r8,INT_FRAME_SIZE+4(r9) /* get return address */ |
1292 | lwz r9,8(r9) /* original msr value */ | 1304 | lwz r9,8(r9) /* original msr value */ |
1293 | FIX_SRR1(r9,r0) | ||
1294 | addi r1,r1,INT_FRAME_SIZE | 1305 | addi r1,r1,INT_FRAME_SIZE |
1295 | li r0,0 | 1306 | li r0,0 |
1296 | mtspr SPRN_SPRG_RTAS,r0 | 1307 | mtspr SPRN_SPRG_RTAS,r0 |
diff --git a/arch/powerpc/kernel/head_32.S b/arch/powerpc/kernel/head_32.S index 9d963547d243..1607be7c0ef2 100644 --- a/arch/powerpc/kernel/head_32.S +++ b/arch/powerpc/kernel/head_32.S | |||
@@ -869,7 +869,6 @@ __secondary_start: | |||
869 | 869 | ||
870 | /* enable MMU and jump to start_secondary */ | 870 | /* enable MMU and jump to start_secondary */ |
871 | li r4,MSR_KERNEL | 871 | li r4,MSR_KERNEL |
872 | FIX_SRR1(r4,r5) | ||
873 | lis r3,start_secondary@h | 872 | lis r3,start_secondary@h |
874 | ori r3,r3,start_secondary@l | 873 | ori r3,r3,start_secondary@l |
875 | mtspr SPRN_SRR0,r3 | 874 | mtspr SPRN_SRR0,r3 |
@@ -977,7 +976,6 @@ start_here: | |||
977 | ori r4,r4,2f@l | 976 | ori r4,r4,2f@l |
978 | tophys(r4,r4) | 977 | tophys(r4,r4) |
979 | li r3,MSR_KERNEL & ~(MSR_IR|MSR_DR) | 978 | li r3,MSR_KERNEL & ~(MSR_IR|MSR_DR) |
980 | FIX_SRR1(r3,r5) | ||
981 | mtspr SPRN_SRR0,r4 | 979 | mtspr SPRN_SRR0,r4 |
982 | mtspr SPRN_SRR1,r3 | 980 | mtspr SPRN_SRR1,r3 |
983 | SYNC | 981 | SYNC |
@@ -1001,7 +999,6 @@ start_here: | |||
1001 | 999 | ||
1002 | /* Now turn on the MMU for real! */ | 1000 | /* Now turn on the MMU for real! */ |
1003 | li r4,MSR_KERNEL | 1001 | li r4,MSR_KERNEL |
1004 | FIX_SRR1(r4,r5) | ||
1005 | lis r3,start_kernel@h | 1002 | lis r3,start_kernel@h |
1006 | ori r3,r3,start_kernel@l | 1003 | ori r3,r3,start_kernel@l |
1007 | mtspr SPRN_SRR0,r3 | 1004 | mtspr SPRN_SRR0,r3 |
diff --git a/arch/powerpc/kernel/head_8xx.S b/arch/powerpc/kernel/head_8xx.S index 1a9c99d3e5d8..c032fe8c2d26 100644 --- a/arch/powerpc/kernel/head_8xx.S +++ b/arch/powerpc/kernel/head_8xx.S | |||
@@ -329,6 +329,12 @@ InstructionTLBMiss: | |||
329 | mtspr SPRN_SPRG_SCRATCH2, r3 | 329 | mtspr SPRN_SPRG_SCRATCH2, r3 |
330 | #endif | 330 | #endif |
331 | EXCEPTION_PROLOG_0 | 331 | EXCEPTION_PROLOG_0 |
332 | #ifdef CONFIG_PPC_8xx_PERF_EVENT | ||
333 | lis r10, (itlb_miss_counter - PAGE_OFFSET)@ha | ||
334 | lwz r11, (itlb_miss_counter - PAGE_OFFSET)@l(r10) | ||
335 | addi r11, r11, 1 | ||
336 | stw r11, (itlb_miss_counter - PAGE_OFFSET)@l(r10) | ||
337 | #endif | ||
332 | 338 | ||
333 | /* If we are faulting a kernel address, we have to use the | 339 | /* If we are faulting a kernel address, we have to use the |
334 | * kernel page tables. | 340 | * kernel page tables. |
@@ -429,6 +435,12 @@ InstructionTLBMiss: | |||
429 | DataStoreTLBMiss: | 435 | DataStoreTLBMiss: |
430 | mtspr SPRN_SPRG_SCRATCH2, r3 | 436 | mtspr SPRN_SPRG_SCRATCH2, r3 |
431 | EXCEPTION_PROLOG_0 | 437 | EXCEPTION_PROLOG_0 |
438 | #ifdef CONFIG_PPC_8xx_PERF_EVENT | ||
439 | lis r10, (dtlb_miss_counter - PAGE_OFFSET)@ha | ||
440 | lwz r11, (dtlb_miss_counter - PAGE_OFFSET)@l(r10) | ||
441 | addi r11, r11, 1 | ||
442 | stw r11, (dtlb_miss_counter - PAGE_OFFSET)@l(r10) | ||
443 | #endif | ||
432 | mfcr r3 | 444 | mfcr r3 |
433 | 445 | ||
434 | /* If we are faulting a kernel address, we have to use the | 446 | /* If we are faulting a kernel address, we have to use the |
@@ -561,6 +573,7 @@ InstructionTLBError: | |||
561 | andis. r10,r5,0x4000 | 573 | andis. r10,r5,0x4000 |
562 | beq+ 1f | 574 | beq+ 1f |
563 | tlbie r4 | 575 | tlbie r4 |
576 | itlbie: | ||
564 | /* 0x400 is InstructionAccess exception, needed by bad_page_fault() */ | 577 | /* 0x400 is InstructionAccess exception, needed by bad_page_fault() */ |
565 | 1: EXC_XFER_LITE(0x400, handle_page_fault) | 578 | 1: EXC_XFER_LITE(0x400, handle_page_fault) |
566 | 579 | ||
@@ -585,6 +598,7 @@ DARFixed:/* Return from dcbx instruction bug workaround */ | |||
585 | andis. r10,r5,0x4000 | 598 | andis. r10,r5,0x4000 |
586 | beq+ 1f | 599 | beq+ 1f |
587 | tlbie r4 | 600 | tlbie r4 |
601 | dtlbie: | ||
588 | 1: li r10,RPN_PATTERN | 602 | 1: li r10,RPN_PATTERN |
589 | mtspr SPRN_DAR,r10 /* Tag DAR, to be used in DTLB Error */ | 603 | mtspr SPRN_DAR,r10 /* Tag DAR, to be used in DTLB Error */ |
590 | /* 0x300 is DataAccess exception, needed by bad_page_fault() */ | 604 | /* 0x300 is DataAccess exception, needed by bad_page_fault() */ |
@@ -602,8 +616,43 @@ DARFixed:/* Return from dcbx instruction bug workaround */ | |||
602 | * support of breakpoints and such. Someday I will get around to | 616 | * support of breakpoints and such. Someday I will get around to |
603 | * using them. | 617 | * using them. |
604 | */ | 618 | */ |
605 | EXCEPTION(0x1c00, Trap_1c, unknown_exception, EXC_XFER_EE) | 619 | . = 0x1c00 |
620 | DataBreakpoint: | ||
621 | EXCEPTION_PROLOG_0 | ||
622 | mfcr r10 | ||
623 | mfspr r11, SPRN_SRR0 | ||
624 | cmplwi cr0, r11, (dtlbie - PAGE_OFFSET)@l | ||
625 | cmplwi cr7, r11, (itlbie - PAGE_OFFSET)@l | ||
626 | beq- cr0, 11f | ||
627 | beq- cr7, 11f | ||
628 | EXCEPTION_PROLOG_1 | ||
629 | EXCEPTION_PROLOG_2 | ||
630 | addi r3,r1,STACK_FRAME_OVERHEAD | ||
631 | mfspr r4,SPRN_BAR | ||
632 | stw r4,_DAR(r11) | ||
633 | mfspr r5,SPRN_DSISR | ||
634 | EXC_XFER_EE(0x1c00, do_break) | ||
635 | 11: | ||
636 | mtcr r10 | ||
637 | EXCEPTION_EPILOG_0 | ||
638 | rfi | ||
639 | |||
640 | #ifdef CONFIG_PPC_8xx_PERF_EVENT | ||
641 | . = 0x1d00 | ||
642 | InstructionBreakpoint: | ||
643 | EXCEPTION_PROLOG_0 | ||
644 | lis r10, (instruction_counter - PAGE_OFFSET)@ha | ||
645 | lwz r11, (instruction_counter - PAGE_OFFSET)@l(r10) | ||
646 | addi r11, r11, -1 | ||
647 | stw r11, (instruction_counter - PAGE_OFFSET)@l(r10) | ||
648 | lis r10, 0xffff | ||
649 | ori r10, r10, 0x01 | ||
650 | mtspr SPRN_COUNTA, r10 | ||
651 | EXCEPTION_EPILOG_0 | ||
652 | rfi | ||
653 | #else | ||
606 | EXCEPTION(0x1d00, Trap_1d, unknown_exception, EXC_XFER_EE) | 654 | EXCEPTION(0x1d00, Trap_1d, unknown_exception, EXC_XFER_EE) |
655 | #endif | ||
607 | EXCEPTION(0x1e00, Trap_1e, unknown_exception, EXC_XFER_EE) | 656 | EXCEPTION(0x1e00, Trap_1e, unknown_exception, EXC_XFER_EE) |
608 | EXCEPTION(0x1f00, Trap_1f, unknown_exception, EXC_XFER_EE) | 657 | EXCEPTION(0x1f00, Trap_1f, unknown_exception, EXC_XFER_EE) |
609 | 658 | ||
@@ -977,6 +1026,14 @@ initial_mmu: | |||
977 | lis r8, IDC_ENABLE@h | 1026 | lis r8, IDC_ENABLE@h |
978 | mtspr SPRN_DC_CST, r8 | 1027 | mtspr SPRN_DC_CST, r8 |
979 | #endif | 1028 | #endif |
1029 | /* Disable debug mode entry on breakpoints */ | ||
1030 | mfspr r8, SPRN_DER | ||
1031 | #ifdef CONFIG_PPC_8xx_PERF_EVENT | ||
1032 | rlwinm r8, r8, 0, ~0xc | ||
1033 | #else | ||
1034 | rlwinm r8, r8, 0, ~0x8 | ||
1035 | #endif | ||
1036 | mtspr SPRN_DER, r8 | ||
980 | blr | 1037 | blr |
981 | 1038 | ||
982 | 1039 | ||
@@ -1010,3 +1067,16 @@ cpu6_errata_word: | |||
1010 | .space 16 | 1067 | .space 16 |
1011 | #endif | 1068 | #endif |
1012 | 1069 | ||
1070 | #ifdef CONFIG_PPC_8xx_PERF_EVENT | ||
1071 | .globl itlb_miss_counter | ||
1072 | itlb_miss_counter: | ||
1073 | .space 4 | ||
1074 | |||
1075 | .globl dtlb_miss_counter | ||
1076 | dtlb_miss_counter: | ||
1077 | .space 4 | ||
1078 | |||
1079 | .globl instruction_counter | ||
1080 | instruction_counter: | ||
1081 | .space 4 | ||
1082 | #endif | ||
diff --git a/arch/powerpc/kernel/hw_breakpoint.c b/arch/powerpc/kernel/hw_breakpoint.c index 53cc9270aac8..53b9c1dfd7d9 100644 --- a/arch/powerpc/kernel/hw_breakpoint.c +++ b/arch/powerpc/kernel/hw_breakpoint.c | |||
@@ -211,9 +211,11 @@ int hw_breakpoint_handler(struct die_args *args) | |||
211 | int rc = NOTIFY_STOP; | 211 | int rc = NOTIFY_STOP; |
212 | struct perf_event *bp; | 212 | struct perf_event *bp; |
213 | struct pt_regs *regs = args->regs; | 213 | struct pt_regs *regs = args->regs; |
214 | #ifndef CONFIG_PPC_8xx | ||
214 | int stepped = 1; | 215 | int stepped = 1; |
215 | struct arch_hw_breakpoint *info; | ||
216 | unsigned int instr; | 216 | unsigned int instr; |
217 | #endif | ||
218 | struct arch_hw_breakpoint *info; | ||
217 | unsigned long dar = regs->dar; | 219 | unsigned long dar = regs->dar; |
218 | 220 | ||
219 | /* Disable breakpoints during exception handling */ | 221 | /* Disable breakpoints during exception handling */ |
@@ -257,6 +259,7 @@ int hw_breakpoint_handler(struct die_args *args) | |||
257 | (dar - bp->attr.bp_addr < bp->attr.bp_len))) | 259 | (dar - bp->attr.bp_addr < bp->attr.bp_len))) |
258 | info->type |= HW_BRK_TYPE_EXTRANEOUS_IRQ; | 260 | info->type |= HW_BRK_TYPE_EXTRANEOUS_IRQ; |
259 | 261 | ||
262 | #ifndef CONFIG_PPC_8xx | ||
260 | /* Do not emulate user-space instructions, instead single-step them */ | 263 | /* Do not emulate user-space instructions, instead single-step them */ |
261 | if (user_mode(regs)) { | 264 | if (user_mode(regs)) { |
262 | current->thread.last_hit_ubp = bp; | 265 | current->thread.last_hit_ubp = bp; |
@@ -280,6 +283,7 @@ int hw_breakpoint_handler(struct die_args *args) | |||
280 | perf_event_disable_inatomic(bp); | 283 | perf_event_disable_inatomic(bp); |
281 | goto out; | 284 | goto out; |
282 | } | 285 | } |
286 | #endif | ||
283 | /* | 287 | /* |
284 | * As a policy, the callback is invoked in a 'trigger-after-execute' | 288 | * As a policy, the callback is invoked in a 'trigger-after-execute' |
285 | * fashion | 289 | * fashion |
diff --git a/arch/powerpc/kernel/optprobes_head.S b/arch/powerpc/kernel/optprobes_head.S index 53e429b5a29d..4937bef7652f 100644 --- a/arch/powerpc/kernel/optprobes_head.S +++ b/arch/powerpc/kernel/optprobes_head.S | |||
@@ -65,6 +65,13 @@ optprobe_template_entry: | |||
65 | mfdsisr r5 | 65 | mfdsisr r5 |
66 | std r5,_DSISR(r1) | 66 | std r5,_DSISR(r1) |
67 | 67 | ||
68 | /* | ||
69 | * We may get here from a module, so load the kernel TOC in r2. | ||
70 | * The original TOC gets restored when pt_regs is restored | ||
71 | * further below. | ||
72 | */ | ||
73 | ld r2,PACATOC(r13) | ||
74 | |||
68 | .global optprobe_template_op_address | 75 | .global optprobe_template_op_address |
69 | optprobe_template_op_address: | 76 | optprobe_template_op_address: |
70 | /* | 77 | /* |
diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c index 8e6fde8d28f3..ffda24a38dda 100644 --- a/arch/powerpc/kernel/pci-common.c +++ b/arch/powerpc/kernel/pci-common.c | |||
@@ -1560,16 +1560,10 @@ static void pcibios_setup_phb_resources(struct pci_controller *hose, | |||
1560 | /* Hookup PHB Memory resources */ | 1560 | /* Hookup PHB Memory resources */ |
1561 | for (i = 0; i < 3; ++i) { | 1561 | for (i = 0; i < 3; ++i) { |
1562 | res = &hose->mem_resources[i]; | 1562 | res = &hose->mem_resources[i]; |
1563 | if (!res->flags) { | 1563 | if (!res->flags) |
1564 | if (i == 0) | ||
1565 | printk(KERN_ERR "PCI: Memory resource 0 not set for " | ||
1566 | "host bridge %s (domain %d)\n", | ||
1567 | hose->dn->full_name, hose->global_number); | ||
1568 | continue; | 1564 | continue; |
1569 | } | ||
1570 | offset = hose->mem_offset[i]; | ||
1571 | |||
1572 | 1565 | ||
1566 | offset = hose->mem_offset[i]; | ||
1573 | pr_debug("PCI: PHB MEM resource %d = %pR off 0x%08llx\n", i, | 1567 | pr_debug("PCI: PHB MEM resource %d = %pR off 0x%08llx\n", i, |
1574 | res, (unsigned long long)offset); | 1568 | res, (unsigned long long)offset); |
1575 | 1569 | ||
diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c index 5dd056df0baa..4379a079b3c2 100644 --- a/arch/powerpc/kernel/process.c +++ b/arch/powerpc/kernel/process.c | |||
@@ -730,6 +730,28 @@ static inline int __set_dabr(unsigned long dabr, unsigned long dabrx) | |||
730 | mtspr(SPRN_DABRX, dabrx); | 730 | mtspr(SPRN_DABRX, dabrx); |
731 | return 0; | 731 | return 0; |
732 | } | 732 | } |
733 | #elif defined(CONFIG_PPC_8xx) | ||
734 | static inline int __set_dabr(unsigned long dabr, unsigned long dabrx) | ||
735 | { | ||
736 | unsigned long addr = dabr & ~HW_BRK_TYPE_DABR; | ||
737 | unsigned long lctrl1 = 0x90000000; /* compare type: equal on E & F */ | ||
738 | unsigned long lctrl2 = 0x8e000002; /* watchpoint 1 on cmp E | F */ | ||
739 | |||
740 | if ((dabr & HW_BRK_TYPE_RDWR) == HW_BRK_TYPE_READ) | ||
741 | lctrl1 |= 0xa0000; | ||
742 | else if ((dabr & HW_BRK_TYPE_RDWR) == HW_BRK_TYPE_WRITE) | ||
743 | lctrl1 |= 0xf0000; | ||
744 | else if ((dabr & HW_BRK_TYPE_RDWR) == 0) | ||
745 | lctrl2 = 0; | ||
746 | |||
747 | mtspr(SPRN_LCTRL2, 0); | ||
748 | mtspr(SPRN_CMPE, addr); | ||
749 | mtspr(SPRN_CMPF, addr + 4); | ||
750 | mtspr(SPRN_LCTRL1, lctrl1); | ||
751 | mtspr(SPRN_LCTRL2, lctrl2); | ||
752 | |||
753 | return 0; | ||
754 | } | ||
733 | #else | 755 | #else |
734 | static inline int __set_dabr(unsigned long dabr, unsigned long dabrx) | 756 | static inline int __set_dabr(unsigned long dabr, unsigned long dabrx) |
735 | { | 757 | { |
diff --git a/arch/powerpc/kernel/prom_init.c b/arch/powerpc/kernel/prom_init.c index 616de028f7f8..a3944540fe0d 100644 --- a/arch/powerpc/kernel/prom_init.c +++ b/arch/powerpc/kernel/prom_init.c | |||
@@ -839,7 +839,7 @@ struct ibm_arch_vec __cacheline_aligned ibm_architecture_vec = { | |||
839 | 0, | 839 | 0, |
840 | #endif | 840 | #endif |
841 | .associativity = OV5_FEAT(OV5_TYPE1_AFFINITY) | OV5_FEAT(OV5_PRRN), | 841 | .associativity = OV5_FEAT(OV5_TYPE1_AFFINITY) | OV5_FEAT(OV5_PRRN), |
842 | .bin_opts = OV5_FEAT(OV5_RESIZE_HPT), | 842 | .bin_opts = OV5_FEAT(OV5_RESIZE_HPT) | OV5_FEAT(OV5_HP_EVT), |
843 | .micro_checkpoint = 0, | 843 | .micro_checkpoint = 0, |
844 | .reserved0 = 0, | 844 | .reserved0 = 0, |
845 | .max_cpus = cpu_to_be32(NR_CPUS), /* number of cores supported */ | 845 | .max_cpus = cpu_to_be32(NR_CPUS), /* number of cores supported */ |
diff --git a/arch/powerpc/kernel/setup_64.c b/arch/powerpc/kernel/setup_64.c index b9855f1b290a..adf2084f214b 100644 --- a/arch/powerpc/kernel/setup_64.c +++ b/arch/powerpc/kernel/setup_64.c | |||
@@ -113,14 +113,12 @@ void __init setup_tlb_core_data(void) | |||
113 | * If we have threads, we need either tlbsrx. | 113 | * If we have threads, we need either tlbsrx. |
114 | * or e6500 tablewalk mode, or else TLB handlers | 114 | * or e6500 tablewalk mode, or else TLB handlers |
115 | * will be racy and could produce duplicate entries. | 115 | * will be racy and could produce duplicate entries. |
116 | * Should we panic instead? | ||
116 | */ | 117 | */ |
117 | if (smt_enabled_at_boot >= 2 && | 118 | WARN_ONCE(smt_enabled_at_boot >= 2 && |
118 | !mmu_has_feature(MMU_FTR_USE_TLBRSRV) && | 119 | !mmu_has_feature(MMU_FTR_USE_TLBRSRV) && |
119 | book3e_htw_mode != PPC_HTW_E6500) { | 120 | book3e_htw_mode != PPC_HTW_E6500, |
120 | /* Should we panic instead? */ | 121 | "%s: unsupported MMU configuration\n", __func__); |
121 | WARN_ONCE("%s: unsupported MMU configuration -- expect problems\n", | ||
122 | __func__); | ||
123 | } | ||
124 | } | 122 | } |
125 | } | 123 | } |
126 | #endif | 124 | #endif |
diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c index 14e485525e31..bc84a8d47b9e 100644 --- a/arch/powerpc/kernel/time.c +++ b/arch/powerpc/kernel/time.c | |||
@@ -709,7 +709,7 @@ unsigned long long running_clock(void) | |||
709 | * time and on a host which doesn't do any virtualisation TB *should* equal | 709 | * time and on a host which doesn't do any virtualisation TB *should* equal |
710 | * VTB so it makes no difference anyway. | 710 | * VTB so it makes no difference anyway. |
711 | */ | 711 | */ |
712 | return local_clock() - cputime_to_nsecs(kcpustat_this_cpu->cpustat[CPUTIME_STEAL]); | 712 | return local_clock() - kcpustat_this_cpu->cpustat[CPUTIME_STEAL]; |
713 | } | 713 | } |
714 | #endif | 714 | #endif |
715 | 715 | ||
diff --git a/arch/powerpc/mm/pgtable.c b/arch/powerpc/mm/pgtable.c index cb39c8bd2436..a03ff3d99e0c 100644 --- a/arch/powerpc/mm/pgtable.c +++ b/arch/powerpc/mm/pgtable.c | |||
@@ -193,9 +193,7 @@ void set_pte_at(struct mm_struct *mm, unsigned long addr, pte_t *ptep, | |||
193 | */ | 193 | */ |
194 | VM_WARN_ON(pte_present(*ptep) && !pte_protnone(*ptep)); | 194 | VM_WARN_ON(pte_present(*ptep) && !pte_protnone(*ptep)); |
195 | 195 | ||
196 | /* | 196 | /* Add the pte bit when trying to set a pte */ |
197 | * Add the pte bit when tryint set a pte | ||
198 | */ | ||
199 | pte = __pte(pte_val(pte) | _PAGE_PTE); | 197 | pte = __pte(pte_val(pte) | _PAGE_PTE); |
200 | 198 | ||
201 | /* Note: mm->context.id might not yet have been assigned as | 199 | /* Note: mm->context.id might not yet have been assigned as |
diff --git a/arch/powerpc/mm/slb_low.S b/arch/powerpc/mm/slb_low.S index e2974fcd20f1..a85e06ea6c20 100644 --- a/arch/powerpc/mm/slb_low.S +++ b/arch/powerpc/mm/slb_low.S | |||
@@ -71,9 +71,9 @@ slb_miss_kernel_load_linear: | |||
71 | 71 | ||
72 | 72 | ||
73 | BEGIN_FTR_SECTION | 73 | BEGIN_FTR_SECTION |
74 | b slb_finish_load | 74 | b .Lslb_finish_load |
75 | END_MMU_FTR_SECTION_IFCLR(MMU_FTR_1T_SEGMENT) | 75 | END_MMU_FTR_SECTION_IFCLR(MMU_FTR_1T_SEGMENT) |
76 | b slb_finish_load_1T | 76 | b .Lslb_finish_load_1T |
77 | 77 | ||
78 | 1: | 78 | 1: |
79 | #ifdef CONFIG_SPARSEMEM_VMEMMAP | 79 | #ifdef CONFIG_SPARSEMEM_VMEMMAP |
@@ -109,9 +109,9 @@ slb_miss_kernel_load_io: | |||
109 | addi r9,r9,(MAX_USER_CONTEXT - 0xc + 1)@l | 109 | addi r9,r9,(MAX_USER_CONTEXT - 0xc + 1)@l |
110 | 110 | ||
111 | BEGIN_FTR_SECTION | 111 | BEGIN_FTR_SECTION |
112 | b slb_finish_load | 112 | b .Lslb_finish_load |
113 | END_MMU_FTR_SECTION_IFCLR(MMU_FTR_1T_SEGMENT) | 113 | END_MMU_FTR_SECTION_IFCLR(MMU_FTR_1T_SEGMENT) |
114 | b slb_finish_load_1T | 114 | b .Lslb_finish_load_1T |
115 | 115 | ||
116 | 0: /* | 116 | 0: /* |
117 | * For userspace addresses, make sure this is region 0. | 117 | * For userspace addresses, make sure this is region 0. |
@@ -174,9 +174,9 @@ END_MMU_FTR_SECTION_IFCLR(MMU_FTR_1T_SEGMENT) | |||
174 | ld r9,PACACONTEXTID(r13) | 174 | ld r9,PACACONTEXTID(r13) |
175 | BEGIN_FTR_SECTION | 175 | BEGIN_FTR_SECTION |
176 | cmpldi r10,0x1000 | 176 | cmpldi r10,0x1000 |
177 | bge slb_finish_load_1T | 177 | bge .Lslb_finish_load_1T |
178 | END_MMU_FTR_SECTION_IFSET(MMU_FTR_1T_SEGMENT) | 178 | END_MMU_FTR_SECTION_IFSET(MMU_FTR_1T_SEGMENT) |
179 | b slb_finish_load | 179 | b .Lslb_finish_load |
180 | 180 | ||
181 | 8: /* invalid EA - return an error indication */ | 181 | 8: /* invalid EA - return an error indication */ |
182 | crset 4*cr0+eq /* indicate failure */ | 182 | crset 4*cr0+eq /* indicate failure */ |
@@ -187,7 +187,7 @@ END_MMU_FTR_SECTION_IFSET(MMU_FTR_1T_SEGMENT) | |||
187 | * | 187 | * |
188 | * r3 = EA, r9 = context, r10 = ESID, r11 = flags, clobbers r9, cr7 = <> PAGE_OFFSET | 188 | * r3 = EA, r9 = context, r10 = ESID, r11 = flags, clobbers r9, cr7 = <> PAGE_OFFSET |
189 | */ | 189 | */ |
190 | slb_finish_load: | 190 | .Lslb_finish_load: |
191 | rldimi r10,r9,ESID_BITS,0 | 191 | rldimi r10,r9,ESID_BITS,0 |
192 | ASM_VSID_SCRAMBLE(r10,r9,256M) | 192 | ASM_VSID_SCRAMBLE(r10,r9,256M) |
193 | /* | 193 | /* |
@@ -256,7 +256,7 @@ slb_compare_rr_to_size: | |||
256 | * | 256 | * |
257 | * r3 = EA, r9 = context, r10 = ESID(256MB), r11 = flags, clobbers r9 | 257 | * r3 = EA, r9 = context, r10 = ESID(256MB), r11 = flags, clobbers r9 |
258 | */ | 258 | */ |
259 | slb_finish_load_1T: | 259 | .Lslb_finish_load_1T: |
260 | srdi r10,r10,(SID_SHIFT_1T - SID_SHIFT) /* get 1T ESID */ | 260 | srdi r10,r10,(SID_SHIFT_1T - SID_SHIFT) /* get 1T ESID */ |
261 | rldimi r10,r9,ESID_BITS_1T,0 | 261 | rldimi r10,r9,ESID_BITS_1T,0 |
262 | ASM_VSID_SCRAMBLE(r10,r9,1T) | 262 | ASM_VSID_SCRAMBLE(r10,r9,1T) |
@@ -272,3 +272,11 @@ slb_finish_load_1T: | |||
272 | clrrdi r3,r3,SID_SHIFT_1T /* clear out non-ESID bits */ | 272 | clrrdi r3,r3,SID_SHIFT_1T /* clear out non-ESID bits */ |
273 | b 7b | 273 | b 7b |
274 | 274 | ||
275 | |||
276 | _ASM_NOKPROBE_SYMBOL(slb_allocate_realmode) | ||
277 | _ASM_NOKPROBE_SYMBOL(slb_miss_kernel_load_linear) | ||
278 | _ASM_NOKPROBE_SYMBOL(slb_miss_kernel_load_io) | ||
279 | _ASM_NOKPROBE_SYMBOL(slb_compare_rr_to_size) | ||
280 | #ifdef CONFIG_SPARSEMEM_VMEMMAP | ||
281 | _ASM_NOKPROBE_SYMBOL(slb_miss_kernel_load_vmemmap) | ||
282 | #endif | ||
diff --git a/arch/powerpc/perf/8xx-pmu.c b/arch/powerpc/perf/8xx-pmu.c new file mode 100644 index 000000000000..3c39f05f0af3 --- /dev/null +++ b/arch/powerpc/perf/8xx-pmu.c | |||
@@ -0,0 +1,173 @@ | |||
1 | /* | ||
2 | * Performance event support - PPC 8xx | ||
3 | * | ||
4 | * Copyright 2016 Christophe Leroy, CS Systemes d'Information | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License | ||
8 | * as published by the Free Software Foundation; either version | ||
9 | * 2 of the License, or (at your option) any later version. | ||
10 | */ | ||
11 | |||
12 | #include <linux/kernel.h> | ||
13 | #include <linux/sched.h> | ||
14 | #include <linux/perf_event.h> | ||
15 | #include <linux/percpu.h> | ||
16 | #include <linux/hardirq.h> | ||
17 | #include <asm/pmc.h> | ||
18 | #include <asm/machdep.h> | ||
19 | #include <asm/firmware.h> | ||
20 | #include <asm/ptrace.h> | ||
21 | |||
22 | #define PERF_8xx_ID_CPU_CYCLES 1 | ||
23 | #define PERF_8xx_ID_HW_INSTRUCTIONS 2 | ||
24 | #define PERF_8xx_ID_ITLB_LOAD_MISS 3 | ||
25 | #define PERF_8xx_ID_DTLB_LOAD_MISS 4 | ||
26 | |||
27 | #define C(x) PERF_COUNT_HW_CACHE_##x | ||
28 | #define DTLB_LOAD_MISS (C(DTLB) | (C(OP_READ) << 8) | (C(RESULT_MISS) << 16)) | ||
29 | #define ITLB_LOAD_MISS (C(ITLB) | (C(OP_READ) << 8) | (C(RESULT_MISS) << 16)) | ||
30 | |||
31 | extern unsigned long itlb_miss_counter, dtlb_miss_counter; | ||
32 | extern atomic_t instruction_counter; | ||
33 | |||
34 | static atomic_t insn_ctr_ref; | ||
35 | |||
36 | static s64 get_insn_ctr(void) | ||
37 | { | ||
38 | int ctr; | ||
39 | unsigned long counta; | ||
40 | |||
41 | do { | ||
42 | ctr = atomic_read(&instruction_counter); | ||
43 | counta = mfspr(SPRN_COUNTA); | ||
44 | } while (ctr != atomic_read(&instruction_counter)); | ||
45 | |||
46 | return ((s64)ctr << 16) | (counta >> 16); | ||
47 | } | ||
48 | |||
49 | static int event_type(struct perf_event *event) | ||
50 | { | ||
51 | switch (event->attr.type) { | ||
52 | case PERF_TYPE_HARDWARE: | ||
53 | if (event->attr.config == PERF_COUNT_HW_CPU_CYCLES) | ||
54 | return PERF_8xx_ID_CPU_CYCLES; | ||
55 | if (event->attr.config == PERF_COUNT_HW_INSTRUCTIONS) | ||
56 | return PERF_8xx_ID_HW_INSTRUCTIONS; | ||
57 | break; | ||
58 | case PERF_TYPE_HW_CACHE: | ||
59 | if (event->attr.config == ITLB_LOAD_MISS) | ||
60 | return PERF_8xx_ID_ITLB_LOAD_MISS; | ||
61 | if (event->attr.config == DTLB_LOAD_MISS) | ||
62 | return PERF_8xx_ID_DTLB_LOAD_MISS; | ||
63 | break; | ||
64 | case PERF_TYPE_RAW: | ||
65 | break; | ||
66 | default: | ||
67 | return -ENOENT; | ||
68 | } | ||
69 | return -EOPNOTSUPP; | ||
70 | } | ||
71 | |||
72 | static int mpc8xx_pmu_event_init(struct perf_event *event) | ||
73 | { | ||
74 | int type = event_type(event); | ||
75 | |||
76 | if (type < 0) | ||
77 | return type; | ||
78 | return 0; | ||
79 | } | ||
80 | |||
81 | static int mpc8xx_pmu_add(struct perf_event *event, int flags) | ||
82 | { | ||
83 | int type = event_type(event); | ||
84 | s64 val = 0; | ||
85 | |||
86 | if (type < 0) | ||
87 | return type; | ||
88 | |||
89 | switch (type) { | ||
90 | case PERF_8xx_ID_CPU_CYCLES: | ||
91 | val = get_tb(); | ||
92 | break; | ||
93 | case PERF_8xx_ID_HW_INSTRUCTIONS: | ||
94 | if (atomic_inc_return(&insn_ctr_ref) == 1) | ||
95 | mtspr(SPRN_ICTRL, 0xc0080007); | ||
96 | val = get_insn_ctr(); | ||
97 | break; | ||
98 | case PERF_8xx_ID_ITLB_LOAD_MISS: | ||
99 | val = itlb_miss_counter; | ||
100 | break; | ||
101 | case PERF_8xx_ID_DTLB_LOAD_MISS: | ||
102 | val = dtlb_miss_counter; | ||
103 | break; | ||
104 | } | ||
105 | local64_set(&event->hw.prev_count, val); | ||
106 | return 0; | ||
107 | } | ||
108 | |||
109 | static void mpc8xx_pmu_read(struct perf_event *event) | ||
110 | { | ||
111 | int type = event_type(event); | ||
112 | s64 prev, val = 0, delta = 0; | ||
113 | |||
114 | if (type < 0) | ||
115 | return; | ||
116 | |||
117 | do { | ||
118 | prev = local64_read(&event->hw.prev_count); | ||
119 | switch (type) { | ||
120 | case PERF_8xx_ID_CPU_CYCLES: | ||
121 | val = get_tb(); | ||
122 | delta = 16 * (val - prev); | ||
123 | break; | ||
124 | case PERF_8xx_ID_HW_INSTRUCTIONS: | ||
125 | val = get_insn_ctr(); | ||
126 | delta = prev - val; | ||
127 | if (delta < 0) | ||
128 | delta += 0x1000000000000LL; | ||
129 | break; | ||
130 | case PERF_8xx_ID_ITLB_LOAD_MISS: | ||
131 | val = itlb_miss_counter; | ||
132 | delta = (s64)((s32)val - (s32)prev); | ||
133 | break; | ||
134 | case PERF_8xx_ID_DTLB_LOAD_MISS: | ||
135 | val = dtlb_miss_counter; | ||
136 | delta = (s64)((s32)val - (s32)prev); | ||
137 | break; | ||
138 | } | ||
139 | } while (local64_cmpxchg(&event->hw.prev_count, prev, val) != prev); | ||
140 | |||
141 | local64_add(delta, &event->count); | ||
142 | } | ||
143 | |||
144 | static void mpc8xx_pmu_del(struct perf_event *event, int flags) | ||
145 | { | ||
146 | mpc8xx_pmu_read(event); | ||
147 | if (event_type(event) != PERF_8xx_ID_HW_INSTRUCTIONS) | ||
148 | return; | ||
149 | |||
150 | /* If it was the last user, stop counting to avoid useles overhead */ | ||
151 | if (atomic_dec_return(&insn_ctr_ref) == 0) | ||
152 | mtspr(SPRN_ICTRL, 7); | ||
153 | } | ||
154 | |||
155 | static struct pmu mpc8xx_pmu = { | ||
156 | .event_init = mpc8xx_pmu_event_init, | ||
157 | .add = mpc8xx_pmu_add, | ||
158 | .del = mpc8xx_pmu_del, | ||
159 | .read = mpc8xx_pmu_read, | ||
160 | .capabilities = PERF_PMU_CAP_NO_INTERRUPT | | ||
161 | PERF_PMU_CAP_NO_NMI, | ||
162 | }; | ||
163 | |||
164 | static int init_mpc8xx_pmu(void) | ||
165 | { | ||
166 | mtspr(SPRN_ICTRL, 7); | ||
167 | mtspr(SPRN_CMPA, 0); | ||
168 | mtspr(SPRN_COUNTA, 0xffff); | ||
169 | |||
170 | return perf_pmu_register(&mpc8xx_pmu, "cpu", PERF_TYPE_RAW); | ||
171 | } | ||
172 | |||
173 | early_initcall(init_mpc8xx_pmu); | ||
diff --git a/arch/powerpc/perf/Makefile b/arch/powerpc/perf/Makefile index f102d5370101..4d606b99a5cb 100644 --- a/arch/powerpc/perf/Makefile +++ b/arch/powerpc/perf/Makefile | |||
@@ -13,5 +13,7 @@ obj-$(CONFIG_FSL_EMB_PERF_EVENT_E500) += e500-pmu.o e6500-pmu.o | |||
13 | 13 | ||
14 | obj-$(CONFIG_HV_PERF_CTRS) += hv-24x7.o hv-gpci.o hv-common.o | 14 | obj-$(CONFIG_HV_PERF_CTRS) += hv-24x7.o hv-gpci.o hv-common.o |
15 | 15 | ||
16 | obj-$(CONFIG_PPC_8xx_PERF_EVENT) += 8xx-pmu.o | ||
17 | |||
16 | obj-$(CONFIG_PPC64) += $(obj64-y) | 18 | obj-$(CONFIG_PPC64) += $(obj64-y) |
17 | obj-$(CONFIG_PPC32) += $(obj32-y) | 19 | obj-$(CONFIG_PPC32) += $(obj32-y) |
diff --git a/arch/powerpc/perf/core-book3s.c b/arch/powerpc/perf/core-book3s.c index 270eb9b74e2e..595dd718ea87 100644 --- a/arch/powerpc/perf/core-book3s.c +++ b/arch/powerpc/perf/core-book3s.c | |||
@@ -57,6 +57,7 @@ struct cpu_hw_events { | |||
57 | void *bhrb_context; | 57 | void *bhrb_context; |
58 | struct perf_branch_stack bhrb_stack; | 58 | struct perf_branch_stack bhrb_stack; |
59 | struct perf_branch_entry bhrb_entries[BHRB_MAX_ENTRIES]; | 59 | struct perf_branch_entry bhrb_entries[BHRB_MAX_ENTRIES]; |
60 | u64 ic_init; | ||
60 | }; | 61 | }; |
61 | 62 | ||
62 | static DEFINE_PER_CPU(struct cpu_hw_events, cpu_hw_events); | 63 | static DEFINE_PER_CPU(struct cpu_hw_events, cpu_hw_events); |
@@ -127,6 +128,10 @@ static inline void power_pmu_bhrb_disable(struct perf_event *event) {} | |||
127 | static void power_pmu_sched_task(struct perf_event_context *ctx, bool sched_in) {} | 128 | static void power_pmu_sched_task(struct perf_event_context *ctx, bool sched_in) {} |
128 | static inline void power_pmu_bhrb_read(struct cpu_hw_events *cpuhw) {} | 129 | static inline void power_pmu_bhrb_read(struct cpu_hw_events *cpuhw) {} |
129 | static void pmao_restore_workaround(bool ebb) { } | 130 | static void pmao_restore_workaround(bool ebb) { } |
131 | static bool use_ic(u64 event) | ||
132 | { | ||
133 | return false; | ||
134 | } | ||
130 | #endif /* CONFIG_PPC32 */ | 135 | #endif /* CONFIG_PPC32 */ |
131 | 136 | ||
132 | static bool regs_use_siar(struct pt_regs *regs) | 137 | static bool regs_use_siar(struct pt_regs *regs) |
@@ -243,7 +248,7 @@ static inline u32 perf_get_misc_flags(struct pt_regs *regs) | |||
243 | */ | 248 | */ |
244 | if (ppmu->flags & PPMU_NO_SIPR) { | 249 | if (ppmu->flags & PPMU_NO_SIPR) { |
245 | unsigned long siar = mfspr(SPRN_SIAR); | 250 | unsigned long siar = mfspr(SPRN_SIAR); |
246 | if (siar >= PAGE_OFFSET) | 251 | if (is_kernel_addr(siar)) |
247 | return PERF_RECORD_MISC_KERNEL; | 252 | return PERF_RECORD_MISC_KERNEL; |
248 | return PERF_RECORD_MISC_USER; | 253 | return PERF_RECORD_MISC_USER; |
249 | } | 254 | } |
@@ -688,6 +693,15 @@ static void pmao_restore_workaround(bool ebb) | |||
688 | mtspr(SPRN_PMC5, pmcs[4]); | 693 | mtspr(SPRN_PMC5, pmcs[4]); |
689 | mtspr(SPRN_PMC6, pmcs[5]); | 694 | mtspr(SPRN_PMC6, pmcs[5]); |
690 | } | 695 | } |
696 | |||
697 | static bool use_ic(u64 event) | ||
698 | { | ||
699 | if (cpu_has_feature(CPU_FTR_POWER9_DD1) && | ||
700 | (event == 0x200f2 || event == 0x300f2)) | ||
701 | return true; | ||
702 | |||
703 | return false; | ||
704 | } | ||
691 | #endif /* CONFIG_PPC64 */ | 705 | #endif /* CONFIG_PPC64 */ |
692 | 706 | ||
693 | static void perf_event_interrupt(struct pt_regs *regs); | 707 | static void perf_event_interrupt(struct pt_regs *regs); |
@@ -1007,6 +1021,7 @@ static u64 check_and_compute_delta(u64 prev, u64 val) | |||
1007 | static void power_pmu_read(struct perf_event *event) | 1021 | static void power_pmu_read(struct perf_event *event) |
1008 | { | 1022 | { |
1009 | s64 val, delta, prev; | 1023 | s64 val, delta, prev; |
1024 | struct cpu_hw_events *cpuhw = this_cpu_ptr(&cpu_hw_events); | ||
1010 | 1025 | ||
1011 | if (event->hw.state & PERF_HES_STOPPED) | 1026 | if (event->hw.state & PERF_HES_STOPPED) |
1012 | return; | 1027 | return; |
@@ -1016,6 +1031,13 @@ static void power_pmu_read(struct perf_event *event) | |||
1016 | 1031 | ||
1017 | if (is_ebb_event(event)) { | 1032 | if (is_ebb_event(event)) { |
1018 | val = read_pmc(event->hw.idx); | 1033 | val = read_pmc(event->hw.idx); |
1034 | if (use_ic(event->attr.config)) { | ||
1035 | val = mfspr(SPRN_IC); | ||
1036 | if (val > cpuhw->ic_init) | ||
1037 | val = val - cpuhw->ic_init; | ||
1038 | else | ||
1039 | val = val + (0 - cpuhw->ic_init); | ||
1040 | } | ||
1019 | local64_set(&event->hw.prev_count, val); | 1041 | local64_set(&event->hw.prev_count, val); |
1020 | return; | 1042 | return; |
1021 | } | 1043 | } |
@@ -1029,6 +1051,13 @@ static void power_pmu_read(struct perf_event *event) | |||
1029 | prev = local64_read(&event->hw.prev_count); | 1051 | prev = local64_read(&event->hw.prev_count); |
1030 | barrier(); | 1052 | barrier(); |
1031 | val = read_pmc(event->hw.idx); | 1053 | val = read_pmc(event->hw.idx); |
1054 | if (use_ic(event->attr.config)) { | ||
1055 | val = mfspr(SPRN_IC); | ||
1056 | if (val > cpuhw->ic_init) | ||
1057 | val = val - cpuhw->ic_init; | ||
1058 | else | ||
1059 | val = val + (0 - cpuhw->ic_init); | ||
1060 | } | ||
1032 | delta = check_and_compute_delta(prev, val); | 1061 | delta = check_and_compute_delta(prev, val); |
1033 | if (!delta) | 1062 | if (!delta) |
1034 | return; | 1063 | return; |
@@ -1466,6 +1495,13 @@ nocheck: | |||
1466 | event->attr.branch_sample_type); | 1495 | event->attr.branch_sample_type); |
1467 | } | 1496 | } |
1468 | 1497 | ||
1498 | /* | ||
1499 | * Workaround for POWER9 DD1 to use the Instruction Counter | ||
1500 | * register value for instruction counting | ||
1501 | */ | ||
1502 | if (use_ic(event->attr.config)) | ||
1503 | cpuhw->ic_init = mfspr(SPRN_IC); | ||
1504 | |||
1469 | perf_pmu_enable(event->pmu); | 1505 | perf_pmu_enable(event->pmu); |
1470 | local_irq_restore(flags); | 1506 | local_irq_restore(flags); |
1471 | return ret; | 1507 | return ret; |
diff --git a/arch/powerpc/perf/isa207-common.c b/arch/powerpc/perf/isa207-common.c index 50e598cf644b..e79fb5fb817d 100644 --- a/arch/powerpc/perf/isa207-common.c +++ b/arch/powerpc/perf/isa207-common.c | |||
@@ -97,6 +97,28 @@ static unsigned long combine_shift(unsigned long pmc) | |||
97 | return MMCR1_COMBINE_SHIFT(pmc); | 97 | return MMCR1_COMBINE_SHIFT(pmc); |
98 | } | 98 | } |
99 | 99 | ||
100 | static inline bool event_is_threshold(u64 event) | ||
101 | { | ||
102 | return (event >> EVENT_THR_SEL_SHIFT) & EVENT_THR_SEL_MASK; | ||
103 | } | ||
104 | |||
105 | static bool is_thresh_cmp_valid(u64 event) | ||
106 | { | ||
107 | unsigned int cmp, exp; | ||
108 | |||
109 | /* | ||
110 | * Check the mantissa upper two bits are not zero, unless the | ||
111 | * exponent is also zero. See the THRESH_CMP_MANTISSA doc. | ||
112 | */ | ||
113 | cmp = (event >> EVENT_THR_CMP_SHIFT) & EVENT_THR_CMP_MASK; | ||
114 | exp = cmp >> 7; | ||
115 | |||
116 | if (exp && (cmp & 0x60) == 0) | ||
117 | return false; | ||
118 | |||
119 | return true; | ||
120 | } | ||
121 | |||
100 | int isa207_get_constraint(u64 event, unsigned long *maskp, unsigned long *valp) | 122 | int isa207_get_constraint(u64 event, unsigned long *maskp, unsigned long *valp) |
101 | { | 123 | { |
102 | unsigned int unit, pmc, cache, ebb; | 124 | unsigned int unit, pmc, cache, ebb; |
@@ -163,28 +185,26 @@ int isa207_get_constraint(u64 event, unsigned long *maskp, unsigned long *valp) | |||
163 | value |= CNST_SAMPLE_VAL(event >> EVENT_SAMPLE_SHIFT); | 185 | value |= CNST_SAMPLE_VAL(event >> EVENT_SAMPLE_SHIFT); |
164 | } | 186 | } |
165 | 187 | ||
166 | /* | 188 | if (cpu_has_feature(CPU_FTR_ARCH_300)) { |
167 | * Special case for PM_MRK_FAB_RSP_MATCH and PM_MRK_FAB_RSP_MATCH_CYC, | 189 | if (event_is_threshold(event) && is_thresh_cmp_valid(event)) { |
168 | * the threshold control bits are used for the match value. | 190 | mask |= CNST_THRESH_MASK; |
169 | */ | 191 | value |= CNST_THRESH_VAL(event >> EVENT_THRESH_SHIFT); |
170 | if (event_is_fab_match(event)) { | 192 | } |
171 | mask |= CNST_FAB_MATCH_MASK; | ||
172 | value |= CNST_FAB_MATCH_VAL(event >> EVENT_THR_CTL_SHIFT); | ||
173 | } else { | 193 | } else { |
174 | /* | 194 | /* |
175 | * Check the mantissa upper two bits are not zero, unless the | 195 | * Special case for PM_MRK_FAB_RSP_MATCH and PM_MRK_FAB_RSP_MATCH_CYC, |
176 | * exponent is also zero. See the THRESH_CMP_MANTISSA doc. | 196 | * the threshold control bits are used for the match value. |
177 | */ | 197 | */ |
178 | unsigned int cmp, exp; | 198 | if (event_is_fab_match(event)) { |
179 | 199 | mask |= CNST_FAB_MATCH_MASK; | |
180 | cmp = (event >> EVENT_THR_CMP_SHIFT) & EVENT_THR_CMP_MASK; | 200 | value |= CNST_FAB_MATCH_VAL(event >> EVENT_THR_CTL_SHIFT); |
181 | exp = cmp >> 7; | 201 | } else { |
182 | 202 | if (!is_thresh_cmp_valid(event)) | |
183 | if (exp && (cmp & 0x60) == 0) | 203 | return -1; |
184 | return -1; | ||
185 | 204 | ||
186 | mask |= CNST_THRESH_MASK; | 205 | mask |= CNST_THRESH_MASK; |
187 | value |= CNST_THRESH_VAL(event >> EVENT_THRESH_SHIFT); | 206 | value |= CNST_THRESH_VAL(event >> EVENT_THRESH_SHIFT); |
207 | } | ||
188 | } | 208 | } |
189 | 209 | ||
190 | if (!pmc && ebb) | 210 | if (!pmc && ebb) |
@@ -279,7 +299,7 @@ int isa207_compute_mmcr(u64 event[], int n_ev, | |||
279 | * PM_MRK_FAB_RSP_MATCH and PM_MRK_FAB_RSP_MATCH_CYC, | 299 | * PM_MRK_FAB_RSP_MATCH and PM_MRK_FAB_RSP_MATCH_CYC, |
280 | * the threshold bits are used for the match value. | 300 | * the threshold bits are used for the match value. |
281 | */ | 301 | */ |
282 | if (event_is_fab_match(event[i])) { | 302 | if (!cpu_has_feature(CPU_FTR_ARCH_300) && event_is_fab_match(event[i])) { |
283 | mmcr1 |= ((event[i] >> EVENT_THR_CTL_SHIFT) & | 303 | mmcr1 |= ((event[i] >> EVENT_THR_CTL_SHIFT) & |
284 | EVENT_THR_CTL_MASK) << MMCR1_FAB_SHIFT; | 304 | EVENT_THR_CTL_MASK) << MMCR1_FAB_SHIFT; |
285 | } else { | 305 | } else { |
@@ -338,3 +358,39 @@ void isa207_disable_pmc(unsigned int pmc, unsigned long mmcr[]) | |||
338 | if (pmc <= 3) | 358 | if (pmc <= 3) |
339 | mmcr[1] &= ~(0xffUL << MMCR1_PMCSEL_SHIFT(pmc + 1)); | 359 | mmcr[1] &= ~(0xffUL << MMCR1_PMCSEL_SHIFT(pmc + 1)); |
340 | } | 360 | } |
361 | |||
362 | static int find_alternative(u64 event, const unsigned int ev_alt[][MAX_ALT], int size) | ||
363 | { | ||
364 | int i, j; | ||
365 | |||
366 | for (i = 0; i < size; ++i) { | ||
367 | if (event < ev_alt[i][0]) | ||
368 | break; | ||
369 | |||
370 | for (j = 0; j < MAX_ALT && ev_alt[i][j]; ++j) | ||
371 | if (event == ev_alt[i][j]) | ||
372 | return i; | ||
373 | } | ||
374 | |||
375 | return -1; | ||
376 | } | ||
377 | |||
378 | int isa207_get_alternatives(u64 event, u64 alt[], | ||
379 | const unsigned int ev_alt[][MAX_ALT], int size) | ||
380 | { | ||
381 | int i, j, num_alt = 0; | ||
382 | u64 alt_event; | ||
383 | |||
384 | alt[num_alt++] = event; | ||
385 | i = find_alternative(event, ev_alt, size); | ||
386 | if (i >= 0) { | ||
387 | /* Filter out the original event, it's already in alt[0] */ | ||
388 | for (j = 0; j < MAX_ALT; ++j) { | ||
389 | alt_event = ev_alt[i][j]; | ||
390 | if (alt_event && alt_event != event) | ||
391 | alt[num_alt++] = alt_event; | ||
392 | } | ||
393 | } | ||
394 | |||
395 | return num_alt; | ||
396 | } | ||
diff --git a/arch/powerpc/perf/isa207-common.h b/arch/powerpc/perf/isa207-common.h index 90495f1580c7..cf9bd8990159 100644 --- a/arch/powerpc/perf/isa207-common.h +++ b/arch/powerpc/perf/isa207-common.h | |||
@@ -222,6 +222,10 @@ | |||
222 | CNST_PMC_VAL(1) | CNST_PMC_VAL(2) | CNST_PMC_VAL(3) | \ | 222 | CNST_PMC_VAL(1) | CNST_PMC_VAL(2) | CNST_PMC_VAL(3) | \ |
223 | CNST_PMC_VAL(4) | CNST_PMC_VAL(5) | CNST_PMC_VAL(6) | CNST_NC_VAL | 223 | CNST_PMC_VAL(4) | CNST_PMC_VAL(5) | CNST_PMC_VAL(6) | CNST_NC_VAL |
224 | 224 | ||
225 | /* | ||
226 | * Lets restrict use of PMC5 for instruction counting. | ||
227 | */ | ||
228 | #define P9_DD1_TEST_ADDER (ISA207_TEST_ADDER | CNST_PMC_VAL(5)) | ||
225 | 229 | ||
226 | /* Bits in MMCR1 for PowerISA v2.07 */ | 230 | /* Bits in MMCR1 for PowerISA v2.07 */ |
227 | #define MMCR1_UNIT_SHIFT(pmc) (60 - (4 * ((pmc) - 1))) | 231 | #define MMCR1_UNIT_SHIFT(pmc) (60 - (4 * ((pmc) - 1))) |
@@ -260,5 +264,8 @@ int isa207_compute_mmcr(u64 event[], int n_ev, | |||
260 | unsigned int hwc[], unsigned long mmcr[], | 264 | unsigned int hwc[], unsigned long mmcr[], |
261 | struct perf_event *pevents[]); | 265 | struct perf_event *pevents[]); |
262 | void isa207_disable_pmc(unsigned int pmc, unsigned long mmcr[]); | 266 | void isa207_disable_pmc(unsigned int pmc, unsigned long mmcr[]); |
267 | int isa207_get_alternatives(u64 event, u64 alt[], | ||
268 | const unsigned int ev_alt[][MAX_ALT], int size); | ||
269 | |||
263 | 270 | ||
264 | #endif | 271 | #endif |
diff --git a/arch/powerpc/perf/power8-pmu.c b/arch/powerpc/perf/power8-pmu.c index d07186382f3a..ce15b19a7962 100644 --- a/arch/powerpc/perf/power8-pmu.c +++ b/arch/powerpc/perf/power8-pmu.c | |||
@@ -48,43 +48,12 @@ static const unsigned int event_alternatives[][MAX_ALT] = { | |||
48 | { PM_RUN_INST_CMPL_ALT, PM_RUN_INST_CMPL }, | 48 | { PM_RUN_INST_CMPL_ALT, PM_RUN_INST_CMPL }, |
49 | }; | 49 | }; |
50 | 50 | ||
51 | /* | ||
52 | * Scan the alternatives table for a match and return the | ||
53 | * index into the alternatives table if found, else -1. | ||
54 | */ | ||
55 | static int find_alternative(u64 event) | ||
56 | { | ||
57 | int i, j; | ||
58 | |||
59 | for (i = 0; i < ARRAY_SIZE(event_alternatives); ++i) { | ||
60 | if (event < event_alternatives[i][0]) | ||
61 | break; | ||
62 | |||
63 | for (j = 0; j < MAX_ALT && event_alternatives[i][j]; ++j) | ||
64 | if (event == event_alternatives[i][j]) | ||
65 | return i; | ||
66 | } | ||
67 | |||
68 | return -1; | ||
69 | } | ||
70 | |||
71 | static int power8_get_alternatives(u64 event, unsigned int flags, u64 alt[]) | 51 | static int power8_get_alternatives(u64 event, unsigned int flags, u64 alt[]) |
72 | { | 52 | { |
73 | int i, j, num_alt = 0; | 53 | int i, j, num_alt = 0; |
74 | u64 alt_event; | ||
75 | |||
76 | alt[num_alt++] = event; | ||
77 | |||
78 | i = find_alternative(event); | ||
79 | if (i >= 0) { | ||
80 | /* Filter out the original event, it's already in alt[0] */ | ||
81 | for (j = 0; j < MAX_ALT; ++j) { | ||
82 | alt_event = event_alternatives[i][j]; | ||
83 | if (alt_event && alt_event != event) | ||
84 | alt[num_alt++] = alt_event; | ||
85 | } | ||
86 | } | ||
87 | 54 | ||
55 | num_alt = isa207_get_alternatives(event, alt, event_alternatives, | ||
56 | (int)ARRAY_SIZE(event_alternatives)); | ||
88 | if (flags & PPMU_ONLY_COUNT_RUN) { | 57 | if (flags & PPMU_ONLY_COUNT_RUN) { |
89 | /* | 58 | /* |
90 | * We're only counting in RUN state, so PM_CYC is equivalent to | 59 | * We're only counting in RUN state, so PM_CYC is equivalent to |
diff --git a/arch/powerpc/perf/power9-events-list.h b/arch/powerpc/perf/power9-events-list.h index 929b56d47ad9..71a6bfee5c02 100644 --- a/arch/powerpc/perf/power9-events-list.h +++ b/arch/powerpc/perf/power9-events-list.h | |||
@@ -53,3 +53,6 @@ EVENT(PM_ITLB_MISS, 0x400fc) | |||
53 | EVENT(PM_RUN_INST_CMPL, 0x500fa) | 53 | EVENT(PM_RUN_INST_CMPL, 0x500fa) |
54 | /* Run_cycles */ | 54 | /* Run_cycles */ |
55 | EVENT(PM_RUN_CYC, 0x600f4) | 55 | EVENT(PM_RUN_CYC, 0x600f4) |
56 | /* Instruction Dispatched */ | ||
57 | EVENT(PM_INST_DISP, 0x200f2) | ||
58 | EVENT(PM_INST_DISP_ALT, 0x300f2) | ||
diff --git a/arch/powerpc/perf/power9-pmu.c b/arch/powerpc/perf/power9-pmu.c index 7332634e18c9..7f6582708e06 100644 --- a/arch/powerpc/perf/power9-pmu.c +++ b/arch/powerpc/perf/power9-pmu.c | |||
@@ -22,7 +22,7 @@ | |||
22 | * | - - - - | - - - - | - - - - | - - - - | - - - - | - - - - | - - - - | - - - - | | 22 | * | - - - - | - - - - | - - - - | - - - - | - - - - | - - - - | - - - - | - - - - | |
23 | * | | [ ] [ ] [ thresh_cmp ] [ thresh_ctl ] | 23 | * | | [ ] [ ] [ thresh_cmp ] [ thresh_ctl ] |
24 | * | | | | | | 24 | * | | | | | |
25 | * | | *- IFM (Linux) | thresh start/stop OR FAB match -* | 25 | * | | *- IFM (Linux) | thresh start/stop -* |
26 | * | *- BHRB (Linux) *sm | 26 | * | *- BHRB (Linux) *sm |
27 | * *- EBB (Linux) | 27 | * *- EBB (Linux) |
28 | * | 28 | * |
@@ -50,11 +50,9 @@ | |||
50 | * MMCR1[31] = pmc4combine[1] | 50 | * MMCR1[31] = pmc4combine[1] |
51 | * | 51 | * |
52 | * if pmc == 3 and unit == 0 and pmcxsel[0:6] == 0b0101011 | 52 | * if pmc == 3 and unit == 0 and pmcxsel[0:6] == 0b0101011 |
53 | * # PM_MRK_FAB_RSP_MATCH | 53 | * MMCR1[20:27] = thresh_ctl |
54 | * MMCR1[20:27] = thresh_ctl (FAB_CRESP_MATCH / FAB_TYPE_MATCH) | ||
55 | * else if pmc == 4 and unit == 0xf and pmcxsel[0:6] == 0b0101001 | 54 | * else if pmc == 4 and unit == 0xf and pmcxsel[0:6] == 0b0101001 |
56 | * # PM_MRK_FAB_RSP_MATCH_CYC | 55 | * MMCR1[20:27] = thresh_ctl |
57 | * MMCR1[20:27] = thresh_ctl (FAB_CRESP_MATCH / FAB_TYPE_MATCH) | ||
58 | * else | 56 | * else |
59 | * MMCRA[48:55] = thresh_ctl (THRESH START/END) | 57 | * MMCRA[48:55] = thresh_ctl (THRESH START/END) |
60 | * | 58 | * |
@@ -106,6 +104,21 @@ enum { | |||
106 | /* PowerISA v2.07 format attribute structure*/ | 104 | /* PowerISA v2.07 format attribute structure*/ |
107 | extern struct attribute_group isa207_pmu_format_group; | 105 | extern struct attribute_group isa207_pmu_format_group; |
108 | 106 | ||
107 | /* Table of alternatives, sorted by column 0 */ | ||
108 | static const unsigned int power9_event_alternatives[][MAX_ALT] = { | ||
109 | { PM_INST_DISP, PM_INST_DISP_ALT }, | ||
110 | }; | ||
111 | |||
112 | static int power9_get_alternatives(u64 event, unsigned int flags, u64 alt[]) | ||
113 | { | ||
114 | int num_alt = 0; | ||
115 | |||
116 | num_alt = isa207_get_alternatives(event, alt, power9_event_alternatives, | ||
117 | (int)ARRAY_SIZE(power9_event_alternatives)); | ||
118 | |||
119 | return num_alt; | ||
120 | } | ||
121 | |||
109 | GENERIC_EVENT_ATTR(cpu-cycles, PM_CYC); | 122 | GENERIC_EVENT_ATTR(cpu-cycles, PM_CYC); |
110 | GENERIC_EVENT_ATTR(stalled-cycles-frontend, PM_ICT_NOSLOT_CYC); | 123 | GENERIC_EVENT_ATTR(stalled-cycles-frontend, PM_ICT_NOSLOT_CYC); |
111 | GENERIC_EVENT_ATTR(stalled-cycles-backend, PM_CMPLU_STALL); | 124 | GENERIC_EVENT_ATTR(stalled-cycles-backend, PM_CMPLU_STALL); |
@@ -213,6 +226,17 @@ static const struct attribute_group *power9_pmu_attr_groups[] = { | |||
213 | NULL, | 226 | NULL, |
214 | }; | 227 | }; |
215 | 228 | ||
229 | static int power9_generic_events_dd1[] = { | ||
230 | [PERF_COUNT_HW_CPU_CYCLES] = PM_CYC, | ||
231 | [PERF_COUNT_HW_STALLED_CYCLES_FRONTEND] = PM_ICT_NOSLOT_CYC, | ||
232 | [PERF_COUNT_HW_STALLED_CYCLES_BACKEND] = PM_CMPLU_STALL, | ||
233 | [PERF_COUNT_HW_INSTRUCTIONS] = PM_INST_DISP, | ||
234 | [PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = PM_BRU_CMPL, | ||
235 | [PERF_COUNT_HW_BRANCH_MISSES] = PM_BR_MPRED_CMPL, | ||
236 | [PERF_COUNT_HW_CACHE_REFERENCES] = PM_LD_REF_L1, | ||
237 | [PERF_COUNT_HW_CACHE_MISSES] = PM_LD_MISS_L1_FIN, | ||
238 | }; | ||
239 | |||
216 | static int power9_generic_events[] = { | 240 | static int power9_generic_events[] = { |
217 | [PERF_COUNT_HW_CPU_CYCLES] = PM_CYC, | 241 | [PERF_COUNT_HW_CPU_CYCLES] = PM_CYC, |
218 | [PERF_COUNT_HW_STALLED_CYCLES_FRONTEND] = PM_ICT_NOSLOT_CYC, | 242 | [PERF_COUNT_HW_STALLED_CYCLES_FRONTEND] = PM_ICT_NOSLOT_CYC, |
@@ -383,10 +407,11 @@ static struct power_pmu power9_isa207_pmu = { | |||
383 | .config_bhrb = power9_config_bhrb, | 407 | .config_bhrb = power9_config_bhrb, |
384 | .bhrb_filter_map = power9_bhrb_filter_map, | 408 | .bhrb_filter_map = power9_bhrb_filter_map, |
385 | .get_constraint = isa207_get_constraint, | 409 | .get_constraint = isa207_get_constraint, |
410 | .get_alternatives = power9_get_alternatives, | ||
386 | .disable_pmc = isa207_disable_pmc, | 411 | .disable_pmc = isa207_disable_pmc, |
387 | .flags = PPMU_NO_SIAR | PPMU_ARCH_207S, | 412 | .flags = PPMU_NO_SIAR | PPMU_ARCH_207S, |
388 | .n_generic = ARRAY_SIZE(power9_generic_events), | 413 | .n_generic = ARRAY_SIZE(power9_generic_events_dd1), |
389 | .generic_events = power9_generic_events, | 414 | .generic_events = power9_generic_events_dd1, |
390 | .cache_events = &power9_cache_events, | 415 | .cache_events = &power9_cache_events, |
391 | .attr_groups = power9_isa207_pmu_attr_groups, | 416 | .attr_groups = power9_isa207_pmu_attr_groups, |
392 | .bhrb_nr = 32, | 417 | .bhrb_nr = 32, |
@@ -396,11 +421,12 @@ static struct power_pmu power9_pmu = { | |||
396 | .name = "POWER9", | 421 | .name = "POWER9", |
397 | .n_counter = MAX_PMU_COUNTERS, | 422 | .n_counter = MAX_PMU_COUNTERS, |
398 | .add_fields = ISA207_ADD_FIELDS, | 423 | .add_fields = ISA207_ADD_FIELDS, |
399 | .test_adder = ISA207_TEST_ADDER, | 424 | .test_adder = P9_DD1_TEST_ADDER, |
400 | .compute_mmcr = isa207_compute_mmcr, | 425 | .compute_mmcr = isa207_compute_mmcr, |
401 | .config_bhrb = power9_config_bhrb, | 426 | .config_bhrb = power9_config_bhrb, |
402 | .bhrb_filter_map = power9_bhrb_filter_map, | 427 | .bhrb_filter_map = power9_bhrb_filter_map, |
403 | .get_constraint = isa207_get_constraint, | 428 | .get_constraint = isa207_get_constraint, |
429 | .get_alternatives = power9_get_alternatives, | ||
404 | .disable_pmc = isa207_disable_pmc, | 430 | .disable_pmc = isa207_disable_pmc, |
405 | .flags = PPMU_HAS_SIER | PPMU_ARCH_207S, | 431 | .flags = PPMU_HAS_SIER | PPMU_ARCH_207S, |
406 | .n_generic = ARRAY_SIZE(power9_generic_events), | 432 | .n_generic = ARRAY_SIZE(power9_generic_events), |
@@ -420,6 +446,11 @@ static int __init init_power9_pmu(void) | |||
420 | return -ENODEV; | 446 | return -ENODEV; |
421 | 447 | ||
422 | if (cpu_has_feature(CPU_FTR_POWER9_DD1)) { | 448 | if (cpu_has_feature(CPU_FTR_POWER9_DD1)) { |
449 | /* | ||
450 | * Since PM_INST_CMPL may not provide right counts in all | ||
451 | * sampling scenarios in power9 DD1, instead use PM_INST_DISP. | ||
452 | */ | ||
453 | EVENT_VAR(PM_INST_CMPL, _g).id = PM_INST_DISP; | ||
423 | rc = register_power_pmu(&power9_isa207_pmu); | 454 | rc = register_power_pmu(&power9_isa207_pmu); |
424 | } else { | 455 | } else { |
425 | rc = register_power_pmu(&power9_pmu); | 456 | rc = register_power_pmu(&power9_pmu); |
diff --git a/arch/powerpc/platforms/85xx/Makefile b/arch/powerpc/platforms/85xx/Makefile index 7bc86dae9517..fe19dad568e2 100644 --- a/arch/powerpc/platforms/85xx/Makefile +++ b/arch/powerpc/platforms/85xx/Makefile | |||
@@ -22,6 +22,7 @@ obj-$(CONFIG_P1022_RDK) += p1022_rdk.o | |||
22 | obj-$(CONFIG_P1023_RDB) += p1023_rdb.o | 22 | obj-$(CONFIG_P1023_RDB) += p1023_rdb.o |
23 | obj-$(CONFIG_TWR_P102x) += twr_p102x.o | 23 | obj-$(CONFIG_TWR_P102x) += twr_p102x.o |
24 | obj-$(CONFIG_CORENET_GENERIC) += corenet_generic.o | 24 | obj-$(CONFIG_CORENET_GENERIC) += corenet_generic.o |
25 | obj-$(CONFIG_FB_FSL_DIU) += t1042rdb_diu.o | ||
25 | obj-$(CONFIG_STX_GP3) += stx_gp3.o | 26 | obj-$(CONFIG_STX_GP3) += stx_gp3.o |
26 | obj-$(CONFIG_TQM85xx) += tqm85xx.o | 27 | obj-$(CONFIG_TQM85xx) += tqm85xx.o |
27 | obj-$(CONFIG_SBC8548) += sbc8548.o | 28 | obj-$(CONFIG_SBC8548) += sbc8548.o |
diff --git a/arch/powerpc/platforms/85xx/corenet_generic.c b/arch/powerpc/platforms/85xx/corenet_generic.c index 6c0ba75fb256..ac191a7a1337 100644 --- a/arch/powerpc/platforms/85xx/corenet_generic.c +++ b/arch/powerpc/platforms/85xx/corenet_generic.c | |||
@@ -157,6 +157,7 @@ static const char * const boards[] __initconst = { | |||
157 | "fsl,T1040RDB", | 157 | "fsl,T1040RDB", |
158 | "fsl,T1042RDB", | 158 | "fsl,T1042RDB", |
159 | "fsl,T1042RDB_PI", | 159 | "fsl,T1042RDB_PI", |
160 | "keymile,kmcent2", | ||
160 | "keymile,kmcoge4", | 161 | "keymile,kmcoge4", |
161 | "varisys,CYRUS", | 162 | "varisys,CYRUS", |
162 | NULL | 163 | NULL |
diff --git a/arch/powerpc/platforms/85xx/t1042rdb_diu.c b/arch/powerpc/platforms/85xx/t1042rdb_diu.c new file mode 100644 index 000000000000..58fa3d319f1c --- /dev/null +++ b/arch/powerpc/platforms/85xx/t1042rdb_diu.c | |||
@@ -0,0 +1,152 @@ | |||
1 | /* | ||
2 | * T1042 platform DIU operation | ||
3 | * | ||
4 | * Copyright 2014 Freescale Semiconductor Inc. | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify it | ||
7 | * under the terms of the GNU General Public License as published by the | ||
8 | * Free Software Foundation; either version 2 of the License, or (at your | ||
9 | * option) any later version. | ||
10 | */ | ||
11 | |||
12 | #include <linux/io.h> | ||
13 | #include <linux/kernel.h> | ||
14 | #include <linux/of.h> | ||
15 | #include <linux/of_address.h> | ||
16 | |||
17 | #include <sysdev/fsl_soc.h> | ||
18 | |||
19 | /*DIU Pixel ClockCR offset in scfg*/ | ||
20 | #define CCSR_SCFG_PIXCLKCR 0x28 | ||
21 | |||
22 | /* DIU Pixel Clock bits of the PIXCLKCR */ | ||
23 | #define PIXCLKCR_PXCKEN 0x80000000 | ||
24 | #define PIXCLKCR_PXCKINV 0x40000000 | ||
25 | #define PIXCLKCR_PXCKDLY 0x0000FF00 | ||
26 | #define PIXCLKCR_PXCLK_MASK 0x00FF0000 | ||
27 | |||
28 | /* Some CPLD register definitions */ | ||
29 | #define CPLD_DIUCSR 0x16 | ||
30 | #define CPLD_DIUCSR_DVIEN 0x80 | ||
31 | #define CPLD_DIUCSR_BACKLIGHT 0x0f | ||
32 | |||
33 | struct device_node *cpld_node; | ||
34 | |||
35 | /** | ||
36 | * t1042rdb_set_monitor_port: switch the output to a different monitor port | ||
37 | */ | ||
38 | static void t1042rdb_set_monitor_port(enum fsl_diu_monitor_port port) | ||
39 | { | ||
40 | static void __iomem *cpld_base; | ||
41 | |||
42 | cpld_base = of_iomap(cpld_node, 0); | ||
43 | if (!cpld_base) { | ||
44 | pr_err("%s: Could not map cpld registers\n", __func__); | ||
45 | goto exit; | ||
46 | } | ||
47 | |||
48 | switch (port) { | ||
49 | case FSL_DIU_PORT_DVI: | ||
50 | /* Enable the DVI(HDMI) port, disable the DFP and | ||
51 | * the backlight | ||
52 | */ | ||
53 | clrbits8(cpld_base + CPLD_DIUCSR, CPLD_DIUCSR_DVIEN); | ||
54 | break; | ||
55 | case FSL_DIU_PORT_LVDS: | ||
56 | /* | ||
57 | * LVDS also needs backlight enabled, otherwise the display | ||
58 | * will be blank. | ||
59 | */ | ||
60 | /* Enable the DFP port, disable the DVI*/ | ||
61 | setbits8(cpld_base + CPLD_DIUCSR, 0x01 << 8); | ||
62 | setbits8(cpld_base + CPLD_DIUCSR, 0x01 << 4); | ||
63 | setbits8(cpld_base + CPLD_DIUCSR, CPLD_DIUCSR_BACKLIGHT); | ||
64 | break; | ||
65 | default: | ||
66 | pr_err("%s: Unsupported monitor port %i\n", __func__, port); | ||
67 | } | ||
68 | |||
69 | iounmap(cpld_base); | ||
70 | exit: | ||
71 | of_node_put(cpld_node); | ||
72 | } | ||
73 | |||
74 | /** | ||
75 | * t1042rdb_set_pixel_clock: program the DIU's clock | ||
76 | * @pixclock: pixel clock in ps (pico seconds) | ||
77 | */ | ||
78 | static void t1042rdb_set_pixel_clock(unsigned int pixclock) | ||
79 | { | ||
80 | struct device_node *scfg_np; | ||
81 | void __iomem *scfg; | ||
82 | unsigned long freq; | ||
83 | u64 temp; | ||
84 | u32 pxclk; | ||
85 | |||
86 | scfg_np = of_find_compatible_node(NULL, NULL, "fsl,t1040-scfg"); | ||
87 | if (!scfg_np) { | ||
88 | pr_err("%s: Missing scfg node. Can not display video.\n", | ||
89 | __func__); | ||
90 | return; | ||
91 | } | ||
92 | |||
93 | scfg = of_iomap(scfg_np, 0); | ||
94 | of_node_put(scfg_np); | ||
95 | if (!scfg) { | ||
96 | pr_err("%s: Could not map device. Can not display video.\n", | ||
97 | __func__); | ||
98 | return; | ||
99 | } | ||
100 | |||
101 | /* Convert pixclock into frequency */ | ||
102 | temp = 1000000000000ULL; | ||
103 | do_div(temp, pixclock); | ||
104 | freq = temp; | ||
105 | |||
106 | /* | ||
107 | * 'pxclk' is the ratio of the platform clock to the pixel clock. | ||
108 | * This number is programmed into the PIXCLKCR register, and the valid | ||
109 | * range of values is 2-255. | ||
110 | */ | ||
111 | pxclk = DIV_ROUND_CLOSEST(fsl_get_sys_freq(), freq); | ||
112 | pxclk = clamp_t(u32, pxclk, 2, 255); | ||
113 | |||
114 | /* Disable the pixel clock, and set it to non-inverted and no delay */ | ||
115 | clrbits32(scfg + CCSR_SCFG_PIXCLKCR, | ||
116 | PIXCLKCR_PXCKEN | PIXCLKCR_PXCKDLY | PIXCLKCR_PXCLK_MASK); | ||
117 | |||
118 | /* Enable the clock and set the pxclk */ | ||
119 | setbits32(scfg + CCSR_SCFG_PIXCLKCR, PIXCLKCR_PXCKEN | (pxclk << 16)); | ||
120 | |||
121 | iounmap(scfg); | ||
122 | } | ||
123 | |||
124 | /** | ||
125 | * t1042rdb_valid_monitor_port: set the monitor port for sysfs | ||
126 | */ | ||
127 | static enum fsl_diu_monitor_port | ||
128 | t1042rdb_valid_monitor_port(enum fsl_diu_monitor_port port) | ||
129 | { | ||
130 | switch (port) { | ||
131 | case FSL_DIU_PORT_DVI: | ||
132 | case FSL_DIU_PORT_LVDS: | ||
133 | return port; | ||
134 | default: | ||
135 | return FSL_DIU_PORT_DVI; /* Dual-link LVDS is not supported */ | ||
136 | } | ||
137 | } | ||
138 | |||
139 | static int __init t1042rdb_diu_init(void) | ||
140 | { | ||
141 | cpld_node = of_find_compatible_node(NULL, NULL, "fsl,t1042rdb-cpld"); | ||
142 | if (!cpld_node) | ||
143 | return 0; | ||
144 | |||
145 | diu_ops.set_monitor_port = t1042rdb_set_monitor_port; | ||
146 | diu_ops.set_pixel_clock = t1042rdb_set_pixel_clock; | ||
147 | diu_ops.valid_monitor_port = t1042rdb_valid_monitor_port; | ||
148 | |||
149 | return 0; | ||
150 | } | ||
151 | |||
152 | early_initcall(t1042rdb_diu_init); | ||
diff --git a/arch/powerpc/platforms/Kconfig.cputype b/arch/powerpc/platforms/Kconfig.cputype index 6e89e5a8d4fb..99b0ae8acb78 100644 --- a/arch/powerpc/platforms/Kconfig.cputype +++ b/arch/powerpc/platforms/Kconfig.cputype | |||
@@ -172,6 +172,13 @@ config PPC_FPU | |||
172 | bool | 172 | bool |
173 | default y if PPC64 | 173 | default y if PPC64 |
174 | 174 | ||
175 | config PPC_8xx_PERF_EVENT | ||
176 | bool "PPC 8xx perf events" | ||
177 | depends on PPC_8xx && PERF_EVENTS | ||
178 | help | ||
179 | This is Performance Events support for PPC 8xx. The 8xx doesn't | ||
180 | have a PMU but some events are emulated using 8xx features. | ||
181 | |||
175 | config FSL_EMB_PERFMON | 182 | config FSL_EMB_PERFMON |
176 | bool "Freescale Embedded Perfmon" | 183 | bool "Freescale Embedded Perfmon" |
177 | depends on E500 || PPC_83xx | 184 | depends on E500 || PPC_83xx |
diff --git a/arch/powerpc/platforms/cell/spufs/file.c b/arch/powerpc/platforms/cell/spufs/file.c index e5ec1368f0cd..ae2f740a82f1 100644 --- a/arch/powerpc/platforms/cell/spufs/file.c +++ b/arch/powerpc/platforms/cell/spufs/file.c | |||
@@ -683,23 +683,13 @@ size_t spu_ibox_read(struct spu_context *ctx, u32 *data) | |||
683 | return ctx->ops->ibox_read(ctx, data); | 683 | return ctx->ops->ibox_read(ctx, data); |
684 | } | 684 | } |
685 | 685 | ||
686 | static int spufs_ibox_fasync(int fd, struct file *file, int on) | ||
687 | { | ||
688 | struct spu_context *ctx = file->private_data; | ||
689 | |||
690 | return fasync_helper(fd, file, on, &ctx->ibox_fasync); | ||
691 | } | ||
692 | |||
693 | /* interrupt-level ibox callback function. */ | 686 | /* interrupt-level ibox callback function. */ |
694 | void spufs_ibox_callback(struct spu *spu) | 687 | void spufs_ibox_callback(struct spu *spu) |
695 | { | 688 | { |
696 | struct spu_context *ctx = spu->ctx; | 689 | struct spu_context *ctx = spu->ctx; |
697 | 690 | ||
698 | if (!ctx) | 691 | if (ctx) |
699 | return; | 692 | wake_up_all(&ctx->ibox_wq); |
700 | |||
701 | wake_up_all(&ctx->ibox_wq); | ||
702 | kill_fasync(&ctx->ibox_fasync, SIGIO, POLLIN); | ||
703 | } | 693 | } |
704 | 694 | ||
705 | /* | 695 | /* |
@@ -794,7 +784,6 @@ static const struct file_operations spufs_ibox_fops = { | |||
794 | .open = spufs_pipe_open, | 784 | .open = spufs_pipe_open, |
795 | .read = spufs_ibox_read, | 785 | .read = spufs_ibox_read, |
796 | .poll = spufs_ibox_poll, | 786 | .poll = spufs_ibox_poll, |
797 | .fasync = spufs_ibox_fasync, | ||
798 | .llseek = no_llseek, | 787 | .llseek = no_llseek, |
799 | }; | 788 | }; |
800 | 789 | ||
@@ -832,26 +821,13 @@ size_t spu_wbox_write(struct spu_context *ctx, u32 data) | |||
832 | return ctx->ops->wbox_write(ctx, data); | 821 | return ctx->ops->wbox_write(ctx, data); |
833 | } | 822 | } |
834 | 823 | ||
835 | static int spufs_wbox_fasync(int fd, struct file *file, int on) | ||
836 | { | ||
837 | struct spu_context *ctx = file->private_data; | ||
838 | int ret; | ||
839 | |||
840 | ret = fasync_helper(fd, file, on, &ctx->wbox_fasync); | ||
841 | |||
842 | return ret; | ||
843 | } | ||
844 | |||
845 | /* interrupt-level wbox callback function. */ | 824 | /* interrupt-level wbox callback function. */ |
846 | void spufs_wbox_callback(struct spu *spu) | 825 | void spufs_wbox_callback(struct spu *spu) |
847 | { | 826 | { |
848 | struct spu_context *ctx = spu->ctx; | 827 | struct spu_context *ctx = spu->ctx; |
849 | 828 | ||
850 | if (!ctx) | 829 | if (ctx) |
851 | return; | 830 | wake_up_all(&ctx->wbox_wq); |
852 | |||
853 | wake_up_all(&ctx->wbox_wq); | ||
854 | kill_fasync(&ctx->wbox_fasync, SIGIO, POLLOUT); | ||
855 | } | 831 | } |
856 | 832 | ||
857 | /* | 833 | /* |
@@ -944,7 +920,6 @@ static const struct file_operations spufs_wbox_fops = { | |||
944 | .open = spufs_pipe_open, | 920 | .open = spufs_pipe_open, |
945 | .write = spufs_wbox_write, | 921 | .write = spufs_wbox_write, |
946 | .poll = spufs_wbox_poll, | 922 | .poll = spufs_wbox_poll, |
947 | .fasync = spufs_wbox_fasync, | ||
948 | .llseek = no_llseek, | 923 | .llseek = no_llseek, |
949 | }; | 924 | }; |
950 | 925 | ||
@@ -1520,28 +1495,8 @@ void spufs_mfc_callback(struct spu *spu) | |||
1520 | { | 1495 | { |
1521 | struct spu_context *ctx = spu->ctx; | 1496 | struct spu_context *ctx = spu->ctx; |
1522 | 1497 | ||
1523 | if (!ctx) | 1498 | if (ctx) |
1524 | return; | 1499 | wake_up_all(&ctx->mfc_wq); |
1525 | |||
1526 | wake_up_all(&ctx->mfc_wq); | ||
1527 | |||
1528 | pr_debug("%s %s\n", __func__, spu->name); | ||
1529 | if (ctx->mfc_fasync) { | ||
1530 | u32 free_elements, tagstatus; | ||
1531 | unsigned int mask; | ||
1532 | |||
1533 | /* no need for spu_acquire in interrupt context */ | ||
1534 | free_elements = ctx->ops->get_mfc_free_elements(ctx); | ||
1535 | tagstatus = ctx->ops->read_mfc_tagstatus(ctx); | ||
1536 | |||
1537 | mask = 0; | ||
1538 | if (free_elements & 0xffff) | ||
1539 | mask |= POLLOUT; | ||
1540 | if (tagstatus & ctx->tagwait) | ||
1541 | mask |= POLLIN; | ||
1542 | |||
1543 | kill_fasync(&ctx->mfc_fasync, SIGIO, mask); | ||
1544 | } | ||
1545 | } | 1500 | } |
1546 | 1501 | ||
1547 | static int spufs_read_mfc_tagstatus(struct spu_context *ctx, u32 *status) | 1502 | static int spufs_read_mfc_tagstatus(struct spu_context *ctx, u32 *status) |
@@ -1803,13 +1758,6 @@ static int spufs_mfc_fsync(struct file *file, loff_t start, loff_t end, int data | |||
1803 | return err; | 1758 | return err; |
1804 | } | 1759 | } |
1805 | 1760 | ||
1806 | static int spufs_mfc_fasync(int fd, struct file *file, int on) | ||
1807 | { | ||
1808 | struct spu_context *ctx = file->private_data; | ||
1809 | |||
1810 | return fasync_helper(fd, file, on, &ctx->mfc_fasync); | ||
1811 | } | ||
1812 | |||
1813 | static const struct file_operations spufs_mfc_fops = { | 1761 | static const struct file_operations spufs_mfc_fops = { |
1814 | .open = spufs_mfc_open, | 1762 | .open = spufs_mfc_open, |
1815 | .release = spufs_mfc_release, | 1763 | .release = spufs_mfc_release, |
@@ -1818,7 +1766,6 @@ static const struct file_operations spufs_mfc_fops = { | |||
1818 | .poll = spufs_mfc_poll, | 1766 | .poll = spufs_mfc_poll, |
1819 | .flush = spufs_mfc_flush, | 1767 | .flush = spufs_mfc_flush, |
1820 | .fsync = spufs_mfc_fsync, | 1768 | .fsync = spufs_mfc_fsync, |
1821 | .fasync = spufs_mfc_fasync, | ||
1822 | .mmap = spufs_mfc_mmap, | 1769 | .mmap = spufs_mfc_mmap, |
1823 | .llseek = no_llseek, | 1770 | .llseek = no_llseek, |
1824 | }; | 1771 | }; |
diff --git a/arch/powerpc/platforms/cell/spufs/spufs.h b/arch/powerpc/platforms/cell/spufs/spufs.h index bcfd6f063efa..aac733966092 100644 --- a/arch/powerpc/platforms/cell/spufs/spufs.h +++ b/arch/powerpc/platforms/cell/spufs/spufs.h | |||
@@ -102,9 +102,6 @@ struct spu_context { | |||
102 | wait_queue_head_t stop_wq; | 102 | wait_queue_head_t stop_wq; |
103 | wait_queue_head_t mfc_wq; | 103 | wait_queue_head_t mfc_wq; |
104 | wait_queue_head_t run_wq; | 104 | wait_queue_head_t run_wq; |
105 | struct fasync_struct *ibox_fasync; | ||
106 | struct fasync_struct *wbox_fasync; | ||
107 | struct fasync_struct *mfc_fasync; | ||
108 | u32 tagwait; | 105 | u32 tagwait; |
109 | struct spu_context_ops *ops; | 106 | struct spu_context_ops *ops; |
110 | struct work_struct reap_work; | 107 | struct work_struct reap_work; |
diff --git a/arch/powerpc/platforms/powernv/Kconfig b/arch/powerpc/platforms/powernv/Kconfig index 604190cab522..3a07e4dcf97c 100644 --- a/arch/powerpc/platforms/powernv/Kconfig +++ b/arch/powerpc/platforms/powernv/Kconfig | |||
@@ -5,7 +5,8 @@ config PPC_POWERNV | |||
5 | select PPC_XICS | 5 | select PPC_XICS |
6 | select PPC_ICP_NATIVE | 6 | select PPC_ICP_NATIVE |
7 | select PPC_P7_NAP | 7 | select PPC_P7_NAP |
8 | select PPC_PCI_CHOICE if EMBEDDED | 8 | select PCI |
9 | select PCI_MSI | ||
9 | select EPAPR_BOOT | 10 | select EPAPR_BOOT |
10 | select PPC_INDIRECT_PIO | 11 | select PPC_INDIRECT_PIO |
11 | select PPC_UDBG_16550 | 12 | select PPC_UDBG_16550 |
diff --git a/arch/powerpc/platforms/powernv/pci-ioda.c b/arch/powerpc/platforms/powernv/pci-ioda.c index e0f83c204ccc..6901a06da2f9 100644 --- a/arch/powerpc/platforms/powernv/pci-ioda.c +++ b/arch/powerpc/platforms/powernv/pci-ioda.c | |||
@@ -1468,14 +1468,12 @@ void pnv_pci_sriov_disable(struct pci_dev *pdev) | |||
1468 | struct pnv_phb *phb; | 1468 | struct pnv_phb *phb; |
1469 | struct pnv_ioda_pe *pe; | 1469 | struct pnv_ioda_pe *pe; |
1470 | struct pci_dn *pdn; | 1470 | struct pci_dn *pdn; |
1471 | struct pci_sriov *iov; | ||
1472 | u16 num_vfs, i; | 1471 | u16 num_vfs, i; |
1473 | 1472 | ||
1474 | bus = pdev->bus; | 1473 | bus = pdev->bus; |
1475 | hose = pci_bus_to_host(bus); | 1474 | hose = pci_bus_to_host(bus); |
1476 | phb = hose->private_data; | 1475 | phb = hose->private_data; |
1477 | pdn = pci_get_pdn(pdev); | 1476 | pdn = pci_get_pdn(pdev); |
1478 | iov = pdev->sriov; | ||
1479 | num_vfs = pdn->num_vfs; | 1477 | num_vfs = pdn->num_vfs; |
1480 | 1478 | ||
1481 | /* Release VF PEs */ | 1479 | /* Release VF PEs */ |
diff --git a/arch/powerpc/platforms/pseries/dlpar.c b/arch/powerpc/platforms/pseries/dlpar.c index d3a81e746fc4..193e052fa0dd 100644 --- a/arch/powerpc/platforms/pseries/dlpar.c +++ b/arch/powerpc/platforms/pseries/dlpar.c | |||
@@ -354,11 +354,17 @@ static int handle_dlpar_errorlog(struct pseries_hp_errorlog *hp_elog) | |||
354 | switch (hp_elog->id_type) { | 354 | switch (hp_elog->id_type) { |
355 | case PSERIES_HP_ELOG_ID_DRC_COUNT: | 355 | case PSERIES_HP_ELOG_ID_DRC_COUNT: |
356 | hp_elog->_drc_u.drc_count = | 356 | hp_elog->_drc_u.drc_count = |
357 | be32_to_cpu(hp_elog->_drc_u.drc_count); | 357 | be32_to_cpu(hp_elog->_drc_u.drc_count); |
358 | break; | 358 | break; |
359 | case PSERIES_HP_ELOG_ID_DRC_INDEX: | 359 | case PSERIES_HP_ELOG_ID_DRC_INDEX: |
360 | hp_elog->_drc_u.drc_index = | 360 | hp_elog->_drc_u.drc_index = |
361 | be32_to_cpu(hp_elog->_drc_u.drc_index); | 361 | be32_to_cpu(hp_elog->_drc_u.drc_index); |
362 | break; | ||
363 | case PSERIES_HP_ELOG_ID_DRC_IC: | ||
364 | hp_elog->_drc_u.ic.count = | ||
365 | be32_to_cpu(hp_elog->_drc_u.ic.count); | ||
366 | hp_elog->_drc_u.ic.index = | ||
367 | be32_to_cpu(hp_elog->_drc_u.ic.index); | ||
362 | } | 368 | } |
363 | 369 | ||
364 | switch (hp_elog->resource) { | 370 | switch (hp_elog->resource) { |
@@ -467,7 +473,33 @@ static int dlpar_parse_id_type(char **cmd, struct pseries_hp_errorlog *hp_elog) | |||
467 | if (!arg) | 473 | if (!arg) |
468 | return -EINVAL; | 474 | return -EINVAL; |
469 | 475 | ||
470 | if (sysfs_streq(arg, "index")) { | 476 | if (sysfs_streq(arg, "indexed-count")) { |
477 | hp_elog->id_type = PSERIES_HP_ELOG_ID_DRC_IC; | ||
478 | arg = strsep(cmd, " "); | ||
479 | if (!arg) { | ||
480 | pr_err("No DRC count specified.\n"); | ||
481 | return -EINVAL; | ||
482 | } | ||
483 | |||
484 | if (kstrtou32(arg, 0, &count)) { | ||
485 | pr_err("Invalid DRC count specified.\n"); | ||
486 | return -EINVAL; | ||
487 | } | ||
488 | |||
489 | arg = strsep(cmd, " "); | ||
490 | if (!arg) { | ||
491 | pr_err("No DRC Index specified.\n"); | ||
492 | return -EINVAL; | ||
493 | } | ||
494 | |||
495 | if (kstrtou32(arg, 0, &index)) { | ||
496 | pr_err("Invalid DRC Index specified.\n"); | ||
497 | return -EINVAL; | ||
498 | } | ||
499 | |||
500 | hp_elog->_drc_u.ic.count = cpu_to_be32(count); | ||
501 | hp_elog->_drc_u.ic.index = cpu_to_be32(index); | ||
502 | } else if (sysfs_streq(arg, "index")) { | ||
471 | hp_elog->id_type = PSERIES_HP_ELOG_ID_DRC_INDEX; | 503 | hp_elog->id_type = PSERIES_HP_ELOG_ID_DRC_INDEX; |
472 | arg = strsep(cmd, " "); | 504 | arg = strsep(cmd, " "); |
473 | if (!arg) { | 505 | if (!arg) { |
diff --git a/arch/powerpc/platforms/pseries/hotplug-memory.c b/arch/powerpc/platforms/pseries/hotplug-memory.c index 3381c20edbc0..e104c71ea44a 100644 --- a/arch/powerpc/platforms/pseries/hotplug-memory.c +++ b/arch/powerpc/platforms/pseries/hotplug-memory.c | |||
@@ -320,6 +320,19 @@ static int dlpar_remove_device_tree_lmb(struct of_drconf_cell *lmb) | |||
320 | return dlpar_update_device_tree_lmb(lmb); | 320 | return dlpar_update_device_tree_lmb(lmb); |
321 | } | 321 | } |
322 | 322 | ||
323 | static struct memory_block *lmb_to_memblock(struct of_drconf_cell *lmb) | ||
324 | { | ||
325 | unsigned long section_nr; | ||
326 | struct mem_section *mem_sect; | ||
327 | struct memory_block *mem_block; | ||
328 | |||
329 | section_nr = pfn_to_section_nr(PFN_DOWN(lmb->base_addr)); | ||
330 | mem_sect = __nr_to_section(section_nr); | ||
331 | |||
332 | mem_block = find_memory_block(mem_sect); | ||
333 | return mem_block; | ||
334 | } | ||
335 | |||
323 | #ifdef CONFIG_MEMORY_HOTREMOVE | 336 | #ifdef CONFIG_MEMORY_HOTREMOVE |
324 | static int pseries_remove_memblock(unsigned long base, unsigned int memblock_size) | 337 | static int pseries_remove_memblock(unsigned long base, unsigned int memblock_size) |
325 | { | 338 | { |
@@ -407,19 +420,6 @@ static bool lmb_is_removable(struct of_drconf_cell *lmb) | |||
407 | 420 | ||
408 | static int dlpar_add_lmb(struct of_drconf_cell *); | 421 | static int dlpar_add_lmb(struct of_drconf_cell *); |
409 | 422 | ||
410 | static struct memory_block *lmb_to_memblock(struct of_drconf_cell *lmb) | ||
411 | { | ||
412 | unsigned long section_nr; | ||
413 | struct mem_section *mem_sect; | ||
414 | struct memory_block *mem_block; | ||
415 | |||
416 | section_nr = pfn_to_section_nr(PFN_DOWN(lmb->base_addr)); | ||
417 | mem_sect = __nr_to_section(section_nr); | ||
418 | |||
419 | mem_block = find_memory_block(mem_sect); | ||
420 | return mem_block; | ||
421 | } | ||
422 | |||
423 | static int dlpar_remove_lmb(struct of_drconf_cell *lmb) | 423 | static int dlpar_remove_lmb(struct of_drconf_cell *lmb) |
424 | { | 424 | { |
425 | struct memory_block *mem_block; | 425 | struct memory_block *mem_block; |
@@ -601,6 +601,94 @@ static int dlpar_memory_readd_by_index(u32 drc_index, struct property *prop) | |||
601 | 601 | ||
602 | return rc; | 602 | return rc; |
603 | } | 603 | } |
604 | |||
605 | static int dlpar_memory_remove_by_ic(u32 lmbs_to_remove, u32 drc_index, | ||
606 | struct property *prop) | ||
607 | { | ||
608 | struct of_drconf_cell *lmbs; | ||
609 | u32 num_lmbs, *p; | ||
610 | int i, rc, start_lmb_found; | ||
611 | int lmbs_available = 0, start_index = 0, end_index; | ||
612 | |||
613 | pr_info("Attempting to hot-remove %u LMB(s) at %x\n", | ||
614 | lmbs_to_remove, drc_index); | ||
615 | |||
616 | if (lmbs_to_remove == 0) | ||
617 | return -EINVAL; | ||
618 | |||
619 | p = prop->value; | ||
620 | num_lmbs = *p++; | ||
621 | lmbs = (struct of_drconf_cell *)p; | ||
622 | start_lmb_found = 0; | ||
623 | |||
624 | /* Navigate to drc_index */ | ||
625 | while (start_index < num_lmbs) { | ||
626 | if (lmbs[start_index].drc_index == drc_index) { | ||
627 | start_lmb_found = 1; | ||
628 | break; | ||
629 | } | ||
630 | |||
631 | start_index++; | ||
632 | } | ||
633 | |||
634 | if (!start_lmb_found) | ||
635 | return -EINVAL; | ||
636 | |||
637 | end_index = start_index + lmbs_to_remove; | ||
638 | |||
639 | /* Validate that there are enough LMBs to satisfy the request */ | ||
640 | for (i = start_index; i < end_index; i++) { | ||
641 | if (lmbs[i].flags & DRCONF_MEM_RESERVED) | ||
642 | break; | ||
643 | |||
644 | lmbs_available++; | ||
645 | } | ||
646 | |||
647 | if (lmbs_available < lmbs_to_remove) | ||
648 | return -EINVAL; | ||
649 | |||
650 | for (i = start_index; i < end_index; i++) { | ||
651 | if (!(lmbs[i].flags & DRCONF_MEM_ASSIGNED)) | ||
652 | continue; | ||
653 | |||
654 | rc = dlpar_remove_lmb(&lmbs[i]); | ||
655 | if (rc) | ||
656 | break; | ||
657 | |||
658 | lmbs[i].reserved = 1; | ||
659 | } | ||
660 | |||
661 | if (rc) { | ||
662 | pr_err("Memory indexed-count-remove failed, adding any removed LMBs\n"); | ||
663 | |||
664 | for (i = start_index; i < end_index; i++) { | ||
665 | if (!lmbs[i].reserved) | ||
666 | continue; | ||
667 | |||
668 | rc = dlpar_add_lmb(&lmbs[i]); | ||
669 | if (rc) | ||
670 | pr_err("Failed to add LMB, drc index %x\n", | ||
671 | be32_to_cpu(lmbs[i].drc_index)); | ||
672 | |||
673 | lmbs[i].reserved = 0; | ||
674 | } | ||
675 | rc = -EINVAL; | ||
676 | } else { | ||
677 | for (i = start_index; i < end_index; i++) { | ||
678 | if (!lmbs[i].reserved) | ||
679 | continue; | ||
680 | |||
681 | dlpar_release_drc(lmbs[i].drc_index); | ||
682 | pr_info("Memory at %llx (drc index %x) was hot-removed\n", | ||
683 | lmbs[i].base_addr, lmbs[i].drc_index); | ||
684 | |||
685 | lmbs[i].reserved = 0; | ||
686 | } | ||
687 | } | ||
688 | |||
689 | return rc; | ||
690 | } | ||
691 | |||
604 | #else | 692 | #else |
605 | static inline int pseries_remove_memblock(unsigned long base, | 693 | static inline int pseries_remove_memblock(unsigned long base, |
606 | unsigned int memblock_size) | 694 | unsigned int memblock_size) |
@@ -628,9 +716,32 @@ static int dlpar_memory_remove_by_index(u32 drc_index, struct property *prop) | |||
628 | { | 716 | { |
629 | return -EOPNOTSUPP; | 717 | return -EOPNOTSUPP; |
630 | } | 718 | } |
719 | static int dlpar_memory_readd_by_index(u32 drc_index, struct property *prop) | ||
720 | { | ||
721 | return -EOPNOTSUPP; | ||
722 | } | ||
631 | 723 | ||
724 | static int dlpar_memory_remove_by_ic(u32 lmbs_to_remove, u32 drc_index, | ||
725 | struct property *prop) | ||
726 | { | ||
727 | return -EOPNOTSUPP; | ||
728 | } | ||
632 | #endif /* CONFIG_MEMORY_HOTREMOVE */ | 729 | #endif /* CONFIG_MEMORY_HOTREMOVE */ |
633 | 730 | ||
731 | static int dlpar_online_lmb(struct of_drconf_cell *lmb) | ||
732 | { | ||
733 | struct memory_block *mem_block; | ||
734 | int rc; | ||
735 | |||
736 | mem_block = lmb_to_memblock(lmb); | ||
737 | if (!mem_block) | ||
738 | return -EINVAL; | ||
739 | |||
740 | rc = device_online(&mem_block->dev); | ||
741 | put_device(&mem_block->dev); | ||
742 | return rc; | ||
743 | } | ||
744 | |||
634 | static int dlpar_add_lmb(struct of_drconf_cell *lmb) | 745 | static int dlpar_add_lmb(struct of_drconf_cell *lmb) |
635 | { | 746 | { |
636 | unsigned long block_sz; | 747 | unsigned long block_sz; |
@@ -654,10 +765,18 @@ static int dlpar_add_lmb(struct of_drconf_cell *lmb) | |||
654 | 765 | ||
655 | /* Add the memory */ | 766 | /* Add the memory */ |
656 | rc = add_memory(nid, lmb->base_addr, block_sz); | 767 | rc = add_memory(nid, lmb->base_addr, block_sz); |
657 | if (rc) | 768 | if (rc) { |
658 | dlpar_remove_device_tree_lmb(lmb); | 769 | dlpar_remove_device_tree_lmb(lmb); |
659 | else | 770 | return rc; |
771 | } | ||
772 | |||
773 | rc = dlpar_online_lmb(lmb); | ||
774 | if (rc) { | ||
775 | remove_memory(nid, lmb->base_addr, block_sz); | ||
776 | dlpar_remove_device_tree_lmb(lmb); | ||
777 | } else { | ||
660 | lmb->flags |= DRCONF_MEM_ASSIGNED; | 778 | lmb->flags |= DRCONF_MEM_ASSIGNED; |
779 | } | ||
661 | 780 | ||
662 | return rc; | 781 | return rc; |
663 | } | 782 | } |
@@ -776,6 +895,97 @@ static int dlpar_memory_add_by_index(u32 drc_index, struct property *prop) | |||
776 | return rc; | 895 | return rc; |
777 | } | 896 | } |
778 | 897 | ||
898 | static int dlpar_memory_add_by_ic(u32 lmbs_to_add, u32 drc_index, | ||
899 | struct property *prop) | ||
900 | { | ||
901 | struct of_drconf_cell *lmbs; | ||
902 | u32 num_lmbs, *p; | ||
903 | int i, rc, start_lmb_found; | ||
904 | int lmbs_available = 0, start_index = 0, end_index; | ||
905 | |||
906 | pr_info("Attempting to hot-add %u LMB(s) at index %x\n", | ||
907 | lmbs_to_add, drc_index); | ||
908 | |||
909 | if (lmbs_to_add == 0) | ||
910 | return -EINVAL; | ||
911 | |||
912 | p = prop->value; | ||
913 | num_lmbs = *p++; | ||
914 | lmbs = (struct of_drconf_cell *)p; | ||
915 | start_lmb_found = 0; | ||
916 | |||
917 | /* Navigate to drc_index */ | ||
918 | while (start_index < num_lmbs) { | ||
919 | if (lmbs[start_index].drc_index == drc_index) { | ||
920 | start_lmb_found = 1; | ||
921 | break; | ||
922 | } | ||
923 | |||
924 | start_index++; | ||
925 | } | ||
926 | |||
927 | if (!start_lmb_found) | ||
928 | return -EINVAL; | ||
929 | |||
930 | end_index = start_index + lmbs_to_add; | ||
931 | |||
932 | /* Validate that the LMBs in this range are not reserved */ | ||
933 | for (i = start_index; i < end_index; i++) { | ||
934 | if (lmbs[i].flags & DRCONF_MEM_RESERVED) | ||
935 | break; | ||
936 | |||
937 | lmbs_available++; | ||
938 | } | ||
939 | |||
940 | if (lmbs_available < lmbs_to_add) | ||
941 | return -EINVAL; | ||
942 | |||
943 | for (i = start_index; i < end_index; i++) { | ||
944 | if (lmbs[i].flags & DRCONF_MEM_ASSIGNED) | ||
945 | continue; | ||
946 | |||
947 | rc = dlpar_acquire_drc(lmbs[i].drc_index); | ||
948 | if (rc) | ||
949 | break; | ||
950 | |||
951 | rc = dlpar_add_lmb(&lmbs[i]); | ||
952 | if (rc) { | ||
953 | dlpar_release_drc(lmbs[i].drc_index); | ||
954 | break; | ||
955 | } | ||
956 | |||
957 | lmbs[i].reserved = 1; | ||
958 | } | ||
959 | |||
960 | if (rc) { | ||
961 | pr_err("Memory indexed-count-add failed, removing any added LMBs\n"); | ||
962 | |||
963 | for (i = start_index; i < end_index; i++) { | ||
964 | if (!lmbs[i].reserved) | ||
965 | continue; | ||
966 | |||
967 | rc = dlpar_remove_lmb(&lmbs[i]); | ||
968 | if (rc) | ||
969 | pr_err("Failed to remove LMB, drc index %x\n", | ||
970 | be32_to_cpu(lmbs[i].drc_index)); | ||
971 | else | ||
972 | dlpar_release_drc(lmbs[i].drc_index); | ||
973 | } | ||
974 | rc = -EINVAL; | ||
975 | } else { | ||
976 | for (i = start_index; i < end_index; i++) { | ||
977 | if (!lmbs[i].reserved) | ||
978 | continue; | ||
979 | |||
980 | pr_info("Memory at %llx (drc index %x) was hot-added\n", | ||
981 | lmbs[i].base_addr, lmbs[i].drc_index); | ||
982 | lmbs[i].reserved = 0; | ||
983 | } | ||
984 | } | ||
985 | |||
986 | return rc; | ||
987 | } | ||
988 | |||
779 | int dlpar_memory(struct pseries_hp_errorlog *hp_elog) | 989 | int dlpar_memory(struct pseries_hp_errorlog *hp_elog) |
780 | { | 990 | { |
781 | struct device_node *dn; | 991 | struct device_node *dn; |
@@ -783,9 +993,6 @@ int dlpar_memory(struct pseries_hp_errorlog *hp_elog) | |||
783 | u32 count, drc_index; | 993 | u32 count, drc_index; |
784 | int rc; | 994 | int rc; |
785 | 995 | ||
786 | count = hp_elog->_drc_u.drc_count; | ||
787 | drc_index = hp_elog->_drc_u.drc_index; | ||
788 | |||
789 | lock_device_hotplug(); | 996 | lock_device_hotplug(); |
790 | 997 | ||
791 | dn = of_find_node_by_path("/ibm,dynamic-reconfiguration-memory"); | 998 | dn = of_find_node_by_path("/ibm,dynamic-reconfiguration-memory"); |
@@ -802,22 +1009,39 @@ int dlpar_memory(struct pseries_hp_errorlog *hp_elog) | |||
802 | 1009 | ||
803 | switch (hp_elog->action) { | 1010 | switch (hp_elog->action) { |
804 | case PSERIES_HP_ELOG_ACTION_ADD: | 1011 | case PSERIES_HP_ELOG_ACTION_ADD: |
805 | if (hp_elog->id_type == PSERIES_HP_ELOG_ID_DRC_COUNT) | 1012 | if (hp_elog->id_type == PSERIES_HP_ELOG_ID_DRC_COUNT) { |
1013 | count = hp_elog->_drc_u.drc_count; | ||
806 | rc = dlpar_memory_add_by_count(count, prop); | 1014 | rc = dlpar_memory_add_by_count(count, prop); |
807 | else if (hp_elog->id_type == PSERIES_HP_ELOG_ID_DRC_INDEX) | 1015 | } else if (hp_elog->id_type == PSERIES_HP_ELOG_ID_DRC_INDEX) { |
1016 | drc_index = hp_elog->_drc_u.drc_index; | ||
808 | rc = dlpar_memory_add_by_index(drc_index, prop); | 1017 | rc = dlpar_memory_add_by_index(drc_index, prop); |
809 | else | 1018 | } else if (hp_elog->id_type == PSERIES_HP_ELOG_ID_DRC_IC) { |
1019 | count = hp_elog->_drc_u.ic.count; | ||
1020 | drc_index = hp_elog->_drc_u.ic.index; | ||
1021 | rc = dlpar_memory_add_by_ic(count, drc_index, prop); | ||
1022 | } else { | ||
810 | rc = -EINVAL; | 1023 | rc = -EINVAL; |
1024 | } | ||
1025 | |||
811 | break; | 1026 | break; |
812 | case PSERIES_HP_ELOG_ACTION_REMOVE: | 1027 | case PSERIES_HP_ELOG_ACTION_REMOVE: |
813 | if (hp_elog->id_type == PSERIES_HP_ELOG_ID_DRC_COUNT) | 1028 | if (hp_elog->id_type == PSERIES_HP_ELOG_ID_DRC_COUNT) { |
1029 | count = hp_elog->_drc_u.drc_count; | ||
814 | rc = dlpar_memory_remove_by_count(count, prop); | 1030 | rc = dlpar_memory_remove_by_count(count, prop); |
815 | else if (hp_elog->id_type == PSERIES_HP_ELOG_ID_DRC_INDEX) | 1031 | } else if (hp_elog->id_type == PSERIES_HP_ELOG_ID_DRC_INDEX) { |
1032 | drc_index = hp_elog->_drc_u.drc_index; | ||
816 | rc = dlpar_memory_remove_by_index(drc_index, prop); | 1033 | rc = dlpar_memory_remove_by_index(drc_index, prop); |
817 | else | 1034 | } else if (hp_elog->id_type == PSERIES_HP_ELOG_ID_DRC_IC) { |
1035 | count = hp_elog->_drc_u.ic.count; | ||
1036 | drc_index = hp_elog->_drc_u.ic.index; | ||
1037 | rc = dlpar_memory_remove_by_ic(count, drc_index, prop); | ||
1038 | } else { | ||
818 | rc = -EINVAL; | 1039 | rc = -EINVAL; |
1040 | } | ||
1041 | |||
819 | break; | 1042 | break; |
820 | case PSERIES_HP_ELOG_ACTION_READD: | 1043 | case PSERIES_HP_ELOG_ACTION_READD: |
1044 | drc_index = hp_elog->_drc_u.drc_index; | ||
821 | rc = dlpar_memory_readd_by_index(drc_index, prop); | 1045 | rc = dlpar_memory_readd_by_index(drc_index, prop); |
822 | break; | 1046 | break; |
823 | default: | 1047 | default: |
diff --git a/arch/powerpc/xmon/ppc-dis.c b/arch/powerpc/xmon/ppc-dis.c index ee9891734149..31db8c072acd 100644 --- a/arch/powerpc/xmon/ppc-dis.c +++ b/arch/powerpc/xmon/ppc-dis.c | |||
@@ -1,6 +1,5 @@ | |||
1 | /* ppc-dis.c -- Disassemble PowerPC instructions | 1 | /* ppc-dis.c -- Disassemble PowerPC instructions |
2 | Copyright 1994, 1995, 2000, 2001, 2002, 2003, 2004, 2005, 2006 | 2 | Copyright (C) 1994-2016 Free Software Foundation, Inc. |
3 | Free Software Foundation, Inc. | ||
4 | Written by Ian Lance Taylor, Cygnus Support | 3 | Written by Ian Lance Taylor, Cygnus Support |
5 | 4 | ||
6 | This file is part of GDB, GAS, and the GNU binutils. | 5 | This file is part of GDB, GAS, and the GNU binutils. |
@@ -26,57 +25,94 @@ Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, US | |||
26 | #include "ppc.h" | 25 | #include "ppc.h" |
27 | #include "dis-asm.h" | 26 | #include "dis-asm.h" |
28 | 27 | ||
29 | /* Print a PowerPC or POWER instruction. */ | 28 | /* This file provides several disassembler functions, all of which use |
29 | the disassembler interface defined in dis-asm.h. Several functions | ||
30 | are provided because this file handles disassembly for the PowerPC | ||
31 | in both big and little endian mode and also for the POWER (RS/6000) | ||
32 | chip. */ | ||
33 | |||
34 | /* Extract the operand value from the PowerPC or POWER instruction. */ | ||
30 | 35 | ||
31 | int | 36 | static long |
32 | print_insn_powerpc (unsigned long insn, unsigned long memaddr) | 37 | operand_value_powerpc (const struct powerpc_operand *operand, |
38 | unsigned long insn, ppc_cpu_t dialect) | ||
33 | { | 39 | { |
34 | const struct powerpc_opcode *opcode; | 40 | long value; |
35 | const struct powerpc_opcode *opcode_end; | 41 | int invalid; |
36 | unsigned long op; | 42 | /* Extract the value from the instruction. */ |
37 | int dialect; | 43 | if (operand->extract) |
44 | value = (*operand->extract) (insn, dialect, &invalid); | ||
45 | else | ||
46 | { | ||
47 | if (operand->shift >= 0) | ||
48 | value = (insn >> operand->shift) & operand->bitm; | ||
49 | else | ||
50 | value = (insn << -operand->shift) & operand->bitm; | ||
51 | if ((operand->flags & PPC_OPERAND_SIGNED) != 0) | ||
52 | { | ||
53 | /* BITM is always some number of zeros followed by some | ||
54 | number of ones, followed by some number of zeros. */ | ||
55 | unsigned long top = operand->bitm; | ||
56 | /* top & -top gives the rightmost 1 bit, so this | ||
57 | fills in any trailing zeros. */ | ||
58 | top |= (top & -top) - 1; | ||
59 | top &= ~(top >> 1); | ||
60 | value = (value ^ top) - top; | ||
61 | } | ||
62 | } | ||
38 | 63 | ||
39 | dialect = PPC_OPCODE_PPC | PPC_OPCODE_CLASSIC | PPC_OPCODE_COMMON | 64 | return value; |
40 | | PPC_OPCODE_64 | PPC_OPCODE_POWER4 | PPC_OPCODE_ALTIVEC; | 65 | } |
41 | 66 | ||
42 | if (cpu_has_feature(CPU_FTRS_POWER5)) | 67 | /* Determine whether the optional operand(s) should be printed. */ |
43 | dialect |= PPC_OPCODE_POWER5; | ||
44 | 68 | ||
45 | if (cpu_has_feature(CPU_FTRS_CELL)) | 69 | static int |
46 | dialect |= PPC_OPCODE_CELL | PPC_OPCODE_ALTIVEC; | 70 | skip_optional_operands (const unsigned char *opindex, |
71 | unsigned long insn, ppc_cpu_t dialect) | ||
72 | { | ||
73 | const struct powerpc_operand *operand; | ||
47 | 74 | ||
48 | if (cpu_has_feature(CPU_FTRS_POWER6)) | 75 | for (; *opindex != 0; opindex++) |
49 | dialect |= PPC_OPCODE_POWER5 | PPC_OPCODE_POWER6 | PPC_OPCODE_ALTIVEC; | 76 | { |
77 | operand = &powerpc_operands[*opindex]; | ||
78 | if ((operand->flags & PPC_OPERAND_NEXT) != 0 | ||
79 | || ((operand->flags & PPC_OPERAND_OPTIONAL) != 0 | ||
80 | && operand_value_powerpc (operand, insn, dialect) != | ||
81 | ppc_optional_operand_value (operand))) | ||
82 | return 0; | ||
83 | } | ||
84 | |||
85 | return 1; | ||
86 | } | ||
87 | |||
88 | /* Find a match for INSN in the opcode table, given machine DIALECT. | ||
89 | A DIALECT of -1 is special, matching all machine opcode variations. */ | ||
90 | |||
91 | static const struct powerpc_opcode * | ||
92 | lookup_powerpc (unsigned long insn, ppc_cpu_t dialect) | ||
93 | { | ||
94 | const struct powerpc_opcode *opcode; | ||
95 | const struct powerpc_opcode *opcode_end; | ||
96 | unsigned long op; | ||
50 | 97 | ||
51 | /* Get the major opcode of the instruction. */ | 98 | /* Get the major opcode of the instruction. */ |
52 | op = PPC_OP (insn); | 99 | op = PPC_OP (insn); |
53 | 100 | ||
54 | /* Find the first match in the opcode table. We could speed this up | ||
55 | a bit by doing a binary search on the major opcode. */ | ||
56 | opcode_end = powerpc_opcodes + powerpc_num_opcodes; | 101 | opcode_end = powerpc_opcodes + powerpc_num_opcodes; |
57 | again: | 102 | /* Find the first match in the opcode table for this major opcode. */ |
58 | for (opcode = powerpc_opcodes; opcode < opcode_end; opcode++) | 103 | for (opcode = powerpc_opcodes; opcode < opcode_end; ++opcode) |
59 | { | 104 | { |
60 | unsigned long table_op; | ||
61 | const unsigned char *opindex; | 105 | const unsigned char *opindex; |
62 | const struct powerpc_operand *operand; | 106 | const struct powerpc_operand *operand; |
63 | int invalid; | 107 | int invalid; |
64 | int need_comma; | ||
65 | int need_paren; | ||
66 | |||
67 | table_op = PPC_OP (opcode->opcode); | ||
68 | if (op < table_op) | ||
69 | break; | ||
70 | if (op > table_op) | ||
71 | continue; | ||
72 | 108 | ||
73 | if ((insn & opcode->mask) != opcode->opcode | 109 | if ((insn & opcode->mask) != opcode->opcode |
74 | || (opcode->flags & dialect) == 0) | 110 | || (dialect != (ppc_cpu_t) -1 |
111 | && ((opcode->flags & dialect) == 0 | ||
112 | || (opcode->deprecated & dialect) != 0))) | ||
75 | continue; | 113 | continue; |
76 | 114 | ||
77 | /* Make two passes over the operands. First see if any of them | 115 | /* Check validity of operands. */ |
78 | have extraction functions, and, if they do, make sure the | ||
79 | instruction is valid. */ | ||
80 | invalid = 0; | 116 | invalid = 0; |
81 | for (opindex = opcode->operands; *opindex != 0; opindex++) | 117 | for (opindex = opcode->operands; *opindex != 0; opindex++) |
82 | { | 118 | { |
@@ -87,14 +123,77 @@ print_insn_powerpc (unsigned long insn, unsigned long memaddr) | |||
87 | if (invalid) | 123 | if (invalid) |
88 | continue; | 124 | continue; |
89 | 125 | ||
90 | /* The instruction is valid. */ | 126 | return opcode; |
91 | printf("%s", opcode->name); | 127 | } |
128 | |||
129 | return NULL; | ||
130 | } | ||
131 | |||
132 | /* Print a PowerPC or POWER instruction. */ | ||
133 | |||
134 | int print_insn_powerpc (unsigned long insn, unsigned long memaddr) | ||
135 | { | ||
136 | const struct powerpc_opcode *opcode; | ||
137 | bool insn_is_short; | ||
138 | ppc_cpu_t dialect; | ||
139 | |||
140 | dialect = PPC_OPCODE_PPC | PPC_OPCODE_COMMON | ||
141 | | PPC_OPCODE_64 | PPC_OPCODE_POWER4 | PPC_OPCODE_ALTIVEC; | ||
142 | |||
143 | if (cpu_has_feature(CPU_FTRS_POWER5)) | ||
144 | dialect |= PPC_OPCODE_POWER5; | ||
145 | |||
146 | if (cpu_has_feature(CPU_FTRS_CELL)) | ||
147 | dialect |= (PPC_OPCODE_CELL | PPC_OPCODE_ALTIVEC); | ||
148 | |||
149 | if (cpu_has_feature(CPU_FTRS_POWER6)) | ||
150 | dialect |= (PPC_OPCODE_POWER5 | PPC_OPCODE_POWER6 | PPC_OPCODE_ALTIVEC); | ||
151 | |||
152 | if (cpu_has_feature(CPU_FTRS_POWER7)) | ||
153 | dialect |= (PPC_OPCODE_POWER5 | PPC_OPCODE_POWER6 | PPC_OPCODE_POWER7 | ||
154 | | PPC_OPCODE_ALTIVEC | PPC_OPCODE_VSX); | ||
155 | |||
156 | if (cpu_has_feature(CPU_FTRS_POWER8)) | ||
157 | dialect |= (PPC_OPCODE_POWER5 | PPC_OPCODE_POWER6 | PPC_OPCODE_POWER7 | ||
158 | | PPC_OPCODE_POWER8 | PPC_OPCODE_HTM | ||
159 | | PPC_OPCODE_ALTIVEC | PPC_OPCODE_ALTIVEC2 | PPC_OPCODE_VSX); | ||
160 | |||
161 | if (cpu_has_feature(CPU_FTRS_POWER9)) | ||
162 | dialect |= (PPC_OPCODE_POWER5 | PPC_OPCODE_POWER6 | PPC_OPCODE_POWER7 | ||
163 | | PPC_OPCODE_POWER8 | PPC_OPCODE_POWER9 | PPC_OPCODE_HTM | ||
164 | | PPC_OPCODE_ALTIVEC | PPC_OPCODE_ALTIVEC2 | ||
165 | | PPC_OPCODE_VSX | PPC_OPCODE_VSX3), | ||
166 | |||
167 | /* Get the major opcode of the insn. */ | ||
168 | opcode = NULL; | ||
169 | insn_is_short = false; | ||
170 | |||
171 | if (opcode == NULL) | ||
172 | opcode = lookup_powerpc (insn, dialect); | ||
173 | if (opcode == NULL && (dialect & PPC_OPCODE_ANY) != 0) | ||
174 | opcode = lookup_powerpc (insn, (ppc_cpu_t) -1); | ||
175 | |||
176 | if (opcode != NULL) | ||
177 | { | ||
178 | const unsigned char *opindex; | ||
179 | const struct powerpc_operand *operand; | ||
180 | int need_comma; | ||
181 | int need_paren; | ||
182 | int skip_optional; | ||
183 | |||
92 | if (opcode->operands[0] != 0) | 184 | if (opcode->operands[0] != 0) |
93 | printf("\t"); | 185 | printf("%-7s ", opcode->name); |
186 | else | ||
187 | printf("%s", opcode->name); | ||
188 | |||
189 | if (insn_is_short) | ||
190 | /* The operands will be fetched out of the 16-bit instruction. */ | ||
191 | insn >>= 16; | ||
94 | 192 | ||
95 | /* Now extract and print the operands. */ | 193 | /* Now extract and print the operands. */ |
96 | need_comma = 0; | 194 | need_comma = 0; |
97 | need_paren = 0; | 195 | need_paren = 0; |
196 | skip_optional = -1; | ||
98 | for (opindex = opcode->operands; *opindex != 0; opindex++) | 197 | for (opindex = opcode->operands; *opindex != 0; opindex++) |
99 | { | 198 | { |
100 | long value; | 199 | long value; |
@@ -107,23 +206,18 @@ print_insn_powerpc (unsigned long insn, unsigned long memaddr) | |||
107 | if ((operand->flags & PPC_OPERAND_FAKE) != 0) | 206 | if ((operand->flags & PPC_OPERAND_FAKE) != 0) |
108 | continue; | 207 | continue; |
109 | 208 | ||
110 | /* Extract the value from the instruction. */ | 209 | /* If all of the optional operands have the value zero, |
111 | if (operand->extract) | 210 | then don't print any of them. */ |
112 | value = (*operand->extract) (insn, dialect, &invalid); | 211 | if ((operand->flags & PPC_OPERAND_OPTIONAL) != 0) |
113 | else | ||
114 | { | 212 | { |
115 | value = (insn >> operand->shift) & ((1 << operand->bits) - 1); | 213 | if (skip_optional < 0) |
116 | if ((operand->flags & PPC_OPERAND_SIGNED) != 0 | 214 | skip_optional = skip_optional_operands (opindex, insn, |
117 | && (value & (1 << (operand->bits - 1))) != 0) | 215 | dialect); |
118 | value -= 1 << operand->bits; | 216 | if (skip_optional) |
217 | continue; | ||
119 | } | 218 | } |
120 | 219 | ||
121 | /* If the operand is optional, and the value is zero, don't | 220 | value = operand_value_powerpc (operand, insn, dialect); |
122 | print anything. */ | ||
123 | if ((operand->flags & PPC_OPERAND_OPTIONAL) != 0 | ||
124 | && (operand->flags & PPC_OPERAND_NEXT) == 0 | ||
125 | && value == 0) | ||
126 | continue; | ||
127 | 221 | ||
128 | if (need_comma) | 222 | if (need_comma) |
129 | { | 223 | { |
@@ -139,30 +233,38 @@ print_insn_powerpc (unsigned long insn, unsigned long memaddr) | |||
139 | printf("f%ld", value); | 233 | printf("f%ld", value); |
140 | else if ((operand->flags & PPC_OPERAND_VR) != 0) | 234 | else if ((operand->flags & PPC_OPERAND_VR) != 0) |
141 | printf("v%ld", value); | 235 | printf("v%ld", value); |
236 | else if ((operand->flags & PPC_OPERAND_VSR) != 0) | ||
237 | printf("vs%ld", value); | ||
142 | else if ((operand->flags & PPC_OPERAND_RELATIVE) != 0) | 238 | else if ((operand->flags & PPC_OPERAND_RELATIVE) != 0) |
143 | print_address (memaddr + value); | 239 | print_address(memaddr + value); |
144 | else if ((operand->flags & PPC_OPERAND_ABSOLUTE) != 0) | 240 | else if ((operand->flags & PPC_OPERAND_ABSOLUTE) != 0) |
145 | print_address (value & 0xffffffff); | 241 | print_address(value & 0xffffffff); |
146 | else if ((operand->flags & PPC_OPERAND_CR) == 0 | 242 | else if ((operand->flags & PPC_OPERAND_FSL) != 0) |
147 | || (dialect & PPC_OPCODE_PPC) == 0) | 243 | printf("fsl%ld", value); |
244 | else if ((operand->flags & PPC_OPERAND_FCR) != 0) | ||
245 | printf("fcr%ld", value); | ||
246 | else if ((operand->flags & PPC_OPERAND_UDI) != 0) | ||
148 | printf("%ld", value); | 247 | printf("%ld", value); |
149 | else | 248 | else if ((operand->flags & PPC_OPERAND_CR_REG) != 0 |
249 | && (((dialect & PPC_OPCODE_PPC) != 0) | ||
250 | || ((dialect & PPC_OPCODE_VLE) != 0))) | ||
251 | printf("cr%ld", value); | ||
252 | else if (((operand->flags & PPC_OPERAND_CR_BIT) != 0) | ||
253 | && (((dialect & PPC_OPCODE_PPC) != 0) | ||
254 | || ((dialect & PPC_OPCODE_VLE) != 0))) | ||
150 | { | 255 | { |
151 | if (operand->bits == 3) | 256 | static const char *cbnames[4] = { "lt", "gt", "eq", "so" }; |
152 | printf("cr%ld", value); | 257 | int cr; |
153 | else | 258 | int cc; |
154 | { | 259 | |
155 | static const char *cbnames[4] = { "lt", "gt", "eq", "so" }; | 260 | cr = value >> 2; |
156 | int cr; | 261 | if (cr != 0) |
157 | int cc; | 262 | printf("4*cr%d+", cr); |
158 | 263 | cc = value & 3; | |
159 | cr = value >> 2; | 264 | printf("%s", cbnames[cc]); |
160 | if (cr != 0) | ||
161 | printf("4*cr%d+", cr); | ||
162 | cc = value & 3; | ||
163 | printf("%s", cbnames[cc]); | ||
164 | } | ||
165 | } | 265 | } |
266 | else | ||
267 | printf("%d", (int) value); | ||
166 | 268 | ||
167 | if (need_paren) | 269 | if (need_paren) |
168 | { | 270 | { |
@@ -179,14 +281,16 @@ print_insn_powerpc (unsigned long insn, unsigned long memaddr) | |||
179 | } | 281 | } |
180 | } | 282 | } |
181 | 283 | ||
182 | /* We have found and printed an instruction; return. */ | 284 | /* We have found and printed an instruction. |
183 | return 4; | 285 | If it was a short VLE instruction we have more to do. */ |
184 | } | 286 | if (insn_is_short) |
185 | 287 | { | |
186 | if ((dialect & PPC_OPCODE_ANY) != 0) | 288 | memaddr += 2; |
187 | { | 289 | return 2; |
188 | dialect = ~PPC_OPCODE_ANY; | 290 | } |
189 | goto again; | 291 | else |
292 | /* Otherwise, return. */ | ||
293 | return 4; | ||
190 | } | 294 | } |
191 | 295 | ||
192 | /* We could not find a match. */ | 296 | /* We could not find a match. */ |
diff --git a/arch/powerpc/xmon/ppc-opc.c b/arch/powerpc/xmon/ppc-opc.c index 954dbf8222d7..ac2b55b1332e 100644 --- a/arch/powerpc/xmon/ppc-opc.c +++ b/arch/powerpc/xmon/ppc-opc.c | |||
@@ -1,6 +1,5 @@ | |||
1 | /* ppc-opc.c -- PowerPC opcode list | 1 | /* ppc-opc.c -- PowerPC opcode list |
2 | Copyright 1994, 1995, 1996, 1997, 1998, 2000, 2001, 2002, 2003, 2004, | 2 | Copyright (C) 1994-2016 Free Software Foundation, Inc. |
3 | 2005 Free Software Foundation, Inc. | ||
4 | Written by Ian Lance Taylor, Cygnus Support | 3 | Written by Ian Lance Taylor, Cygnus Support |
5 | 4 | ||
6 | This file is part of GDB, GAS, and the GNU binutils. | 5 | This file is part of GDB, GAS, and the GNU binutils. |
@@ -42,66 +41,97 @@ | |||
42 | 41 | ||
43 | /* Local insertion and extraction functions. */ | 42 | /* Local insertion and extraction functions. */ |
44 | 43 | ||
45 | static unsigned long insert_bat (unsigned long, long, int, const char **); | 44 | static unsigned long insert_arx (unsigned long, long, ppc_cpu_t, const char **); |
46 | static long extract_bat (unsigned long, int, int *); | 45 | static long extract_arx (unsigned long, ppc_cpu_t, int *); |
47 | static unsigned long insert_bba (unsigned long, long, int, const char **); | 46 | static unsigned long insert_ary (unsigned long, long, ppc_cpu_t, const char **); |
48 | static long extract_bba (unsigned long, int, int *); | 47 | static long extract_ary (unsigned long, ppc_cpu_t, int *); |
49 | static unsigned long insert_bd (unsigned long, long, int, const char **); | 48 | static unsigned long insert_bat (unsigned long, long, ppc_cpu_t, const char **); |
50 | static long extract_bd (unsigned long, int, int *); | 49 | static long extract_bat (unsigned long, ppc_cpu_t, int *); |
51 | static unsigned long insert_bdm (unsigned long, long, int, const char **); | 50 | static unsigned long insert_bba (unsigned long, long, ppc_cpu_t, const char **); |
52 | static long extract_bdm (unsigned long, int, int *); | 51 | static long extract_bba (unsigned long, ppc_cpu_t, int *); |
53 | static unsigned long insert_bdp (unsigned long, long, int, const char **); | 52 | static unsigned long insert_bdm (unsigned long, long, ppc_cpu_t, const char **); |
54 | static long extract_bdp (unsigned long, int, int *); | 53 | static long extract_bdm (unsigned long, ppc_cpu_t, int *); |
55 | static unsigned long insert_bo (unsigned long, long, int, const char **); | 54 | static unsigned long insert_bdp (unsigned long, long, ppc_cpu_t, const char **); |
56 | static long extract_bo (unsigned long, int, int *); | 55 | static long extract_bdp (unsigned long, ppc_cpu_t, int *); |
57 | static unsigned long insert_boe (unsigned long, long, int, const char **); | 56 | static unsigned long insert_bo (unsigned long, long, ppc_cpu_t, const char **); |
58 | static long extract_boe (unsigned long, int, int *); | 57 | static long extract_bo (unsigned long, ppc_cpu_t, int *); |
59 | static unsigned long insert_dq (unsigned long, long, int, const char **); | 58 | static unsigned long insert_boe (unsigned long, long, ppc_cpu_t, const char **); |
60 | static long extract_dq (unsigned long, int, int *); | 59 | static long extract_boe (unsigned long, ppc_cpu_t, int *); |
61 | static unsigned long insert_ds (unsigned long, long, int, const char **); | 60 | static unsigned long insert_esync (unsigned long, long, ppc_cpu_t, const char **); |
62 | static long extract_ds (unsigned long, int, int *); | 61 | static unsigned long insert_dcmxs (unsigned long, long, ppc_cpu_t, const char **); |
63 | static unsigned long insert_de (unsigned long, long, int, const char **); | 62 | static long extract_dcmxs (unsigned long, ppc_cpu_t, int *); |
64 | static long extract_de (unsigned long, int, int *); | 63 | static unsigned long insert_dxd (unsigned long, long, ppc_cpu_t, const char **); |
65 | static unsigned long insert_des (unsigned long, long, int, const char **); | 64 | static long extract_dxd (unsigned long, ppc_cpu_t, int *); |
66 | static long extract_des (unsigned long, int, int *); | 65 | static unsigned long insert_dxdn (unsigned long, long, ppc_cpu_t, const char **); |
67 | static unsigned long insert_fxm (unsigned long, long, int, const char **); | 66 | static long extract_dxdn (unsigned long, ppc_cpu_t, int *); |
68 | static long extract_fxm (unsigned long, int, int *); | 67 | static unsigned long insert_fxm (unsigned long, long, ppc_cpu_t, const char **); |
69 | static unsigned long insert_li (unsigned long, long, int, const char **); | 68 | static long extract_fxm (unsigned long, ppc_cpu_t, int *); |
70 | static long extract_li (unsigned long, int, int *); | 69 | static unsigned long insert_li20 (unsigned long, long, ppc_cpu_t, const char **); |
71 | static unsigned long insert_mbe (unsigned long, long, int, const char **); | 70 | static long extract_li20 (unsigned long, ppc_cpu_t, int *); |
72 | static long extract_mbe (unsigned long, int, int *); | 71 | static unsigned long insert_ls (unsigned long, long, ppc_cpu_t, const char **); |
73 | static unsigned long insert_mb6 (unsigned long, long, int, const char **); | 72 | static unsigned long insert_mbe (unsigned long, long, ppc_cpu_t, const char **); |
74 | static long extract_mb6 (unsigned long, int, int *); | 73 | static long extract_mbe (unsigned long, ppc_cpu_t, int *); |
75 | static unsigned long insert_nb (unsigned long, long, int, const char **); | 74 | static unsigned long insert_mb6 (unsigned long, long, ppc_cpu_t, const char **); |
76 | static long extract_nb (unsigned long, int, int *); | 75 | static long extract_mb6 (unsigned long, ppc_cpu_t, int *); |
77 | static unsigned long insert_nsi (unsigned long, long, int, const char **); | 76 | static long extract_nb (unsigned long, ppc_cpu_t, int *); |
78 | static long extract_nsi (unsigned long, int, int *); | 77 | static unsigned long insert_nbi (unsigned long, long, ppc_cpu_t, const char **); |
79 | static unsigned long insert_ral (unsigned long, long, int, const char **); | 78 | static unsigned long insert_nsi (unsigned long, long, ppc_cpu_t, const char **); |
80 | static unsigned long insert_ram (unsigned long, long, int, const char **); | 79 | static long extract_nsi (unsigned long, ppc_cpu_t, int *); |
81 | static unsigned long insert_raq (unsigned long, long, int, const char **); | 80 | static unsigned long insert_oimm (unsigned long, long, ppc_cpu_t, const char **); |
82 | static unsigned long insert_ras (unsigned long, long, int, const char **); | 81 | static long extract_oimm (unsigned long, ppc_cpu_t, int *); |
83 | static unsigned long insert_rbs (unsigned long, long, int, const char **); | 82 | static unsigned long insert_ral (unsigned long, long, ppc_cpu_t, const char **); |
84 | static long extract_rbs (unsigned long, int, int *); | 83 | static unsigned long insert_ram (unsigned long, long, ppc_cpu_t, const char **); |
85 | static unsigned long insert_rsq (unsigned long, long, int, const char **); | 84 | static unsigned long insert_raq (unsigned long, long, ppc_cpu_t, const char **); |
86 | static unsigned long insert_rtq (unsigned long, long, int, const char **); | 85 | static unsigned long insert_ras (unsigned long, long, ppc_cpu_t, const char **); |
87 | static unsigned long insert_sh6 (unsigned long, long, int, const char **); | 86 | static unsigned long insert_rbs (unsigned long, long, ppc_cpu_t, const char **); |
88 | static long extract_sh6 (unsigned long, int, int *); | 87 | static long extract_rbs (unsigned long, ppc_cpu_t, int *); |
89 | static unsigned long insert_spr (unsigned long, long, int, const char **); | 88 | static unsigned long insert_rbx (unsigned long, long, ppc_cpu_t, const char **); |
90 | static long extract_spr (unsigned long, int, int *); | 89 | static unsigned long insert_rx (unsigned long, long, ppc_cpu_t, const char **); |
91 | static unsigned long insert_sprg (unsigned long, long, int, const char **); | 90 | static long extract_rx (unsigned long, ppc_cpu_t, int *); |
92 | static long extract_sprg (unsigned long, int, int *); | 91 | static unsigned long insert_ry (unsigned long, long, ppc_cpu_t, const char **); |
93 | static unsigned long insert_tbr (unsigned long, long, int, const char **); | 92 | static long extract_ry (unsigned long, ppc_cpu_t, int *); |
94 | static long extract_tbr (unsigned long, int, int *); | 93 | static unsigned long insert_sh6 (unsigned long, long, ppc_cpu_t, const char **); |
95 | static unsigned long insert_ev2 (unsigned long, long, int, const char **); | 94 | static long extract_sh6 (unsigned long, ppc_cpu_t, int *); |
96 | static long extract_ev2 (unsigned long, int, int *); | 95 | static unsigned long insert_sci8 (unsigned long, long, ppc_cpu_t, const char **); |
97 | static unsigned long insert_ev4 (unsigned long, long, int, const char **); | 96 | static long extract_sci8 (unsigned long, ppc_cpu_t, int *); |
98 | static long extract_ev4 (unsigned long, int, int *); | 97 | static unsigned long insert_sci8n (unsigned long, long, ppc_cpu_t, const char **); |
99 | static unsigned long insert_ev8 (unsigned long, long, int, const char **); | 98 | static long extract_sci8n (unsigned long, ppc_cpu_t, int *); |
100 | static long extract_ev8 (unsigned long, int, int *); | 99 | static unsigned long insert_sd4h (unsigned long, long, ppc_cpu_t, const char **); |
100 | static long extract_sd4h (unsigned long, ppc_cpu_t, int *); | ||
101 | static unsigned long insert_sd4w (unsigned long, long, ppc_cpu_t, const char **); | ||
102 | static long extract_sd4w (unsigned long, ppc_cpu_t, int *); | ||
103 | static unsigned long insert_spr (unsigned long, long, ppc_cpu_t, const char **); | ||
104 | static long extract_spr (unsigned long, ppc_cpu_t, int *); | ||
105 | static unsigned long insert_sprg (unsigned long, long, ppc_cpu_t, const char **); | ||
106 | static long extract_sprg (unsigned long, ppc_cpu_t, int *); | ||
107 | static unsigned long insert_tbr (unsigned long, long, ppc_cpu_t, const char **); | ||
108 | static long extract_tbr (unsigned long, ppc_cpu_t, int *); | ||
109 | static unsigned long insert_xt6 (unsigned long, long, ppc_cpu_t, const char **); | ||
110 | static long extract_xt6 (unsigned long, ppc_cpu_t, int *); | ||
111 | static unsigned long insert_xtq6 (unsigned long, long, ppc_cpu_t, const char **); | ||
112 | static long extract_xtq6 (unsigned long, ppc_cpu_t, int *); | ||
113 | static unsigned long insert_xa6 (unsigned long, long, ppc_cpu_t, const char **); | ||
114 | static long extract_xa6 (unsigned long, ppc_cpu_t, int *); | ||
115 | static unsigned long insert_xb6 (unsigned long, long, ppc_cpu_t, const char **); | ||
116 | static long extract_xb6 (unsigned long, ppc_cpu_t, int *); | ||
117 | static unsigned long insert_xb6s (unsigned long, long, ppc_cpu_t, const char **); | ||
118 | static long extract_xb6s (unsigned long, ppc_cpu_t, int *); | ||
119 | static unsigned long insert_xc6 (unsigned long, long, ppc_cpu_t, const char **); | ||
120 | static long extract_xc6 (unsigned long, ppc_cpu_t, int *); | ||
121 | static unsigned long insert_dm (unsigned long, long, ppc_cpu_t, const char **); | ||
122 | static long extract_dm (unsigned long, ppc_cpu_t, int *); | ||
123 | static unsigned long insert_vlesi (unsigned long, long, ppc_cpu_t, const char **); | ||
124 | static long extract_vlesi (unsigned long, ppc_cpu_t, int *); | ||
125 | static unsigned long insert_vlensi (unsigned long, long, ppc_cpu_t, const char **); | ||
126 | static long extract_vlensi (unsigned long, ppc_cpu_t, int *); | ||
127 | static unsigned long insert_vleui (unsigned long, long, ppc_cpu_t, const char **); | ||
128 | static long extract_vleui (unsigned long, ppc_cpu_t, int *); | ||
129 | static unsigned long insert_vleil (unsigned long, long, ppc_cpu_t, const char **); | ||
130 | static long extract_vleil (unsigned long, ppc_cpu_t, int *); | ||
101 | 131 | ||
102 | /* The operands table. | 132 | /* The operands table. |
103 | 133 | ||
104 | The fields are bits, shift, insert, extract, flags. | 134 | The fields are bitm, shift, insert, extract, flags. |
105 | 135 | ||
106 | We used to put parens around the various additions, like the one | 136 | We used to put parens around the various additions, like the one |
107 | for BA just below. However, that caused trouble with feeble | 137 | for BA just below. However, that caused trouble with feeble |
@@ -119,493 +149,934 @@ const struct powerpc_operand powerpc_operands[] = | |||
119 | 149 | ||
120 | /* The BA field in an XL form instruction. */ | 150 | /* The BA field in an XL form instruction. */ |
121 | #define BA UNUSED + 1 | 151 | #define BA UNUSED + 1 |
122 | #define BA_MASK (0x1f << 16) | 152 | /* The BI field in a B form or XL form instruction. */ |
123 | { 5, 16, NULL, NULL, PPC_OPERAND_CR }, | 153 | #define BI BA |
154 | #define BI_MASK (0x1f << 16) | ||
155 | { 0x1f, 16, NULL, NULL, PPC_OPERAND_CR_BIT }, | ||
124 | 156 | ||
125 | /* The BA field in an XL form instruction when it must be the same | 157 | /* The BA field in an XL form instruction when it must be the same |
126 | as the BT field in the same instruction. */ | 158 | as the BT field in the same instruction. */ |
127 | #define BAT BA + 1 | 159 | #define BAT BA + 1 |
128 | { 5, 16, insert_bat, extract_bat, PPC_OPERAND_FAKE }, | 160 | { 0x1f, 16, insert_bat, extract_bat, PPC_OPERAND_FAKE }, |
129 | 161 | ||
130 | /* The BB field in an XL form instruction. */ | 162 | /* The BB field in an XL form instruction. */ |
131 | #define BB BAT + 1 | 163 | #define BB BAT + 1 |
132 | #define BB_MASK (0x1f << 11) | 164 | #define BB_MASK (0x1f << 11) |
133 | { 5, 11, NULL, NULL, PPC_OPERAND_CR }, | 165 | { 0x1f, 11, NULL, NULL, PPC_OPERAND_CR_BIT }, |
134 | 166 | ||
135 | /* The BB field in an XL form instruction when it must be the same | 167 | /* The BB field in an XL form instruction when it must be the same |
136 | as the BA field in the same instruction. */ | 168 | as the BA field in the same instruction. */ |
137 | #define BBA BB + 1 | 169 | #define BBA BB + 1 |
138 | { 5, 11, insert_bba, extract_bba, PPC_OPERAND_FAKE }, | 170 | /* The VB field in a VX form instruction when it must be the same |
171 | as the VA field in the same instruction. */ | ||
172 | #define VBA BBA | ||
173 | { 0x1f, 11, insert_bba, extract_bba, PPC_OPERAND_FAKE }, | ||
139 | 174 | ||
140 | /* The BD field in a B form instruction. The lower two bits are | 175 | /* The BD field in a B form instruction. The lower two bits are |
141 | forced to zero. */ | 176 | forced to zero. */ |
142 | #define BD BBA + 1 | 177 | #define BD BBA + 1 |
143 | { 16, 0, insert_bd, extract_bd, PPC_OPERAND_RELATIVE | PPC_OPERAND_SIGNED }, | 178 | { 0xfffc, 0, NULL, NULL, PPC_OPERAND_RELATIVE | PPC_OPERAND_SIGNED }, |
144 | 179 | ||
145 | /* The BD field in a B form instruction when absolute addressing is | 180 | /* The BD field in a B form instruction when absolute addressing is |
146 | used. */ | 181 | used. */ |
147 | #define BDA BD + 1 | 182 | #define BDA BD + 1 |
148 | { 16, 0, insert_bd, extract_bd, PPC_OPERAND_ABSOLUTE | PPC_OPERAND_SIGNED }, | 183 | { 0xfffc, 0, NULL, NULL, PPC_OPERAND_ABSOLUTE | PPC_OPERAND_SIGNED }, |
149 | 184 | ||
150 | /* The BD field in a B form instruction when the - modifier is used. | 185 | /* The BD field in a B form instruction when the - modifier is used. |
151 | This sets the y bit of the BO field appropriately. */ | 186 | This sets the y bit of the BO field appropriately. */ |
152 | #define BDM BDA + 1 | 187 | #define BDM BDA + 1 |
153 | { 16, 0, insert_bdm, extract_bdm, | 188 | { 0xfffc, 0, insert_bdm, extract_bdm, |
154 | PPC_OPERAND_RELATIVE | PPC_OPERAND_SIGNED }, | 189 | PPC_OPERAND_RELATIVE | PPC_OPERAND_SIGNED }, |
155 | 190 | ||
156 | /* The BD field in a B form instruction when the - modifier is used | 191 | /* The BD field in a B form instruction when the - modifier is used |
157 | and absolute address is used. */ | 192 | and absolute address is used. */ |
158 | #define BDMA BDM + 1 | 193 | #define BDMA BDM + 1 |
159 | { 16, 0, insert_bdm, extract_bdm, | 194 | { 0xfffc, 0, insert_bdm, extract_bdm, |
160 | PPC_OPERAND_ABSOLUTE | PPC_OPERAND_SIGNED }, | 195 | PPC_OPERAND_ABSOLUTE | PPC_OPERAND_SIGNED }, |
161 | 196 | ||
162 | /* The BD field in a B form instruction when the + modifier is used. | 197 | /* The BD field in a B form instruction when the + modifier is used. |
163 | This sets the y bit of the BO field appropriately. */ | 198 | This sets the y bit of the BO field appropriately. */ |
164 | #define BDP BDMA + 1 | 199 | #define BDP BDMA + 1 |
165 | { 16, 0, insert_bdp, extract_bdp, | 200 | { 0xfffc, 0, insert_bdp, extract_bdp, |
166 | PPC_OPERAND_RELATIVE | PPC_OPERAND_SIGNED }, | 201 | PPC_OPERAND_RELATIVE | PPC_OPERAND_SIGNED }, |
167 | 202 | ||
168 | /* The BD field in a B form instruction when the + modifier is used | 203 | /* The BD field in a B form instruction when the + modifier is used |
169 | and absolute addressing is used. */ | 204 | and absolute addressing is used. */ |
170 | #define BDPA BDP + 1 | 205 | #define BDPA BDP + 1 |
171 | { 16, 0, insert_bdp, extract_bdp, | 206 | { 0xfffc, 0, insert_bdp, extract_bdp, |
172 | PPC_OPERAND_ABSOLUTE | PPC_OPERAND_SIGNED }, | 207 | PPC_OPERAND_ABSOLUTE | PPC_OPERAND_SIGNED }, |
173 | 208 | ||
174 | /* The BF field in an X or XL form instruction. */ | 209 | /* The BF field in an X or XL form instruction. */ |
175 | #define BF BDPA + 1 | 210 | #define BF BDPA + 1 |
176 | { 3, 23, NULL, NULL, PPC_OPERAND_CR }, | 211 | /* The CRFD field in an X form instruction. */ |
212 | #define CRFD BF | ||
213 | /* The CRD field in an XL form instruction. */ | ||
214 | #define CRD BF | ||
215 | { 0x7, 23, NULL, NULL, PPC_OPERAND_CR_REG }, | ||
216 | |||
217 | /* The BF field in an X or XL form instruction. */ | ||
218 | #define BFF BF + 1 | ||
219 | { 0x7, 23, NULL, NULL, 0 }, | ||
177 | 220 | ||
178 | /* An optional BF field. This is used for comparison instructions, | 221 | /* An optional BF field. This is used for comparison instructions, |
179 | in which an omitted BF field is taken as zero. */ | 222 | in which an omitted BF field is taken as zero. */ |
180 | #define OBF BF + 1 | 223 | #define OBF BFF + 1 |
181 | { 3, 23, NULL, NULL, PPC_OPERAND_CR | PPC_OPERAND_OPTIONAL }, | 224 | { 0x7, 23, NULL, NULL, PPC_OPERAND_CR_REG | PPC_OPERAND_OPTIONAL }, |
182 | 225 | ||
183 | /* The BFA field in an X or XL form instruction. */ | 226 | /* The BFA field in an X or XL form instruction. */ |
184 | #define BFA OBF + 1 | 227 | #define BFA OBF + 1 |
185 | { 3, 18, NULL, NULL, PPC_OPERAND_CR }, | 228 | { 0x7, 18, NULL, NULL, PPC_OPERAND_CR_REG }, |
186 | |||
187 | /* The BI field in a B form or XL form instruction. */ | ||
188 | #define BI BFA + 1 | ||
189 | #define BI_MASK (0x1f << 16) | ||
190 | { 5, 16, NULL, NULL, PPC_OPERAND_CR }, | ||
191 | 229 | ||
192 | /* The BO field in a B form instruction. Certain values are | 230 | /* The BO field in a B form instruction. Certain values are |
193 | illegal. */ | 231 | illegal. */ |
194 | #define BO BI + 1 | 232 | #define BO BFA + 1 |
195 | #define BO_MASK (0x1f << 21) | 233 | #define BO_MASK (0x1f << 21) |
196 | { 5, 21, insert_bo, extract_bo, 0 }, | 234 | { 0x1f, 21, insert_bo, extract_bo, 0 }, |
197 | 235 | ||
198 | /* The BO field in a B form instruction when the + or - modifier is | 236 | /* The BO field in a B form instruction when the + or - modifier is |
199 | used. This is like the BO field, but it must be even. */ | 237 | used. This is like the BO field, but it must be even. */ |
200 | #define BOE BO + 1 | 238 | #define BOE BO + 1 |
201 | { 5, 21, insert_boe, extract_boe, 0 }, | 239 | { 0x1e, 21, insert_boe, extract_boe, 0 }, |
240 | |||
241 | /* The RM field in an X form instruction. */ | ||
242 | #define RM BOE + 1 | ||
243 | { 0x3, 11, NULL, NULL, 0 }, | ||
202 | 244 | ||
203 | #define BH BOE + 1 | 245 | #define BH RM + 1 |
204 | { 2, 11, NULL, NULL, PPC_OPERAND_OPTIONAL }, | 246 | { 0x3, 11, NULL, NULL, PPC_OPERAND_OPTIONAL }, |
205 | 247 | ||
206 | /* The BT field in an X or XL form instruction. */ | 248 | /* The BT field in an X or XL form instruction. */ |
207 | #define BT BH + 1 | 249 | #define BT BH + 1 |
208 | { 5, 21, NULL, NULL, PPC_OPERAND_CR }, | 250 | { 0x1f, 21, NULL, NULL, PPC_OPERAND_CR_BIT }, |
251 | |||
252 | /* The BI16 field in a BD8 form instruction. */ | ||
253 | #define BI16 BT + 1 | ||
254 | { 0x3, 8, NULL, NULL, PPC_OPERAND_CR_BIT }, | ||
255 | |||
256 | /* The BI32 field in a BD15 form instruction. */ | ||
257 | #define BI32 BI16 + 1 | ||
258 | { 0xf, 16, NULL, NULL, PPC_OPERAND_CR_BIT }, | ||
259 | |||
260 | /* The BO32 field in a BD15 form instruction. */ | ||
261 | #define BO32 BI32 + 1 | ||
262 | { 0x3, 20, NULL, NULL, 0 }, | ||
263 | |||
264 | /* The B8 field in a BD8 form instruction. */ | ||
265 | #define B8 BO32 + 1 | ||
266 | { 0x1fe, -1, NULL, NULL, PPC_OPERAND_RELATIVE | PPC_OPERAND_SIGNED }, | ||
267 | |||
268 | /* The B15 field in a BD15 form instruction. The lowest bit is | ||
269 | forced to zero. */ | ||
270 | #define B15 B8 + 1 | ||
271 | { 0xfffe, 0, NULL, NULL, PPC_OPERAND_RELATIVE | PPC_OPERAND_SIGNED }, | ||
272 | |||
273 | /* The B24 field in a BD24 form instruction. The lowest bit is | ||
274 | forced to zero. */ | ||
275 | #define B24 B15 + 1 | ||
276 | { 0x1fffffe, 0, NULL, NULL, PPC_OPERAND_RELATIVE | PPC_OPERAND_SIGNED }, | ||
209 | 277 | ||
210 | /* The condition register number portion of the BI field in a B form | 278 | /* The condition register number portion of the BI field in a B form |
211 | or XL form instruction. This is used for the extended | 279 | or XL form instruction. This is used for the extended |
212 | conditional branch mnemonics, which set the lower two bits of the | 280 | conditional branch mnemonics, which set the lower two bits of the |
213 | BI field. This field is optional. */ | 281 | BI field. This field is optional. */ |
214 | #define CR BT + 1 | 282 | #define CR B24 + 1 |
215 | { 3, 18, NULL, NULL, PPC_OPERAND_CR | PPC_OPERAND_OPTIONAL }, | 283 | { 0x7, 18, NULL, NULL, PPC_OPERAND_CR_REG | PPC_OPERAND_OPTIONAL }, |
216 | 284 | ||
217 | /* The CRB field in an X form instruction. */ | 285 | /* The CRB field in an X form instruction. */ |
218 | #define CRB CR + 1 | 286 | #define CRB CR + 1 |
219 | { 5, 6, NULL, NULL, 0 }, | 287 | /* The MB field in an M form instruction. */ |
288 | #define MB CRB | ||
289 | #define MB_MASK (0x1f << 6) | ||
290 | { 0x1f, 6, NULL, NULL, 0 }, | ||
220 | 291 | ||
221 | /* The CRFD field in an X form instruction. */ | 292 | /* The CRD32 field in an XL form instruction. */ |
222 | #define CRFD CRB + 1 | 293 | #define CRD32 CRB + 1 |
223 | { 3, 23, NULL, NULL, PPC_OPERAND_CR }, | 294 | { 0x3, 21, NULL, NULL, PPC_OPERAND_CR_REG }, |
224 | 295 | ||
225 | /* The CRFS field in an X form instruction. */ | 296 | /* The CRFS field in an X form instruction. */ |
226 | #define CRFS CRFD + 1 | 297 | #define CRFS CRD32 + 1 |
227 | { 3, 0, NULL, NULL, PPC_OPERAND_CR }, | 298 | { 0x7, 0, NULL, NULL, PPC_OPERAND_CR_REG }, |
299 | |||
300 | #define CRS CRFS + 1 | ||
301 | { 0x3, 18, NULL, NULL, PPC_OPERAND_CR_REG | PPC_OPERAND_OPTIONAL }, | ||
228 | 302 | ||
229 | /* The CT field in an X form instruction. */ | 303 | /* The CT field in an X form instruction. */ |
230 | #define CT CRFS + 1 | 304 | #define CT CRS + 1 |
231 | { 5, 21, NULL, NULL, PPC_OPERAND_OPTIONAL }, | 305 | /* The MO field in an mbar instruction. */ |
306 | #define MO CT | ||
307 | { 0x1f, 21, NULL, NULL, PPC_OPERAND_OPTIONAL }, | ||
232 | 308 | ||
233 | /* The D field in a D form instruction. This is a displacement off | 309 | /* The D field in a D form instruction. This is a displacement off |
234 | a register, and implies that the next operand is a register in | 310 | a register, and implies that the next operand is a register in |
235 | parentheses. */ | 311 | parentheses. */ |
236 | #define D CT + 1 | 312 | #define D CT + 1 |
237 | { 16, 0, NULL, NULL, PPC_OPERAND_PARENS | PPC_OPERAND_SIGNED }, | 313 | { 0xffff, 0, NULL, NULL, PPC_OPERAND_PARENS | PPC_OPERAND_SIGNED }, |
238 | 314 | ||
239 | /* The DE field in a DE form instruction. This is like D, but is 12 | 315 | /* The D8 field in a D form instruction. This is a displacement off |
240 | bits only. */ | 316 | a register, and implies that the next operand is a register in |
241 | #define DE D + 1 | 317 | parentheses. */ |
242 | { 14, 0, insert_de, extract_de, PPC_OPERAND_PARENS }, | 318 | #define D8 D + 1 |
319 | { 0xff, 0, NULL, NULL, PPC_OPERAND_PARENS | PPC_OPERAND_SIGNED }, | ||
320 | |||
321 | /* The DCMX field in an X form instruction. */ | ||
322 | #define DCMX D8 + 1 | ||
323 | { 0x7f, 16, NULL, NULL, 0 }, | ||
243 | 324 | ||
244 | /* The DES field in a DES form instruction. This is like DS, but is 14 | 325 | /* The split DCMX field in an X form instruction. */ |
245 | bits only (12 stored.) */ | 326 | #define DCMXS DCMX + 1 |
246 | #define DES DE + 1 | 327 | { 0x7f, PPC_OPSHIFT_INV, insert_dcmxs, extract_dcmxs, 0 }, |
247 | { 14, 0, insert_des, extract_des, PPC_OPERAND_PARENS | PPC_OPERAND_SIGNED }, | ||
248 | 328 | ||
249 | /* The DQ field in a DQ form instruction. This is like D, but the | 329 | /* The DQ field in a DQ form instruction. This is like D, but the |
250 | lower four bits are forced to zero. */ | 330 | lower four bits are forced to zero. */ |
251 | #define DQ DES + 1 | 331 | #define DQ DCMXS + 1 |
252 | { 16, 0, insert_dq, extract_dq, | 332 | { 0xfff0, 0, NULL, NULL, |
253 | PPC_OPERAND_PARENS | PPC_OPERAND_SIGNED | PPC_OPERAND_DQ }, | 333 | PPC_OPERAND_PARENS | PPC_OPERAND_SIGNED | PPC_OPERAND_DQ }, |
254 | 334 | ||
255 | /* The DS field in a DS form instruction. This is like D, but the | 335 | /* The DS field in a DS form instruction. This is like D, but the |
256 | lower two bits are forced to zero. */ | 336 | lower two bits are forced to zero. */ |
257 | #define DS DQ + 1 | 337 | #define DS DQ + 1 |
258 | { 16, 0, insert_ds, extract_ds, | 338 | { 0xfffc, 0, NULL, NULL, |
259 | PPC_OPERAND_PARENS | PPC_OPERAND_SIGNED | PPC_OPERAND_DS }, | 339 | PPC_OPERAND_PARENS | PPC_OPERAND_SIGNED | PPC_OPERAND_DS }, |
340 | |||
341 | /* The DUIS or BHRBE fields in a XFX form instruction, 10 bits | ||
342 | unsigned imediate */ | ||
343 | #define DUIS DS + 1 | ||
344 | #define BHRBE DUIS | ||
345 | { 0x3ff, 11, NULL, NULL, 0 }, | ||
346 | |||
347 | /* The split D field in a DX form instruction. */ | ||
348 | #define DXD DUIS + 1 | ||
349 | { 0xffff, PPC_OPSHIFT_INV, insert_dxd, extract_dxd, | ||
350 | PPC_OPERAND_SIGNED | PPC_OPERAND_SIGNOPT}, | ||
351 | |||
352 | /* The split ND field in a DX form instruction. | ||
353 | This is the same as the DX field, only negated. */ | ||
354 | #define NDXD DXD + 1 | ||
355 | { 0xffff, PPC_OPSHIFT_INV, insert_dxdn, extract_dxdn, | ||
356 | PPC_OPERAND_NEGATIVE | PPC_OPERAND_SIGNED | PPC_OPERAND_SIGNOPT}, | ||
260 | 357 | ||
261 | /* The E field in a wrteei instruction. */ | 358 | /* The E field in a wrteei instruction. */ |
262 | #define E DS + 1 | 359 | /* And the W bit in the pair singles instructions. */ |
263 | { 1, 15, NULL, NULL, 0 }, | 360 | /* And the ST field in a VX form instruction. */ |
361 | #define E NDXD + 1 | ||
362 | #define PSW E | ||
363 | #define ST E | ||
364 | { 0x1, 15, NULL, NULL, 0 }, | ||
264 | 365 | ||
265 | /* The FL1 field in a POWER SC form instruction. */ | 366 | /* The FL1 field in a POWER SC form instruction. */ |
266 | #define FL1 E + 1 | 367 | #define FL1 E + 1 |
267 | { 4, 12, NULL, NULL, 0 }, | 368 | /* The U field in an X form instruction. */ |
369 | #define U FL1 | ||
370 | { 0xf, 12, NULL, NULL, 0 }, | ||
268 | 371 | ||
269 | /* The FL2 field in a POWER SC form instruction. */ | 372 | /* The FL2 field in a POWER SC form instruction. */ |
270 | #define FL2 FL1 + 1 | 373 | #define FL2 FL1 + 1 |
271 | { 3, 2, NULL, NULL, 0 }, | 374 | { 0x7, 2, NULL, NULL, 0 }, |
272 | 375 | ||
273 | /* The FLM field in an XFL form instruction. */ | 376 | /* The FLM field in an XFL form instruction. */ |
274 | #define FLM FL2 + 1 | 377 | #define FLM FL2 + 1 |
275 | { 8, 17, NULL, NULL, 0 }, | 378 | { 0xff, 17, NULL, NULL, 0 }, |
276 | 379 | ||
277 | /* The FRA field in an X or A form instruction. */ | 380 | /* The FRA field in an X or A form instruction. */ |
278 | #define FRA FLM + 1 | 381 | #define FRA FLM + 1 |
279 | #define FRA_MASK (0x1f << 16) | 382 | #define FRA_MASK (0x1f << 16) |
280 | { 5, 16, NULL, NULL, PPC_OPERAND_FPR }, | 383 | { 0x1f, 16, NULL, NULL, PPC_OPERAND_FPR }, |
384 | |||
385 | /* The FRAp field of DFP instructions. */ | ||
386 | #define FRAp FRA + 1 | ||
387 | { 0x1e, 16, NULL, NULL, PPC_OPERAND_FPR }, | ||
281 | 388 | ||
282 | /* The FRB field in an X or A form instruction. */ | 389 | /* The FRB field in an X or A form instruction. */ |
283 | #define FRB FRA + 1 | 390 | #define FRB FRAp + 1 |
284 | #define FRB_MASK (0x1f << 11) | 391 | #define FRB_MASK (0x1f << 11) |
285 | { 5, 11, NULL, NULL, PPC_OPERAND_FPR }, | 392 | { 0x1f, 11, NULL, NULL, PPC_OPERAND_FPR }, |
393 | |||
394 | /* The FRBp field of DFP instructions. */ | ||
395 | #define FRBp FRB + 1 | ||
396 | { 0x1e, 11, NULL, NULL, PPC_OPERAND_FPR }, | ||
286 | 397 | ||
287 | /* The FRC field in an A form instruction. */ | 398 | /* The FRC field in an A form instruction. */ |
288 | #define FRC FRB + 1 | 399 | #define FRC FRBp + 1 |
289 | #define FRC_MASK (0x1f << 6) | 400 | #define FRC_MASK (0x1f << 6) |
290 | { 5, 6, NULL, NULL, PPC_OPERAND_FPR }, | 401 | { 0x1f, 6, NULL, NULL, PPC_OPERAND_FPR }, |
291 | 402 | ||
292 | /* The FRS field in an X form instruction or the FRT field in a D, X | 403 | /* The FRS field in an X form instruction or the FRT field in a D, X |
293 | or A form instruction. */ | 404 | or A form instruction. */ |
294 | #define FRS FRC + 1 | 405 | #define FRS FRC + 1 |
295 | #define FRT FRS | 406 | #define FRT FRS |
296 | { 5, 21, NULL, NULL, PPC_OPERAND_FPR }, | 407 | { 0x1f, 21, NULL, NULL, PPC_OPERAND_FPR }, |
408 | |||
409 | /* The FRSp field of stfdp or the FRTp field of lfdp and DFP | ||
410 | instructions. */ | ||
411 | #define FRSp FRS + 1 | ||
412 | #define FRTp FRSp | ||
413 | { 0x1e, 21, NULL, NULL, PPC_OPERAND_FPR }, | ||
297 | 414 | ||
298 | /* The FXM field in an XFX instruction. */ | 415 | /* The FXM field in an XFX instruction. */ |
299 | #define FXM FRS + 1 | 416 | #define FXM FRSp + 1 |
300 | #define FXM_MASK (0xff << 12) | 417 | { 0xff, 12, insert_fxm, extract_fxm, 0 }, |
301 | { 8, 12, insert_fxm, extract_fxm, 0 }, | ||
302 | 418 | ||
303 | /* Power4 version for mfcr. */ | 419 | /* Power4 version for mfcr. */ |
304 | #define FXM4 FXM + 1 | 420 | #define FXM4 FXM + 1 |
305 | { 8, 12, insert_fxm, extract_fxm, PPC_OPERAND_OPTIONAL }, | 421 | { 0xff, 12, insert_fxm, extract_fxm, |
422 | PPC_OPERAND_OPTIONAL | PPC_OPERAND_OPTIONAL_VALUE}, | ||
423 | /* If the FXM4 operand is ommitted, use the sentinel value -1. */ | ||
424 | { -1, -1, NULL, NULL, 0}, | ||
425 | |||
426 | /* The IMM20 field in an LI instruction. */ | ||
427 | #define IMM20 FXM4 + 2 | ||
428 | { 0xfffff, PPC_OPSHIFT_INV, insert_li20, extract_li20, PPC_OPERAND_SIGNED}, | ||
306 | 429 | ||
307 | /* The L field in a D or X form instruction. */ | 430 | /* The L field in a D or X form instruction. */ |
308 | #define L FXM4 + 1 | 431 | #define L IMM20 + 1 |
309 | { 1, 21, NULL, NULL, PPC_OPERAND_OPTIONAL }, | 432 | { 0x1, 21, NULL, NULL, 0 }, |
433 | |||
434 | /* The optional L field in tlbie and tlbiel instructions. */ | ||
435 | #define LOPT L + 1 | ||
436 | /* The R field in a HTM X form instruction. */ | ||
437 | #define HTM_R LOPT | ||
438 | { 0x1, 21, NULL, NULL, PPC_OPERAND_OPTIONAL }, | ||
439 | |||
440 | /* The optional (for 32-bit) L field in cmp[l][i] instructions. */ | ||
441 | #define L32OPT LOPT + 1 | ||
442 | { 0x1, 21, NULL, NULL, PPC_OPERAND_OPTIONAL | PPC_OPERAND_OPTIONAL32 }, | ||
443 | |||
444 | /* The L field in dcbf instruction. */ | ||
445 | #define L2OPT L32OPT + 1 | ||
446 | { 0x3, 21, NULL, NULL, PPC_OPERAND_OPTIONAL }, | ||
310 | 447 | ||
311 | /* The LEV field in a POWER SVC form instruction. */ | 448 | /* The LEV field in a POWER SVC form instruction. */ |
312 | #define SVC_LEV L + 1 | 449 | #define SVC_LEV L2OPT + 1 |
313 | { 7, 5, NULL, NULL, 0 }, | 450 | { 0x7f, 5, NULL, NULL, 0 }, |
314 | 451 | ||
315 | /* The LEV field in an SC form instruction. */ | 452 | /* The LEV field in an SC form instruction. */ |
316 | #define LEV SVC_LEV + 1 | 453 | #define LEV SVC_LEV + 1 |
317 | { 7, 5, NULL, NULL, PPC_OPERAND_OPTIONAL }, | 454 | { 0x7f, 5, NULL, NULL, PPC_OPERAND_OPTIONAL }, |
318 | 455 | ||
319 | /* The LI field in an I form instruction. The lower two bits are | 456 | /* The LI field in an I form instruction. The lower two bits are |
320 | forced to zero. */ | 457 | forced to zero. */ |
321 | #define LI LEV + 1 | 458 | #define LI LEV + 1 |
322 | { 26, 0, insert_li, extract_li, PPC_OPERAND_RELATIVE | PPC_OPERAND_SIGNED }, | 459 | { 0x3fffffc, 0, NULL, NULL, PPC_OPERAND_RELATIVE | PPC_OPERAND_SIGNED }, |
323 | 460 | ||
324 | /* The LI field in an I form instruction when used as an absolute | 461 | /* The LI field in an I form instruction when used as an absolute |
325 | address. */ | 462 | address. */ |
326 | #define LIA LI + 1 | 463 | #define LIA LI + 1 |
327 | { 26, 0, insert_li, extract_li, PPC_OPERAND_ABSOLUTE | PPC_OPERAND_SIGNED }, | 464 | { 0x3fffffc, 0, NULL, NULL, PPC_OPERAND_ABSOLUTE | PPC_OPERAND_SIGNED }, |
328 | 465 | ||
329 | /* The LS field in an X (sync) form instruction. */ | 466 | /* The LS or WC field in an X (sync or wait) form instruction. */ |
330 | #define LS LIA + 1 | 467 | #define LS LIA + 1 |
331 | { 2, 21, NULL, NULL, PPC_OPERAND_OPTIONAL }, | 468 | #define WC LS |
332 | 469 | { 0x3, 21, insert_ls, NULL, PPC_OPERAND_OPTIONAL }, | |
333 | /* The MB field in an M form instruction. */ | ||
334 | #define MB LS + 1 | ||
335 | #define MB_MASK (0x1f << 6) | ||
336 | { 5, 6, NULL, NULL, 0 }, | ||
337 | 470 | ||
338 | /* The ME field in an M form instruction. */ | 471 | /* The ME field in an M form instruction. */ |
339 | #define ME MB + 1 | 472 | #define ME LS + 1 |
340 | #define ME_MASK (0x1f << 1) | 473 | #define ME_MASK (0x1f << 1) |
341 | { 5, 1, NULL, NULL, 0 }, | 474 | { 0x1f, 1, NULL, NULL, 0 }, |
342 | 475 | ||
343 | /* The MB and ME fields in an M form instruction expressed a single | 476 | /* The MB and ME fields in an M form instruction expressed a single |
344 | operand which is a bitmask indicating which bits to select. This | 477 | operand which is a bitmask indicating which bits to select. This |
345 | is a two operand form using PPC_OPERAND_NEXT. See the | 478 | is a two operand form using PPC_OPERAND_NEXT. See the |
346 | description in opcode/ppc.h for what this means. */ | 479 | description in opcode/ppc.h for what this means. */ |
347 | #define MBE ME + 1 | 480 | #define MBE ME + 1 |
348 | { 5, 6, NULL, NULL, PPC_OPERAND_OPTIONAL | PPC_OPERAND_NEXT }, | 481 | { 0x1f, 6, NULL, NULL, PPC_OPERAND_OPTIONAL | PPC_OPERAND_NEXT }, |
349 | { 32, 0, insert_mbe, extract_mbe, 0 }, | 482 | { -1, 0, insert_mbe, extract_mbe, 0 }, |
350 | 483 | ||
351 | /* The MB or ME field in an MD or MDS form instruction. The high | 484 | /* The MB or ME field in an MD or MDS form instruction. The high |
352 | bit is wrapped to the low end. */ | 485 | bit is wrapped to the low end. */ |
353 | #define MB6 MBE + 2 | 486 | #define MB6 MBE + 2 |
354 | #define ME6 MB6 | 487 | #define ME6 MB6 |
355 | #define MB6_MASK (0x3f << 5) | 488 | #define MB6_MASK (0x3f << 5) |
356 | { 6, 5, insert_mb6, extract_mb6, 0 }, | 489 | { 0x3f, 5, insert_mb6, extract_mb6, 0 }, |
357 | |||
358 | /* The MO field in an mbar instruction. */ | ||
359 | #define MO MB6 + 1 | ||
360 | { 5, 21, NULL, NULL, PPC_OPERAND_OPTIONAL }, | ||
361 | 490 | ||
362 | /* The NB field in an X form instruction. The value 32 is stored as | 491 | /* The NB field in an X form instruction. The value 32 is stored as |
363 | 0. */ | 492 | 0. */ |
364 | #define NB MO + 1 | 493 | #define NB MB6 + 1 |
365 | { 6, 11, insert_nb, extract_nb, 0 }, | 494 | { 0x1f, 11, NULL, extract_nb, PPC_OPERAND_PLUS1 }, |
495 | |||
496 | /* The NBI field in an lswi instruction, which has special value | ||
497 | restrictions. The value 32 is stored as 0. */ | ||
498 | #define NBI NB + 1 | ||
499 | { 0x1f, 11, insert_nbi, extract_nb, PPC_OPERAND_PLUS1 }, | ||
366 | 500 | ||
367 | /* The NSI field in a D form instruction. This is the same as the | 501 | /* The NSI field in a D form instruction. This is the same as the |
368 | SI field, only negated. */ | 502 | SI field, only negated. */ |
369 | #define NSI NB + 1 | 503 | #define NSI NBI + 1 |
370 | { 16, 0, insert_nsi, extract_nsi, | 504 | { 0xffff, 0, insert_nsi, extract_nsi, |
371 | PPC_OPERAND_NEGATIVE | PPC_OPERAND_SIGNED }, | 505 | PPC_OPERAND_NEGATIVE | PPC_OPERAND_SIGNED }, |
506 | |||
507 | /* The NSI field in a D form instruction when we accept a wide range | ||
508 | of positive values. */ | ||
509 | #define NSISIGNOPT NSI + 1 | ||
510 | { 0xffff, 0, insert_nsi, extract_nsi, | ||
511 | PPC_OPERAND_NEGATIVE | PPC_OPERAND_SIGNED | PPC_OPERAND_SIGNOPT }, | ||
372 | 512 | ||
373 | /* The RA field in an D, DS, DQ, X, XO, M, or MDS form instruction. */ | 513 | /* The RA field in an D, DS, DQ, X, XO, M, or MDS form instruction. */ |
374 | #define RA NSI + 1 | 514 | #define RA NSISIGNOPT + 1 |
375 | #define RA_MASK (0x1f << 16) | 515 | #define RA_MASK (0x1f << 16) |
376 | { 5, 16, NULL, NULL, PPC_OPERAND_GPR }, | 516 | { 0x1f, 16, NULL, NULL, PPC_OPERAND_GPR }, |
377 | 517 | ||
378 | /* As above, but 0 in the RA field means zero, not r0. */ | 518 | /* As above, but 0 in the RA field means zero, not r0. */ |
379 | #define RA0 RA + 1 | 519 | #define RA0 RA + 1 |
380 | { 5, 16, NULL, NULL, PPC_OPERAND_GPR_0 }, | 520 | { 0x1f, 16, NULL, NULL, PPC_OPERAND_GPR_0 }, |
381 | 521 | ||
382 | /* The RA field in the DQ form lq instruction, which has special | 522 | /* The RA field in the DQ form lq or an lswx instruction, which have special |
383 | value restrictions. */ | 523 | value restrictions. */ |
384 | #define RAQ RA0 + 1 | 524 | #define RAQ RA0 + 1 |
385 | { 5, 16, insert_raq, NULL, PPC_OPERAND_GPR_0 }, | 525 | #define RAX RAQ |
526 | { 0x1f, 16, insert_raq, NULL, PPC_OPERAND_GPR_0 }, | ||
386 | 527 | ||
387 | /* The RA field in a D or X form instruction which is an updating | 528 | /* The RA field in a D or X form instruction which is an updating |
388 | load, which means that the RA field may not be zero and may not | 529 | load, which means that the RA field may not be zero and may not |
389 | equal the RT field. */ | 530 | equal the RT field. */ |
390 | #define RAL RAQ + 1 | 531 | #define RAL RAQ + 1 |
391 | { 5, 16, insert_ral, NULL, PPC_OPERAND_GPR_0 }, | 532 | { 0x1f, 16, insert_ral, NULL, PPC_OPERAND_GPR_0 }, |
392 | 533 | ||
393 | /* The RA field in an lmw instruction, which has special value | 534 | /* The RA field in an lmw instruction, which has special value |
394 | restrictions. */ | 535 | restrictions. */ |
395 | #define RAM RAL + 1 | 536 | #define RAM RAL + 1 |
396 | { 5, 16, insert_ram, NULL, PPC_OPERAND_GPR_0 }, | 537 | { 0x1f, 16, insert_ram, NULL, PPC_OPERAND_GPR_0 }, |
397 | 538 | ||
398 | /* The RA field in a D or X form instruction which is an updating | 539 | /* The RA field in a D or X form instruction which is an updating |
399 | store or an updating floating point load, which means that the RA | 540 | store or an updating floating point load, which means that the RA |
400 | field may not be zero. */ | 541 | field may not be zero. */ |
401 | #define RAS RAM + 1 | 542 | #define RAS RAM + 1 |
402 | { 5, 16, insert_ras, NULL, PPC_OPERAND_GPR_0 }, | 543 | { 0x1f, 16, insert_ras, NULL, PPC_OPERAND_GPR_0 }, |
403 | 544 | ||
404 | /* The RA field of the tlbwe instruction, which is optional. */ | 545 | /* The RA field of the tlbwe, dccci and iccci instructions, |
546 | which are optional. */ | ||
405 | #define RAOPT RAS + 1 | 547 | #define RAOPT RAS + 1 |
406 | { 5, 16, NULL, NULL, PPC_OPERAND_GPR | PPC_OPERAND_OPTIONAL }, | 548 | { 0x1f, 16, NULL, NULL, PPC_OPERAND_GPR | PPC_OPERAND_OPTIONAL }, |
407 | 549 | ||
408 | /* The RB field in an X, XO, M, or MDS form instruction. */ | 550 | /* The RB field in an X, XO, M, or MDS form instruction. */ |
409 | #define RB RAOPT + 1 | 551 | #define RB RAOPT + 1 |
410 | #define RB_MASK (0x1f << 11) | 552 | #define RB_MASK (0x1f << 11) |
411 | { 5, 11, NULL, NULL, PPC_OPERAND_GPR }, | 553 | { 0x1f, 11, NULL, NULL, PPC_OPERAND_GPR }, |
412 | 554 | ||
413 | /* The RB field in an X form instruction when it must be the same as | 555 | /* The RB field in an X form instruction when it must be the same as |
414 | the RS field in the instruction. This is used for extended | 556 | the RS field in the instruction. This is used for extended |
415 | mnemonics like mr. */ | 557 | mnemonics like mr. */ |
416 | #define RBS RB + 1 | 558 | #define RBS RB + 1 |
417 | { 5, 1, insert_rbs, extract_rbs, PPC_OPERAND_FAKE }, | 559 | { 0x1f, 11, insert_rbs, extract_rbs, PPC_OPERAND_FAKE }, |
560 | |||
561 | /* The RB field in an lswx instruction, which has special value | ||
562 | restrictions. */ | ||
563 | #define RBX RBS + 1 | ||
564 | { 0x1f, 11, insert_rbx, NULL, PPC_OPERAND_GPR }, | ||
565 | |||
566 | /* The RB field of the dccci and iccci instructions, which are optional. */ | ||
567 | #define RBOPT RBX + 1 | ||
568 | { 0x1f, 11, NULL, NULL, PPC_OPERAND_GPR | PPC_OPERAND_OPTIONAL }, | ||
569 | |||
570 | /* The RC register field in an maddld, maddhd or maddhdu instruction. */ | ||
571 | #define RC RBOPT + 1 | ||
572 | { 0x1f, 6, NULL, NULL, PPC_OPERAND_GPR }, | ||
418 | 573 | ||
419 | /* The RS field in a D, DS, X, XFX, XS, M, MD or MDS form | 574 | /* The RS field in a D, DS, X, XFX, XS, M, MD or MDS form |
420 | instruction or the RT field in a D, DS, X, XFX or XO form | 575 | instruction or the RT field in a D, DS, X, XFX or XO form |
421 | instruction. */ | 576 | instruction. */ |
422 | #define RS RBS + 1 | 577 | #define RS RC + 1 |
423 | #define RT RS | 578 | #define RT RS |
424 | #define RT_MASK (0x1f << 21) | 579 | #define RT_MASK (0x1f << 21) |
425 | { 5, 21, NULL, NULL, PPC_OPERAND_GPR }, | 580 | #define RD RS |
581 | { 0x1f, 21, NULL, NULL, PPC_OPERAND_GPR }, | ||
426 | 582 | ||
427 | /* The RS field of the DS form stq instruction, which has special | 583 | /* The RS and RT fields of the DS form stq and DQ form lq instructions, |
428 | value restrictions. */ | 584 | which have special value restrictions. */ |
429 | #define RSQ RS + 1 | 585 | #define RSQ RS + 1 |
430 | { 5, 21, insert_rsq, NULL, PPC_OPERAND_GPR_0 }, | 586 | #define RTQ RSQ |
431 | 587 | { 0x1e, 21, NULL, NULL, PPC_OPERAND_GPR }, | |
432 | /* The RT field of the DQ form lq instruction, which has special | ||
433 | value restrictions. */ | ||
434 | #define RTQ RSQ + 1 | ||
435 | { 5, 21, insert_rtq, NULL, PPC_OPERAND_GPR_0 }, | ||
436 | 588 | ||
437 | /* The RS field of the tlbwe instruction, which is optional. */ | 589 | /* The RS field of the tlbwe instruction, which is optional. */ |
438 | #define RSO RTQ + 1 | 590 | #define RSO RSQ + 1 |
439 | #define RTO RSO | 591 | #define RTO RSO |
440 | { 5, 21, NULL, NULL, PPC_OPERAND_GPR | PPC_OPERAND_OPTIONAL }, | 592 | { 0x1f, 21, NULL, NULL, PPC_OPERAND_GPR | PPC_OPERAND_OPTIONAL }, |
593 | |||
594 | /* The RX field of the SE_RR form instruction. */ | ||
595 | #define RX RSO + 1 | ||
596 | { 0x1f, PPC_OPSHIFT_INV, insert_rx, extract_rx, PPC_OPERAND_GPR }, | ||
597 | |||
598 | /* The ARX field of the SE_RR form instruction. */ | ||
599 | #define ARX RX + 1 | ||
600 | { 0x1f, PPC_OPSHIFT_INV, insert_arx, extract_arx, PPC_OPERAND_GPR }, | ||
601 | |||
602 | /* The RY field of the SE_RR form instruction. */ | ||
603 | #define RY ARX + 1 | ||
604 | #define RZ RY | ||
605 | { 0x1f, PPC_OPSHIFT_INV, insert_ry, extract_ry, PPC_OPERAND_GPR }, | ||
606 | |||
607 | /* The ARY field of the SE_RR form instruction. */ | ||
608 | #define ARY RY + 1 | ||
609 | { 0x1f, PPC_OPSHIFT_INV, insert_ary, extract_ary, PPC_OPERAND_GPR }, | ||
610 | |||
611 | /* The SCLSCI8 field in a D form instruction. */ | ||
612 | #define SCLSCI8 ARY + 1 | ||
613 | { 0xffffffff, PPC_OPSHIFT_INV, insert_sci8, extract_sci8, 0 }, | ||
614 | |||
615 | /* The SCLSCI8N field in a D form instruction. This is the same as the | ||
616 | SCLSCI8 field, only negated. */ | ||
617 | #define SCLSCI8N SCLSCI8 + 1 | ||
618 | { 0xffffffff, PPC_OPSHIFT_INV, insert_sci8n, extract_sci8n, | ||
619 | PPC_OPERAND_NEGATIVE | PPC_OPERAND_SIGNED }, | ||
620 | |||
621 | /* The SD field of the SD4 form instruction. */ | ||
622 | #define SE_SD SCLSCI8N + 1 | ||
623 | { 0xf, 8, NULL, NULL, PPC_OPERAND_PARENS }, | ||
624 | |||
625 | /* The SD field of the SD4 form instruction, for halfword. */ | ||
626 | #define SE_SDH SE_SD + 1 | ||
627 | { 0x1e, PPC_OPSHIFT_INV, insert_sd4h, extract_sd4h, PPC_OPERAND_PARENS }, | ||
628 | |||
629 | /* The SD field of the SD4 form instruction, for word. */ | ||
630 | #define SE_SDW SE_SDH + 1 | ||
631 | { 0x3c, PPC_OPSHIFT_INV, insert_sd4w, extract_sd4w, PPC_OPERAND_PARENS }, | ||
441 | 632 | ||
442 | /* The SH field in an X or M form instruction. */ | 633 | /* The SH field in an X or M form instruction. */ |
443 | #define SH RSO + 1 | 634 | #define SH SE_SDW + 1 |
444 | #define SH_MASK (0x1f << 11) | 635 | #define SH_MASK (0x1f << 11) |
445 | { 5, 11, NULL, NULL, 0 }, | 636 | /* The other UIMM field in a EVX form instruction. */ |
637 | #define EVUIMM SH | ||
638 | /* The FC field in an atomic X form instruction. */ | ||
639 | #define FC SH | ||
640 | { 0x1f, 11, NULL, NULL, 0 }, | ||
641 | |||
642 | /* The SI field in a HTM X form instruction. */ | ||
643 | #define HTM_SI SH + 1 | ||
644 | { 0x1f, 11, NULL, NULL, PPC_OPERAND_SIGNED }, | ||
446 | 645 | ||
447 | /* The SH field in an MD form instruction. This is split. */ | 646 | /* The SH field in an MD form instruction. This is split. */ |
448 | #define SH6 SH + 1 | 647 | #define SH6 HTM_SI + 1 |
449 | #define SH6_MASK ((0x1f << 11) | (1 << 1)) | 648 | #define SH6_MASK ((0x1f << 11) | (1 << 1)) |
450 | { 6, 1, insert_sh6, extract_sh6, 0 }, | 649 | { 0x3f, PPC_OPSHIFT_INV, insert_sh6, extract_sh6, 0 }, |
451 | 650 | ||
452 | /* The SH field of the tlbwe instruction, which is optional. */ | 651 | /* The SH field of the tlbwe instruction, which is optional. */ |
453 | #define SHO SH6 + 1 | 652 | #define SHO SH6 + 1 |
454 | { 5, 11,NULL, NULL, PPC_OPERAND_OPTIONAL }, | 653 | { 0x1f, 11, NULL, NULL, PPC_OPERAND_OPTIONAL }, |
455 | 654 | ||
456 | /* The SI field in a D form instruction. */ | 655 | /* The SI field in a D form instruction. */ |
457 | #define SI SHO + 1 | 656 | #define SI SHO + 1 |
458 | { 16, 0, NULL, NULL, PPC_OPERAND_SIGNED }, | 657 | { 0xffff, 0, NULL, NULL, PPC_OPERAND_SIGNED }, |
459 | 658 | ||
460 | /* The SI field in a D form instruction when we accept a wide range | 659 | /* The SI field in a D form instruction when we accept a wide range |
461 | of positive values. */ | 660 | of positive values. */ |
462 | #define SISIGNOPT SI + 1 | 661 | #define SISIGNOPT SI + 1 |
463 | { 16, 0, NULL, NULL, PPC_OPERAND_SIGNED | PPC_OPERAND_SIGNOPT }, | 662 | { 0xffff, 0, NULL, NULL, PPC_OPERAND_SIGNED | PPC_OPERAND_SIGNOPT }, |
663 | |||
664 | /* The SI8 field in a D form instruction. */ | ||
665 | #define SI8 SISIGNOPT + 1 | ||
666 | { 0xff, 0, NULL, NULL, PPC_OPERAND_SIGNED }, | ||
464 | 667 | ||
465 | /* The SPR field in an XFX form instruction. This is flipped--the | 668 | /* The SPR field in an XFX form instruction. This is flipped--the |
466 | lower 5 bits are stored in the upper 5 and vice- versa. */ | 669 | lower 5 bits are stored in the upper 5 and vice- versa. */ |
467 | #define SPR SISIGNOPT + 1 | 670 | #define SPR SI8 + 1 |
468 | #define PMR SPR | 671 | #define PMR SPR |
672 | #define TMR SPR | ||
469 | #define SPR_MASK (0x3ff << 11) | 673 | #define SPR_MASK (0x3ff << 11) |
470 | { 10, 11, insert_spr, extract_spr, 0 }, | 674 | { 0x3ff, 11, insert_spr, extract_spr, 0 }, |
471 | 675 | ||
472 | /* The BAT index number in an XFX form m[ft]ibat[lu] instruction. */ | 676 | /* The BAT index number in an XFX form m[ft]ibat[lu] instruction. */ |
473 | #define SPRBAT SPR + 1 | 677 | #define SPRBAT SPR + 1 |
474 | #define SPRBAT_MASK (0x3 << 17) | 678 | #define SPRBAT_MASK (0x3 << 17) |
475 | { 2, 17, NULL, NULL, 0 }, | 679 | { 0x3, 17, NULL, NULL, 0 }, |
476 | 680 | ||
477 | /* The SPRG register number in an XFX form m[ft]sprg instruction. */ | 681 | /* The SPRG register number in an XFX form m[ft]sprg instruction. */ |
478 | #define SPRG SPRBAT + 1 | 682 | #define SPRG SPRBAT + 1 |
479 | { 5, 16, insert_sprg, extract_sprg, 0 }, | 683 | { 0x1f, 16, insert_sprg, extract_sprg, 0 }, |
480 | 684 | ||
481 | /* The SR field in an X form instruction. */ | 685 | /* The SR field in an X form instruction. */ |
482 | #define SR SPRG + 1 | 686 | #define SR SPRG + 1 |
483 | { 4, 16, NULL, NULL, 0 }, | 687 | /* The 4-bit UIMM field in a VX form instruction. */ |
688 | #define UIMM4 SR | ||
689 | { 0xf, 16, NULL, NULL, 0 }, | ||
484 | 690 | ||
485 | /* The STRM field in an X AltiVec form instruction. */ | 691 | /* The STRM field in an X AltiVec form instruction. */ |
486 | #define STRM SR + 1 | 692 | #define STRM SR + 1 |
487 | #define STRM_MASK (0x3 << 21) | 693 | /* The T field in a tlbilx form instruction. */ |
488 | { 2, 21, NULL, NULL, 0 }, | 694 | #define T STRM |
695 | /* The L field in wclr instructions. */ | ||
696 | #define L2 STRM | ||
697 | { 0x3, 21, NULL, NULL, 0 }, | ||
698 | |||
699 | /* The ESYNC field in an X (sync) form instruction. */ | ||
700 | #define ESYNC STRM + 1 | ||
701 | { 0xf, 16, insert_esync, NULL, PPC_OPERAND_OPTIONAL }, | ||
489 | 702 | ||
490 | /* The SV field in a POWER SC form instruction. */ | 703 | /* The SV field in a POWER SC form instruction. */ |
491 | #define SV STRM + 1 | 704 | #define SV ESYNC + 1 |
492 | { 14, 2, NULL, NULL, 0 }, | 705 | { 0x3fff, 2, NULL, NULL, 0 }, |
493 | 706 | ||
494 | /* The TBR field in an XFX form instruction. This is like the SPR | 707 | /* The TBR field in an XFX form instruction. This is like the SPR |
495 | field, but it is optional. */ | 708 | field, but it is optional. */ |
496 | #define TBR SV + 1 | 709 | #define TBR SV + 1 |
497 | { 10, 11, insert_tbr, extract_tbr, PPC_OPERAND_OPTIONAL }, | 710 | { 0x3ff, 11, insert_tbr, extract_tbr, |
711 | PPC_OPERAND_OPTIONAL | PPC_OPERAND_OPTIONAL_VALUE}, | ||
712 | /* If the TBR operand is ommitted, use the value 268. */ | ||
713 | { -1, 268, NULL, NULL, 0}, | ||
498 | 714 | ||
499 | /* The TO field in a D or X form instruction. */ | 715 | /* The TO field in a D or X form instruction. */ |
500 | #define TO TBR + 1 | 716 | #define TO TBR + 2 |
717 | #define DUI TO | ||
501 | #define TO_MASK (0x1f << 21) | 718 | #define TO_MASK (0x1f << 21) |
502 | { 5, 21, NULL, NULL, 0 }, | 719 | { 0x1f, 21, NULL, NULL, 0 }, |
503 | |||
504 | /* The U field in an X form instruction. */ | ||
505 | #define U TO + 1 | ||
506 | { 4, 12, NULL, NULL, 0 }, | ||
507 | 720 | ||
508 | /* The UI field in a D form instruction. */ | 721 | /* The UI field in a D form instruction. */ |
509 | #define UI U + 1 | 722 | #define UI TO + 1 |
510 | { 16, 0, NULL, NULL, 0 }, | 723 | { 0xffff, 0, NULL, NULL, 0 }, |
724 | |||
725 | #define UISIGNOPT UI + 1 | ||
726 | { 0xffff, 0, NULL, NULL, PPC_OPERAND_SIGNOPT }, | ||
727 | |||
728 | /* The IMM field in an SE_IM5 instruction. */ | ||
729 | #define UI5 UISIGNOPT + 1 | ||
730 | { 0x1f, 4, NULL, NULL, 0 }, | ||
731 | |||
732 | /* The OIMM field in an SE_OIM5 instruction. */ | ||
733 | #define OIMM5 UI5 + 1 | ||
734 | { 0x1f, PPC_OPSHIFT_INV, insert_oimm, extract_oimm, PPC_OPERAND_PLUS1 }, | ||
735 | |||
736 | /* The UI7 field in an SE_LI instruction. */ | ||
737 | #define UI7 OIMM5 + 1 | ||
738 | { 0x7f, 4, NULL, NULL, 0 }, | ||
511 | 739 | ||
512 | /* The VA field in a VA, VX or VXR form instruction. */ | 740 | /* The VA field in a VA, VX or VXR form instruction. */ |
513 | #define VA UI + 1 | 741 | #define VA UI7 + 1 |
514 | #define VA_MASK (0x1f << 16) | 742 | { 0x1f, 16, NULL, NULL, PPC_OPERAND_VR }, |
515 | { 5, 16, NULL, NULL, PPC_OPERAND_VR }, | ||
516 | 743 | ||
517 | /* The VB field in a VA, VX or VXR form instruction. */ | 744 | /* The VB field in a VA, VX or VXR form instruction. */ |
518 | #define VB VA + 1 | 745 | #define VB VA + 1 |
519 | #define VB_MASK (0x1f << 11) | 746 | { 0x1f, 11, NULL, NULL, PPC_OPERAND_VR }, |
520 | { 5, 11, NULL, NULL, PPC_OPERAND_VR }, | ||
521 | 747 | ||
522 | /* The VC field in a VA form instruction. */ | 748 | /* The VC field in a VA form instruction. */ |
523 | #define VC VB + 1 | 749 | #define VC VB + 1 |
524 | #define VC_MASK (0x1f << 6) | 750 | { 0x1f, 6, NULL, NULL, PPC_OPERAND_VR }, |
525 | { 5, 6, NULL, NULL, PPC_OPERAND_VR }, | ||
526 | 751 | ||
527 | /* The VD or VS field in a VA, VX, VXR or X form instruction. */ | 752 | /* The VD or VS field in a VA, VX, VXR or X form instruction. */ |
528 | #define VD VC + 1 | 753 | #define VD VC + 1 |
529 | #define VS VD | 754 | #define VS VD |
530 | #define VD_MASK (0x1f << 21) | 755 | { 0x1f, 21, NULL, NULL, PPC_OPERAND_VR }, |
531 | { 5, 21, NULL, NULL, PPC_OPERAND_VR }, | ||
532 | 756 | ||
533 | /* The SIMM field in a VX form instruction. */ | 757 | /* The SIMM field in a VX form instruction, and TE in Z form. */ |
534 | #define SIMM VD + 1 | 758 | #define SIMM VD + 1 |
535 | { 5, 16, NULL, NULL, PPC_OPERAND_SIGNED}, | 759 | #define TE SIMM |
760 | { 0x1f, 16, NULL, NULL, PPC_OPERAND_SIGNED}, | ||
536 | 761 | ||
537 | /* The UIMM field in a VX form instruction. */ | 762 | /* The UIMM field in a VX form instruction. */ |
538 | #define UIMM SIMM + 1 | 763 | #define UIMM SIMM + 1 |
539 | { 5, 16, NULL, NULL, 0 }, | 764 | #define DCTL UIMM |
765 | { 0x1f, 16, NULL, NULL, 0 }, | ||
540 | 766 | ||
541 | /* The SHB field in a VA form instruction. */ | 767 | /* The 3-bit UIMM field in a VX form instruction. */ |
542 | #define SHB UIMM + 1 | 768 | #define UIMM3 UIMM + 1 |
543 | { 4, 6, NULL, NULL, 0 }, | 769 | { 0x7, 16, NULL, NULL, 0 }, |
544 | 770 | ||
545 | /* The other UIMM field in a EVX form instruction. */ | 771 | /* The 6-bit UIM field in a X form instruction. */ |
546 | #define EVUIMM SHB + 1 | 772 | #define UIM6 UIMM3 + 1 |
547 | { 5, 11, NULL, NULL, 0 }, | 773 | { 0x3f, 16, NULL, NULL, 0 }, |
774 | |||
775 | /* The SIX field in a VX form instruction. */ | ||
776 | #define SIX UIM6 + 1 | ||
777 | { 0xf, 11, NULL, NULL, 0 }, | ||
778 | |||
779 | /* The PS field in a VX form instruction. */ | ||
780 | #define PS SIX + 1 | ||
781 | { 0x1, 9, NULL, NULL, 0 }, | ||
782 | |||
783 | /* The SHB field in a VA form instruction. */ | ||
784 | #define SHB PS + 1 | ||
785 | { 0xf, 6, NULL, NULL, 0 }, | ||
548 | 786 | ||
549 | /* The other UIMM field in a half word EVX form instruction. */ | 787 | /* The other UIMM field in a half word EVX form instruction. */ |
550 | #define EVUIMM_2 EVUIMM + 1 | 788 | #define EVUIMM_2 SHB + 1 |
551 | { 32, 11, insert_ev2, extract_ev2, PPC_OPERAND_PARENS }, | 789 | { 0x3e, 10, NULL, NULL, PPC_OPERAND_PARENS }, |
552 | 790 | ||
553 | /* The other UIMM field in a word EVX form instruction. */ | 791 | /* The other UIMM field in a word EVX form instruction. */ |
554 | #define EVUIMM_4 EVUIMM_2 + 1 | 792 | #define EVUIMM_4 EVUIMM_2 + 1 |
555 | { 32, 11, insert_ev4, extract_ev4, PPC_OPERAND_PARENS }, | 793 | { 0x7c, 9, NULL, NULL, PPC_OPERAND_PARENS }, |
556 | 794 | ||
557 | /* The other UIMM field in a double EVX form instruction. */ | 795 | /* The other UIMM field in a double EVX form instruction. */ |
558 | #define EVUIMM_8 EVUIMM_4 + 1 | 796 | #define EVUIMM_8 EVUIMM_4 + 1 |
559 | { 32, 11, insert_ev8, extract_ev8, PPC_OPERAND_PARENS }, | 797 | { 0xf8, 8, NULL, NULL, PPC_OPERAND_PARENS }, |
560 | 798 | ||
561 | /* The WS field. */ | 799 | /* The WS or DRM field in an X form instruction. */ |
562 | #define WS EVUIMM_8 + 1 | 800 | #define WS EVUIMM_8 + 1 |
563 | #define WS_MASK (0x7 << 11) | 801 | #define DRM WS |
564 | { 3, 11, NULL, NULL, 0 }, | 802 | { 0x7, 11, NULL, NULL, 0 }, |
565 | 803 | ||
566 | /* The L field in an mtmsrd or A form instruction. */ | 804 | /* PowerPC paired singles extensions. */ |
567 | #define MTMSRD_L WS + 1 | 805 | /* W bit in the pair singles instructions for x type instructions. */ |
568 | #define A_L MTMSRD_L | 806 | #define PSWM WS + 1 |
569 | { 1, 16, NULL, NULL, PPC_OPERAND_OPTIONAL }, | 807 | /* The BO16 field in a BD8 form instruction. */ |
808 | #define BO16 PSWM | ||
809 | { 0x1, 10, 0, 0, 0 }, | ||
810 | |||
811 | /* IDX bits for quantization in the pair singles instructions. */ | ||
812 | #define PSQ PSWM + 1 | ||
813 | { 0x7, 12, 0, 0, 0 }, | ||
814 | |||
815 | /* IDX bits for quantization in the pair singles x-type instructions. */ | ||
816 | #define PSQM PSQ + 1 | ||
817 | { 0x7, 7, 0, 0, 0 }, | ||
818 | |||
819 | /* Smaller D field for quantization in the pair singles instructions. */ | ||
820 | #define PSD PSQM + 1 | ||
821 | { 0xfff, 0, 0, 0, PPC_OPERAND_PARENS | PPC_OPERAND_SIGNED }, | ||
822 | |||
823 | /* The L field in an mtmsrd or A form instruction or R or W in an X form. */ | ||
824 | #define A_L PSD + 1 | ||
825 | #define W A_L | ||
826 | #define X_R A_L | ||
827 | { 0x1, 16, NULL, NULL, PPC_OPERAND_OPTIONAL }, | ||
828 | |||
829 | /* The RMC or CY field in a Z23 form instruction. */ | ||
830 | #define RMC A_L + 1 | ||
831 | #define CY RMC | ||
832 | { 0x3, 9, NULL, NULL, 0 }, | ||
570 | 833 | ||
571 | /* The DCM field in a Z form instruction. */ | 834 | #define R RMC + 1 |
572 | #define DCM MTMSRD_L + 1 | 835 | { 0x1, 16, NULL, NULL, 0 }, |
573 | { 6, 16, NULL, NULL, 0 }, | ||
574 | |||
575 | /* Likewise, the DGM field in a Z form instruction. */ | ||
576 | #define DGM DCM + 1 | ||
577 | { 6, 16, NULL, NULL, 0 }, | ||
578 | 836 | ||
579 | #define TE DGM + 1 | 837 | #define RIC R + 1 |
580 | { 5, 11, NULL, NULL, 0 }, | 838 | { 0x3, 18, NULL, NULL, PPC_OPERAND_OPTIONAL }, |
581 | 839 | ||
582 | #define RMC TE + 1 | 840 | #define PRS RIC + 1 |
583 | { 2, 21, NULL, NULL, 0 }, | 841 | { 0x1, 17, NULL, NULL, PPC_OPERAND_OPTIONAL }, |
584 | 842 | ||
585 | #define R RMC + 1 | 843 | #define SP PRS + 1 |
586 | { 1, 15, NULL, NULL, 0 }, | 844 | { 0x3, 19, NULL, NULL, 0 }, |
587 | |||
588 | #define SP R + 1 | ||
589 | { 2, 11, NULL, NULL, 0 }, | ||
590 | 845 | ||
591 | #define S SP + 1 | 846 | #define S SP + 1 |
592 | { 1, 11, NULL, NULL, 0 }, | 847 | { 0x1, 20, NULL, NULL, 0 }, |
593 | 848 | ||
594 | /* SH field starting at bit position 16. */ | 849 | /* The S field in a XL form instruction. */ |
595 | #define SH16 S + 1 | 850 | #define SXL S + 1 |
596 | { 6, 10, NULL, NULL, 0 }, | 851 | { 0x1, 11, NULL, NULL, PPC_OPERAND_OPTIONAL | PPC_OPERAND_OPTIONAL_VALUE}, |
852 | /* If the SXL operand is ommitted, use the value 1. */ | ||
853 | { -1, 1, NULL, NULL, 0}, | ||
597 | 854 | ||
598 | /* The L field in an X form with the RT field fixed instruction. */ | 855 | /* SH field starting at bit position 16. */ |
599 | #define XRT_L SH16 + 1 | 856 | #define SH16 SXL + 2 |
600 | { 2, 21, NULL, NULL, PPC_OPERAND_OPTIONAL }, | 857 | /* The DCM and DGM fields in a Z form instruction. */ |
858 | #define DCM SH16 | ||
859 | #define DGM DCM | ||
860 | { 0x3f, 10, NULL, NULL, 0 }, | ||
601 | 861 | ||
602 | /* The EH field in larx instruction. */ | 862 | /* The EH field in larx instruction. */ |
603 | #define EH XRT_L + 1 | 863 | #define EH SH16 + 1 |
604 | { 1, 0, NULL, NULL, PPC_OPERAND_OPTIONAL }, | 864 | { 0x1, 0, NULL, NULL, PPC_OPERAND_OPTIONAL }, |
865 | |||
866 | /* The L field in an mtfsf or XFL form instruction. */ | ||
867 | /* The A field in a HTM X form instruction. */ | ||
868 | #define XFL_L EH + 1 | ||
869 | #define HTM_A XFL_L | ||
870 | { 0x1, 25, NULL, NULL, PPC_OPERAND_OPTIONAL}, | ||
871 | |||
872 | /* Xilinx APU related masks and macros */ | ||
873 | #define FCRT XFL_L + 1 | ||
874 | #define FCRT_MASK (0x1f << 21) | ||
875 | { 0x1f, 21, 0, 0, PPC_OPERAND_FCR }, | ||
876 | |||
877 | /* Xilinx FSL related masks and macros */ | ||
878 | #define FSL FCRT + 1 | ||
879 | #define FSL_MASK (0x1f << 11) | ||
880 | { 0x1f, 11, 0, 0, PPC_OPERAND_FSL }, | ||
881 | |||
882 | /* Xilinx UDI related masks and macros */ | ||
883 | #define URT FSL + 1 | ||
884 | { 0x1f, 21, 0, 0, PPC_OPERAND_UDI }, | ||
885 | |||
886 | #define URA URT + 1 | ||
887 | { 0x1f, 16, 0, 0, PPC_OPERAND_UDI }, | ||
888 | |||
889 | #define URB URA + 1 | ||
890 | { 0x1f, 11, 0, 0, PPC_OPERAND_UDI }, | ||
891 | |||
892 | #define URC URB + 1 | ||
893 | { 0x1f, 6, 0, 0, PPC_OPERAND_UDI }, | ||
894 | |||
895 | /* The VLESIMM field in a D form instruction. */ | ||
896 | #define VLESIMM URC + 1 | ||
897 | { 0xffff, PPC_OPSHIFT_INV, insert_vlesi, extract_vlesi, | ||
898 | PPC_OPERAND_SIGNED | PPC_OPERAND_SIGNOPT }, | ||
899 | |||
900 | /* The VLENSIMM field in a D form instruction. */ | ||
901 | #define VLENSIMM VLESIMM + 1 | ||
902 | { 0xffff, PPC_OPSHIFT_INV, insert_vlensi, extract_vlensi, | ||
903 | PPC_OPERAND_NEGATIVE | PPC_OPERAND_SIGNED | PPC_OPERAND_SIGNOPT }, | ||
904 | |||
905 | /* The VLEUIMM field in a D form instruction. */ | ||
906 | #define VLEUIMM VLENSIMM + 1 | ||
907 | { 0xffff, PPC_OPSHIFT_INV, insert_vleui, extract_vleui, 0 }, | ||
908 | |||
909 | /* The VLEUIMML field in a D form instruction. */ | ||
910 | #define VLEUIMML VLEUIMM + 1 | ||
911 | { 0xffff, PPC_OPSHIFT_INV, insert_vleil, extract_vleil, 0 }, | ||
912 | |||
913 | /* The XT and XS fields in an XX1 or XX3 form instruction. This is split. */ | ||
914 | #define XS6 VLEUIMML + 1 | ||
915 | #define XT6 XS6 | ||
916 | { 0x3f, PPC_OPSHIFT_INV, insert_xt6, extract_xt6, PPC_OPERAND_VSR }, | ||
917 | |||
918 | /* The XT and XS fields in an DQ form VSX instruction. This is split. */ | ||
919 | #define XSQ6 XT6 + 1 | ||
920 | #define XTQ6 XSQ6 | ||
921 | { 0x3f, PPC_OPSHIFT_INV, insert_xtq6, extract_xtq6, PPC_OPERAND_VSR }, | ||
922 | |||
923 | /* The XA field in an XX3 form instruction. This is split. */ | ||
924 | #define XA6 XTQ6 + 1 | ||
925 | { 0x3f, PPC_OPSHIFT_INV, insert_xa6, extract_xa6, PPC_OPERAND_VSR }, | ||
926 | |||
927 | /* The XB field in an XX2 or XX3 form instruction. This is split. */ | ||
928 | #define XB6 XA6 + 1 | ||
929 | { 0x3f, PPC_OPSHIFT_INV, insert_xb6, extract_xb6, PPC_OPERAND_VSR }, | ||
930 | |||
931 | /* The XB field in an XX3 form instruction when it must be the same as | ||
932 | the XA field in the instruction. This is used in extended mnemonics | ||
933 | like xvmovdp. This is split. */ | ||
934 | #define XB6S XB6 + 1 | ||
935 | { 0x3f, PPC_OPSHIFT_INV, insert_xb6s, extract_xb6s, PPC_OPERAND_FAKE }, | ||
936 | |||
937 | /* The XC field in an XX4 form instruction. This is split. */ | ||
938 | #define XC6 XB6S + 1 | ||
939 | { 0x3f, PPC_OPSHIFT_INV, insert_xc6, extract_xc6, PPC_OPERAND_VSR }, | ||
940 | |||
941 | /* The DM or SHW field in an XX3 form instruction. */ | ||
942 | #define DM XC6 + 1 | ||
943 | #define SHW DM | ||
944 | { 0x3, 8, NULL, NULL, 0 }, | ||
945 | |||
946 | /* The DM field in an extended mnemonic XX3 form instruction. */ | ||
947 | #define DMEX DM + 1 | ||
948 | { 0x3, 8, insert_dm, extract_dm, 0 }, | ||
949 | |||
950 | /* The UIM field in an XX2 form instruction. */ | ||
951 | #define UIM DMEX + 1 | ||
952 | /* The 2-bit UIMM field in a VX form instruction. */ | ||
953 | #define UIMM2 UIM | ||
954 | /* The 2-bit L field in a darn instruction. */ | ||
955 | #define LRAND UIM | ||
956 | { 0x3, 16, NULL, NULL, 0 }, | ||
957 | |||
958 | #define ERAT_T UIM + 1 | ||
959 | { 0x7, 21, NULL, NULL, 0 }, | ||
960 | |||
961 | #define IH ERAT_T + 1 | ||
962 | { 0x7, 21, NULL, NULL, PPC_OPERAND_OPTIONAL }, | ||
963 | |||
964 | /* The 8-bit IMM8 field in a XX1 form instruction. */ | ||
965 | #define IMM8 IH + 1 | ||
966 | { 0xff, 11, NULL, NULL, PPC_OPERAND_SIGNOPT }, | ||
605 | }; | 967 | }; |
606 | 968 | ||
969 | const unsigned int num_powerpc_operands = (sizeof (powerpc_operands) | ||
970 | / sizeof (powerpc_operands[0])); | ||
971 | |||
607 | /* The functions used to insert and extract complicated operands. */ | 972 | /* The functions used to insert and extract complicated operands. */ |
608 | 973 | ||
974 | /* The ARX, ARY, RX and RY operands are alternate encodings of GPRs. */ | ||
975 | |||
976 | static unsigned long | ||
977 | insert_arx (unsigned long insn, | ||
978 | long value, | ||
979 | ppc_cpu_t dialect ATTRIBUTE_UNUSED, | ||
980 | const char **errmsg ATTRIBUTE_UNUSED) | ||
981 | { | ||
982 | if (value >= 8 && value < 24) | ||
983 | return insn | ((value - 8) & 0xf); | ||
984 | else | ||
985 | { | ||
986 | *errmsg = _("invalid register"); | ||
987 | return 0; | ||
988 | } | ||
989 | } | ||
990 | |||
991 | static long | ||
992 | extract_arx (unsigned long insn, | ||
993 | ppc_cpu_t dialect ATTRIBUTE_UNUSED, | ||
994 | int *invalid ATTRIBUTE_UNUSED) | ||
995 | { | ||
996 | return (insn & 0xf) + 8; | ||
997 | } | ||
998 | |||
999 | static unsigned long | ||
1000 | insert_ary (unsigned long insn, | ||
1001 | long value, | ||
1002 | ppc_cpu_t dialect ATTRIBUTE_UNUSED, | ||
1003 | const char **errmsg ATTRIBUTE_UNUSED) | ||
1004 | { | ||
1005 | if (value >= 8 && value < 24) | ||
1006 | return insn | (((value - 8) & 0xf) << 4); | ||
1007 | else | ||
1008 | { | ||
1009 | *errmsg = _("invalid register"); | ||
1010 | return 0; | ||
1011 | } | ||
1012 | } | ||
1013 | |||
1014 | static long | ||
1015 | extract_ary (unsigned long insn, | ||
1016 | ppc_cpu_t dialect ATTRIBUTE_UNUSED, | ||
1017 | int *invalid ATTRIBUTE_UNUSED) | ||
1018 | { | ||
1019 | return ((insn >> 4) & 0xf) + 8; | ||
1020 | } | ||
1021 | |||
1022 | static unsigned long | ||
1023 | insert_rx (unsigned long insn, | ||
1024 | long value, | ||
1025 | ppc_cpu_t dialect ATTRIBUTE_UNUSED, | ||
1026 | const char **errmsg) | ||
1027 | { | ||
1028 | if (value >= 0 && value < 8) | ||
1029 | return insn | value; | ||
1030 | else if (value >= 24 && value <= 31) | ||
1031 | return insn | (value - 16); | ||
1032 | else | ||
1033 | { | ||
1034 | *errmsg = _("invalid register"); | ||
1035 | return 0; | ||
1036 | } | ||
1037 | } | ||
1038 | |||
1039 | static long | ||
1040 | extract_rx (unsigned long insn, | ||
1041 | ppc_cpu_t dialect ATTRIBUTE_UNUSED, | ||
1042 | int *invalid ATTRIBUTE_UNUSED) | ||
1043 | { | ||
1044 | int value = insn & 0xf; | ||
1045 | if (value >= 0 && value < 8) | ||
1046 | return value; | ||
1047 | else | ||
1048 | return value + 16; | ||
1049 | } | ||
1050 | |||
1051 | static unsigned long | ||
1052 | insert_ry (unsigned long insn, | ||
1053 | long value, | ||
1054 | ppc_cpu_t dialect ATTRIBUTE_UNUSED, | ||
1055 | const char **errmsg) | ||
1056 | { | ||
1057 | if (value >= 0 && value < 8) | ||
1058 | return insn | (value << 4); | ||
1059 | else if (value >= 24 && value <= 31) | ||
1060 | return insn | ((value - 16) << 4); | ||
1061 | else | ||
1062 | { | ||
1063 | *errmsg = _("invalid register"); | ||
1064 | return 0; | ||
1065 | } | ||
1066 | } | ||
1067 | |||
1068 | static long | ||
1069 | extract_ry (unsigned long insn, | ||
1070 | ppc_cpu_t dialect ATTRIBUTE_UNUSED, | ||
1071 | int *invalid ATTRIBUTE_UNUSED) | ||
1072 | { | ||
1073 | int value = (insn >> 4) & 0xf; | ||
1074 | if (value >= 0 && value < 8) | ||
1075 | return value; | ||
1076 | else | ||
1077 | return value + 16; | ||
1078 | } | ||
1079 | |||
609 | /* The BA field in an XL form instruction when it must be the same as | 1080 | /* The BA field in an XL form instruction when it must be the same as |
610 | the BT field in the same instruction. This operand is marked FAKE. | 1081 | the BT field in the same instruction. This operand is marked FAKE. |
611 | The insertion function just copies the BT field into the BA field, | 1082 | The insertion function just copies the BT field into the BA field, |
@@ -615,7 +1086,7 @@ const struct powerpc_operand powerpc_operands[] = | |||
615 | static unsigned long | 1086 | static unsigned long |
616 | insert_bat (unsigned long insn, | 1087 | insert_bat (unsigned long insn, |
617 | long value ATTRIBUTE_UNUSED, | 1088 | long value ATTRIBUTE_UNUSED, |
618 | int dialect ATTRIBUTE_UNUSED, | 1089 | ppc_cpu_t dialect ATTRIBUTE_UNUSED, |
619 | const char **errmsg ATTRIBUTE_UNUSED) | 1090 | const char **errmsg ATTRIBUTE_UNUSED) |
620 | { | 1091 | { |
621 | return insn | (((insn >> 21) & 0x1f) << 16); | 1092 | return insn | (((insn >> 21) & 0x1f) << 16); |
@@ -623,7 +1094,7 @@ insert_bat (unsigned long insn, | |||
623 | 1094 | ||
624 | static long | 1095 | static long |
625 | extract_bat (unsigned long insn, | 1096 | extract_bat (unsigned long insn, |
626 | int dialect ATTRIBUTE_UNUSED, | 1097 | ppc_cpu_t dialect ATTRIBUTE_UNUSED, |
627 | int *invalid) | 1098 | int *invalid) |
628 | { | 1099 | { |
629 | if (((insn >> 21) & 0x1f) != ((insn >> 16) & 0x1f)) | 1100 | if (((insn >> 21) & 0x1f) != ((insn >> 16) & 0x1f)) |
@@ -640,7 +1111,7 @@ extract_bat (unsigned long insn, | |||
640 | static unsigned long | 1111 | static unsigned long |
641 | insert_bba (unsigned long insn, | 1112 | insert_bba (unsigned long insn, |
642 | long value ATTRIBUTE_UNUSED, | 1113 | long value ATTRIBUTE_UNUSED, |
643 | int dialect ATTRIBUTE_UNUSED, | 1114 | ppc_cpu_t dialect ATTRIBUTE_UNUSED, |
644 | const char **errmsg ATTRIBUTE_UNUSED) | 1115 | const char **errmsg ATTRIBUTE_UNUSED) |
645 | { | 1116 | { |
646 | return insn | (((insn >> 16) & 0x1f) << 11); | 1117 | return insn | (((insn >> 16) & 0x1f) << 11); |
@@ -648,7 +1119,7 @@ insert_bba (unsigned long insn, | |||
648 | 1119 | ||
649 | static long | 1120 | static long |
650 | extract_bba (unsigned long insn, | 1121 | extract_bba (unsigned long insn, |
651 | int dialect ATTRIBUTE_UNUSED, | 1122 | ppc_cpu_t dialect ATTRIBUTE_UNUSED, |
652 | int *invalid) | 1123 | int *invalid) |
653 | { | 1124 | { |
654 | if (((insn >> 16) & 0x1f) != ((insn >> 11) & 0x1f)) | 1125 | if (((insn >> 16) & 0x1f) != ((insn >> 11) & 0x1f)) |
@@ -656,26 +1127,6 @@ extract_bba (unsigned long insn, | |||
656 | return 0; | 1127 | return 0; |
657 | } | 1128 | } |
658 | 1129 | ||
659 | /* The BD field in a B form instruction. The lower two bits are | ||
660 | forced to zero. */ | ||
661 | |||
662 | static unsigned long | ||
663 | insert_bd (unsigned long insn, | ||
664 | long value, | ||
665 | int dialect ATTRIBUTE_UNUSED, | ||
666 | const char **errmsg ATTRIBUTE_UNUSED) | ||
667 | { | ||
668 | return insn | (value & 0xfffc); | ||
669 | } | ||
670 | |||
671 | static long | ||
672 | extract_bd (unsigned long insn, | ||
673 | int dialect ATTRIBUTE_UNUSED, | ||
674 | int *invalid ATTRIBUTE_UNUSED) | ||
675 | { | ||
676 | return ((insn & 0xfffc) ^ 0x8000) - 0x8000; | ||
677 | } | ||
678 | |||
679 | /* The BD field in a B form instruction when the - modifier is used. | 1130 | /* The BD field in a B form instruction when the - modifier is used. |
680 | This modifier means that the branch is not expected to be taken. | 1131 | This modifier means that the branch is not expected to be taken. |
681 | For chips built to versions of the architecture prior to version 2 | 1132 | For chips built to versions of the architecture prior to version 2 |
@@ -687,15 +1138,21 @@ extract_bd (unsigned long insn, | |||
687 | the "y" bit. "at" == 00 => no hint, "at" == 01 => unpredictable, | 1138 | the "y" bit. "at" == 00 => no hint, "at" == 01 => unpredictable, |
688 | "at" == 10 => not taken, "at" == 11 => taken. The "t" bit is 00001 | 1139 | "at" == 10 => not taken, "at" == 11 => taken. The "t" bit is 00001 |
689 | in BO field, the "a" bit is 00010 for branch on CR(BI) and 01000 | 1140 | in BO field, the "a" bit is 00010 for branch on CR(BI) and 01000 |
690 | for branch on CTR. We only handle the taken/not-taken hint here. */ | 1141 | for branch on CTR. We only handle the taken/not-taken hint here. |
1142 | Note that we don't relax the conditions tested here when | ||
1143 | disassembling with -Many because insns using extract_bdm and | ||
1144 | extract_bdp always occur in pairs. One or the other will always | ||
1145 | be valid. */ | ||
1146 | |||
1147 | #define ISA_V2 (PPC_OPCODE_POWER4 | PPC_OPCODE_E500MC | PPC_OPCODE_TITAN) | ||
691 | 1148 | ||
692 | static unsigned long | 1149 | static unsigned long |
693 | insert_bdm (unsigned long insn, | 1150 | insert_bdm (unsigned long insn, |
694 | long value, | 1151 | long value, |
695 | int dialect, | 1152 | ppc_cpu_t dialect, |
696 | const char **errmsg ATTRIBUTE_UNUSED) | 1153 | const char **errmsg ATTRIBUTE_UNUSED) |
697 | { | 1154 | { |
698 | if ((dialect & PPC_OPCODE_POWER4) == 0) | 1155 | if ((dialect & ISA_V2) == 0) |
699 | { | 1156 | { |
700 | if ((value & 0x8000) != 0) | 1157 | if ((value & 0x8000) != 0) |
701 | insn |= 1 << 21; | 1158 | insn |= 1 << 21; |
@@ -712,10 +1169,10 @@ insert_bdm (unsigned long insn, | |||
712 | 1169 | ||
713 | static long | 1170 | static long |
714 | extract_bdm (unsigned long insn, | 1171 | extract_bdm (unsigned long insn, |
715 | int dialect, | 1172 | ppc_cpu_t dialect, |
716 | int *invalid) | 1173 | int *invalid) |
717 | { | 1174 | { |
718 | if ((dialect & PPC_OPCODE_POWER4) == 0) | 1175 | if ((dialect & ISA_V2) == 0) |
719 | { | 1176 | { |
720 | if (((insn & (1 << 21)) == 0) != ((insn & (1 << 15)) == 0)) | 1177 | if (((insn & (1 << 21)) == 0) != ((insn & (1 << 15)) == 0)) |
721 | *invalid = 1; | 1178 | *invalid = 1; |
@@ -737,10 +1194,10 @@ extract_bdm (unsigned long insn, | |||
737 | static unsigned long | 1194 | static unsigned long |
738 | insert_bdp (unsigned long insn, | 1195 | insert_bdp (unsigned long insn, |
739 | long value, | 1196 | long value, |
740 | int dialect, | 1197 | ppc_cpu_t dialect, |
741 | const char **errmsg ATTRIBUTE_UNUSED) | 1198 | const char **errmsg ATTRIBUTE_UNUSED) |
742 | { | 1199 | { |
743 | if ((dialect & PPC_OPCODE_POWER4) == 0) | 1200 | if ((dialect & ISA_V2) == 0) |
744 | { | 1201 | { |
745 | if ((value & 0x8000) == 0) | 1202 | if ((value & 0x8000) == 0) |
746 | insn |= 1 << 21; | 1203 | insn |= 1 << 21; |
@@ -757,10 +1214,10 @@ insert_bdp (unsigned long insn, | |||
757 | 1214 | ||
758 | static long | 1215 | static long |
759 | extract_bdp (unsigned long insn, | 1216 | extract_bdp (unsigned long insn, |
760 | int dialect, | 1217 | ppc_cpu_t dialect, |
761 | int *invalid) | 1218 | int *invalid) |
762 | { | 1219 | { |
763 | if ((dialect & PPC_OPCODE_POWER4) == 0) | 1220 | if ((dialect & ISA_V2) == 0) |
764 | { | 1221 | { |
765 | if (((insn & (1 << 21)) == 0) == ((insn & (1 << 15)) == 0)) | 1222 | if (((insn & (1 << 21)) == 0) == ((insn & (1 << 15)) == 0)) |
766 | *invalid = 1; | 1223 | *invalid = 1; |
@@ -775,55 +1232,70 @@ extract_bdp (unsigned long insn, | |||
775 | return ((insn & 0xfffc) ^ 0x8000) - 0x8000; | 1232 | return ((insn & 0xfffc) ^ 0x8000) - 0x8000; |
776 | } | 1233 | } |
777 | 1234 | ||
1235 | static inline int | ||
1236 | valid_bo_pre_v2 (long value) | ||
1237 | { | ||
1238 | /* Certain encodings have bits that are required to be zero. | ||
1239 | These are (z must be zero, y may be anything): | ||
1240 | 0000y | ||
1241 | 0001y | ||
1242 | 001zy | ||
1243 | 0100y | ||
1244 | 0101y | ||
1245 | 011zy | ||
1246 | 1z00y | ||
1247 | 1z01y | ||
1248 | 1z1zz | ||
1249 | */ | ||
1250 | if ((value & 0x14) == 0) | ||
1251 | return 1; | ||
1252 | else if ((value & 0x14) == 0x4) | ||
1253 | return (value & 0x2) == 0; | ||
1254 | else if ((value & 0x14) == 0x10) | ||
1255 | return (value & 0x8) == 0; | ||
1256 | else | ||
1257 | return value == 0x14; | ||
1258 | } | ||
1259 | |||
1260 | static inline int | ||
1261 | valid_bo_post_v2 (long value) | ||
1262 | { | ||
1263 | /* Certain encodings have bits that are required to be zero. | ||
1264 | These are (z must be zero, a & t may be anything): | ||
1265 | 0000z | ||
1266 | 0001z | ||
1267 | 001at | ||
1268 | 0100z | ||
1269 | 0101z | ||
1270 | 011at | ||
1271 | 1a00t | ||
1272 | 1a01t | ||
1273 | 1z1zz | ||
1274 | */ | ||
1275 | if ((value & 0x14) == 0) | ||
1276 | return (value & 0x1) == 0; | ||
1277 | else if ((value & 0x14) == 0x14) | ||
1278 | return value == 0x14; | ||
1279 | else | ||
1280 | return 1; | ||
1281 | } | ||
1282 | |||
778 | /* Check for legal values of a BO field. */ | 1283 | /* Check for legal values of a BO field. */ |
779 | 1284 | ||
780 | static int | 1285 | static int |
781 | valid_bo (long value, int dialect) | 1286 | valid_bo (long value, ppc_cpu_t dialect, int extract) |
782 | { | 1287 | { |
783 | if ((dialect & PPC_OPCODE_POWER4) == 0) | 1288 | int valid_y = valid_bo_pre_v2 (value); |
784 | { | 1289 | int valid_at = valid_bo_post_v2 (value); |
785 | /* Certain encodings have bits that are required to be zero. | 1290 | |
786 | These are (z must be zero, y may be anything): | 1291 | /* When disassembling with -Many, accept either encoding on the |
787 | 001zy | 1292 | second pass through opcodes. */ |
788 | 011zy | 1293 | if (extract && dialect == ~(ppc_cpu_t) PPC_OPCODE_ANY) |
789 | 1z00y | 1294 | return valid_y || valid_at; |
790 | 1z01y | 1295 | if ((dialect & ISA_V2) == 0) |
791 | 1z1zz | 1296 | return valid_y; |
792 | */ | ||
793 | switch (value & 0x14) | ||
794 | { | ||
795 | default: | ||
796 | case 0: | ||
797 | return 1; | ||
798 | case 0x4: | ||
799 | return (value & 0x2) == 0; | ||
800 | case 0x10: | ||
801 | return (value & 0x8) == 0; | ||
802 | case 0x14: | ||
803 | return value == 0x14; | ||
804 | } | ||
805 | } | ||
806 | else | 1297 | else |
807 | { | 1298 | return valid_at; |
808 | /* Certain encodings have bits that are required to be zero. | ||
809 | These are (z must be zero, a & t may be anything): | ||
810 | 0000z | ||
811 | 0001z | ||
812 | 0100z | ||
813 | 0101z | ||
814 | 001at | ||
815 | 011at | ||
816 | 1a00t | ||
817 | 1a01t | ||
818 | 1z1zz | ||
819 | */ | ||
820 | if ((value & 0x14) == 0) | ||
821 | return (value & 0x1) == 0; | ||
822 | else if ((value & 0x14) == 0x14) | ||
823 | return value == 0x14; | ||
824 | else | ||
825 | return 1; | ||
826 | } | ||
827 | } | 1299 | } |
828 | 1300 | ||
829 | /* The BO field in a B form instruction. Warn about attempts to set | 1301 | /* The BO field in a B form instruction. Warn about attempts to set |
@@ -832,23 +1304,25 @@ valid_bo (long value, int dialect) | |||
832 | static unsigned long | 1304 | static unsigned long |
833 | insert_bo (unsigned long insn, | 1305 | insert_bo (unsigned long insn, |
834 | long value, | 1306 | long value, |
835 | int dialect, | 1307 | ppc_cpu_t dialect, |
836 | const char **errmsg) | 1308 | const char **errmsg) |
837 | { | 1309 | { |
838 | if (!valid_bo (value, dialect)) | 1310 | if (!valid_bo (value, dialect, 0)) |
839 | *errmsg = _("invalid conditional option"); | 1311 | *errmsg = _("invalid conditional option"); |
1312 | else if (PPC_OP (insn) == 19 && (insn & 0x400) && ! (value & 4)) | ||
1313 | *errmsg = _("invalid counter access"); | ||
840 | return insn | ((value & 0x1f) << 21); | 1314 | return insn | ((value & 0x1f) << 21); |
841 | } | 1315 | } |
842 | 1316 | ||
843 | static long | 1317 | static long |
844 | extract_bo (unsigned long insn, | 1318 | extract_bo (unsigned long insn, |
845 | int dialect, | 1319 | ppc_cpu_t dialect, |
846 | int *invalid) | 1320 | int *invalid) |
847 | { | 1321 | { |
848 | long value; | 1322 | long value; |
849 | 1323 | ||
850 | value = (insn >> 21) & 0x1f; | 1324 | value = (insn >> 21) & 0x1f; |
851 | if (!valid_bo (value, dialect)) | 1325 | if (!valid_bo (value, dialect, 1)) |
852 | *invalid = 1; | 1326 | *invalid = 1; |
853 | return value; | 1327 | return value; |
854 | } | 1328 | } |
@@ -860,11 +1334,13 @@ extract_bo (unsigned long insn, | |||
860 | static unsigned long | 1334 | static unsigned long |
861 | insert_boe (unsigned long insn, | 1335 | insert_boe (unsigned long insn, |
862 | long value, | 1336 | long value, |
863 | int dialect, | 1337 | ppc_cpu_t dialect, |
864 | const char **errmsg) | 1338 | const char **errmsg) |
865 | { | 1339 | { |
866 | if (!valid_bo (value, dialect)) | 1340 | if (!valid_bo (value, dialect, 0)) |
867 | *errmsg = _("invalid conditional option"); | 1341 | *errmsg = _("invalid conditional option"); |
1342 | else if (PPC_OP (insn) == 19 && (insn & 0x400) && ! (value & 4)) | ||
1343 | *errmsg = _("invalid counter access"); | ||
868 | else if ((value & 1) != 0) | 1344 | else if ((value & 1) != 0) |
869 | *errmsg = _("attempt to set y bit when using + or - modifier"); | 1345 | *errmsg = _("attempt to set y bit when using + or - modifier"); |
870 | 1346 | ||
@@ -873,166 +1349,73 @@ insert_boe (unsigned long insn, | |||
873 | 1349 | ||
874 | static long | 1350 | static long |
875 | extract_boe (unsigned long insn, | 1351 | extract_boe (unsigned long insn, |
876 | int dialect, | 1352 | ppc_cpu_t dialect, |
877 | int *invalid) | 1353 | int *invalid) |
878 | { | 1354 | { |
879 | long value; | 1355 | long value; |
880 | 1356 | ||
881 | value = (insn >> 21) & 0x1f; | 1357 | value = (insn >> 21) & 0x1f; |
882 | if (!valid_bo (value, dialect)) | 1358 | if (!valid_bo (value, dialect, 1)) |
883 | *invalid = 1; | 1359 | *invalid = 1; |
884 | return value & 0x1e; | 1360 | return value & 0x1e; |
885 | } | 1361 | } |
886 | 1362 | ||
887 | /* The DQ field in a DQ form instruction. This is like D, but the | 1363 | /* The DCMX field in a X form instruction when the field is split |
888 | lower four bits are forced to zero. */ | 1364 | into separate DC, DM and DX fields. */ |
889 | |||
890 | static unsigned long | ||
891 | insert_dq (unsigned long insn, | ||
892 | long value, | ||
893 | int dialect ATTRIBUTE_UNUSED, | ||
894 | const char **errmsg) | ||
895 | { | ||
896 | if ((value & 0xf) != 0) | ||
897 | *errmsg = _("offset not a multiple of 16"); | ||
898 | return insn | (value & 0xfff0); | ||
899 | } | ||
900 | |||
901 | static long | ||
902 | extract_dq (unsigned long insn, | ||
903 | int dialect ATTRIBUTE_UNUSED, | ||
904 | int *invalid ATTRIBUTE_UNUSED) | ||
905 | { | ||
906 | return ((insn & 0xfff0) ^ 0x8000) - 0x8000; | ||
907 | } | ||
908 | 1365 | ||
909 | static unsigned long | 1366 | static unsigned long |
910 | insert_ev2 (unsigned long insn, | 1367 | insert_dcmxs (unsigned long insn, |
911 | long value, | 1368 | long value, |
912 | int dialect ATTRIBUTE_UNUSED, | 1369 | ppc_cpu_t dialect ATTRIBUTE_UNUSED, |
913 | const char **errmsg) | 1370 | const char **errmsg ATTRIBUTE_UNUSED) |
914 | { | 1371 | { |
915 | if ((value & 1) != 0) | 1372 | return insn | ((value & 0x1f) << 16) | ((value & 0x20) >> 3) | (value & 0x40); |
916 | *errmsg = _("offset not a multiple of 2"); | ||
917 | if ((value > 62) != 0) | ||
918 | *errmsg = _("offset greater than 62"); | ||
919 | return insn | ((value & 0x3e) << 10); | ||
920 | } | 1373 | } |
921 | 1374 | ||
922 | static long | 1375 | static long |
923 | extract_ev2 (unsigned long insn, | 1376 | extract_dcmxs (unsigned long insn, |
924 | int dialect ATTRIBUTE_UNUSED, | 1377 | ppc_cpu_t dialect ATTRIBUTE_UNUSED, |
925 | int *invalid ATTRIBUTE_UNUSED) | 1378 | int *invalid ATTRIBUTE_UNUSED) |
926 | { | 1379 | { |
927 | return (insn >> 10) & 0x3e; | 1380 | return (insn & 0x40) | ((insn << 3) & 0x20) | ((insn >> 16) & 0x1f); |
928 | } | 1381 | } |
929 | 1382 | ||
930 | static unsigned long | 1383 | /* The D field in a DX form instruction when the field is split |
931 | insert_ev4 (unsigned long insn, | 1384 | into separate D0, D1 and D2 fields. */ |
932 | long value, | ||
933 | int dialect ATTRIBUTE_UNUSED, | ||
934 | const char **errmsg) | ||
935 | { | ||
936 | if ((value & 3) != 0) | ||
937 | *errmsg = _("offset not a multiple of 4"); | ||
938 | if ((value > 124) != 0) | ||
939 | *errmsg = _("offset greater than 124"); | ||
940 | return insn | ((value & 0x7c) << 9); | ||
941 | } | ||
942 | |||
943 | static long | ||
944 | extract_ev4 (unsigned long insn, | ||
945 | int dialect ATTRIBUTE_UNUSED, | ||
946 | int *invalid ATTRIBUTE_UNUSED) | ||
947 | { | ||
948 | return (insn >> 9) & 0x7c; | ||
949 | } | ||
950 | 1385 | ||
951 | static unsigned long | 1386 | static unsigned long |
952 | insert_ev8 (unsigned long insn, | 1387 | insert_dxd (unsigned long insn, |
953 | long value, | 1388 | long value, |
954 | int dialect ATTRIBUTE_UNUSED, | 1389 | ppc_cpu_t dialect ATTRIBUTE_UNUSED, |
955 | const char **errmsg) | 1390 | const char **errmsg ATTRIBUTE_UNUSED) |
956 | { | 1391 | { |
957 | if ((value & 7) != 0) | 1392 | return insn | (value & 0xffc1) | ((value & 0x3e) << 15); |
958 | *errmsg = _("offset not a multiple of 8"); | ||
959 | if ((value > 248) != 0) | ||
960 | *errmsg = _("offset greater than 248"); | ||
961 | return insn | ((value & 0xf8) << 8); | ||
962 | } | 1393 | } |
963 | 1394 | ||
964 | static long | 1395 | static long |
965 | extract_ev8 (unsigned long insn, | 1396 | extract_dxd (unsigned long insn, |
966 | int dialect ATTRIBUTE_UNUSED, | 1397 | ppc_cpu_t dialect ATTRIBUTE_UNUSED, |
967 | int *invalid ATTRIBUTE_UNUSED) | 1398 | int *invalid ATTRIBUTE_UNUSED) |
968 | { | 1399 | { |
969 | return (insn >> 8) & 0xf8; | 1400 | unsigned long dxd = (insn & 0xffc1) | ((insn >> 15) & 0x3e); |
1401 | return (dxd ^ 0x8000) - 0x8000; | ||
970 | } | 1402 | } |
971 | 1403 | ||
972 | /* The DS field in a DS form instruction. This is like D, but the | ||
973 | lower two bits are forced to zero. */ | ||
974 | |||
975 | static unsigned long | 1404 | static unsigned long |
976 | insert_ds (unsigned long insn, | 1405 | insert_dxdn (unsigned long insn, |
977 | long value, | ||
978 | int dialect ATTRIBUTE_UNUSED, | ||
979 | const char **errmsg) | ||
980 | { | ||
981 | if ((value & 3) != 0) | ||
982 | *errmsg = _("offset not a multiple of 4"); | ||
983 | return insn | (value & 0xfffc); | ||
984 | } | ||
985 | |||
986 | static long | ||
987 | extract_ds (unsigned long insn, | ||
988 | int dialect ATTRIBUTE_UNUSED, | ||
989 | int *invalid ATTRIBUTE_UNUSED) | ||
990 | { | ||
991 | return ((insn & 0xfffc) ^ 0x8000) - 0x8000; | ||
992 | } | ||
993 | |||
994 | /* The DE field in a DE form instruction. */ | ||
995 | |||
996 | static unsigned long | ||
997 | insert_de (unsigned long insn, | ||
998 | long value, | ||
999 | int dialect ATTRIBUTE_UNUSED, | ||
1000 | const char **errmsg) | ||
1001 | { | ||
1002 | if (value > 2047 || value < -2048) | ||
1003 | *errmsg = _("offset not between -2048 and 2047"); | ||
1004 | return insn | ((value << 4) & 0xfff0); | ||
1005 | } | ||
1006 | |||
1007 | static long | ||
1008 | extract_de (unsigned long insn, | ||
1009 | int dialect ATTRIBUTE_UNUSED, | ||
1010 | int *invalid ATTRIBUTE_UNUSED) | ||
1011 | { | ||
1012 | return (insn & 0xfff0) >> 4; | ||
1013 | } | ||
1014 | |||
1015 | /* The DES field in a DES form instruction. */ | ||
1016 | |||
1017 | static unsigned long | ||
1018 | insert_des (unsigned long insn, | ||
1019 | long value, | 1406 | long value, |
1020 | int dialect ATTRIBUTE_UNUSED, | 1407 | ppc_cpu_t dialect ATTRIBUTE_UNUSED, |
1021 | const char **errmsg) | 1408 | const char **errmsg ATTRIBUTE_UNUSED) |
1022 | { | 1409 | { |
1023 | if (value > 8191 || value < -8192) | 1410 | return insert_dxd (insn, -value, dialect, errmsg); |
1024 | *errmsg = _("offset not between -8192 and 8191"); | ||
1025 | else if ((value & 3) != 0) | ||
1026 | *errmsg = _("offset not a multiple of 4"); | ||
1027 | return insn | ((value << 2) & 0xfff0); | ||
1028 | } | 1411 | } |
1029 | 1412 | ||
1030 | static long | 1413 | static long |
1031 | extract_des (unsigned long insn, | 1414 | extract_dxdn (unsigned long insn, |
1032 | int dialect ATTRIBUTE_UNUSED, | 1415 | ppc_cpu_t dialect ATTRIBUTE_UNUSED, |
1033 | int *invalid ATTRIBUTE_UNUSED) | 1416 | int *invalid ATTRIBUTE_UNUSED) |
1034 | { | 1417 | { |
1035 | return (((insn >> 2) & 0x3ffc) ^ 0x2000) - 0x2000; | 1418 | return -extract_dxd (insn, dialect, invalid); |
1036 | } | 1419 | } |
1037 | 1420 | ||
1038 | /* FXM mask in mfcr and mtcrf instructions. */ | 1421 | /* FXM mask in mfcr and mtcrf instructions. */ |
@@ -1040,7 +1423,7 @@ extract_des (unsigned long insn, | |||
1040 | static unsigned long | 1423 | static unsigned long |
1041 | insert_fxm (unsigned long insn, | 1424 | insert_fxm (unsigned long insn, |
1042 | long value, | 1425 | long value, |
1043 | int dialect, | 1426 | ppc_cpu_t dialect, |
1044 | const char **errmsg) | 1427 | const char **errmsg) |
1045 | { | 1428 | { |
1046 | /* If we're handling the mfocrf and mtocrf insns ensure that exactly | 1429 | /* If we're handling the mfocrf and mtocrf insns ensure that exactly |
@@ -1054,19 +1437,13 @@ insert_fxm (unsigned long insn, | |||
1054 | } | 1437 | } |
1055 | } | 1438 | } |
1056 | 1439 | ||
1057 | /* If the optional field on mfcr is missing that means we want to use | ||
1058 | the old form of the instruction that moves the whole cr. In that | ||
1059 | case we'll have VALUE zero. There doesn't seem to be a way to | ||
1060 | distinguish this from the case where someone writes mfcr %r3,0. */ | ||
1061 | else if (value == 0) | ||
1062 | ; | ||
1063 | |||
1064 | /* If only one bit of the FXM field is set, we can use the new form | 1440 | /* If only one bit of the FXM field is set, we can use the new form |
1065 | of the instruction, which is faster. Unlike the Power4 branch hint | 1441 | of the instruction, which is faster. Unlike the Power4 branch hint |
1066 | encoding, this is not backward compatible. Do not generate the | 1442 | encoding, this is not backward compatible. Do not generate the |
1067 | new form unless -mpower4 has been given, or -many and the two | 1443 | new form unless -mpower4 has been given, or -many and the two |
1068 | operand form of mfcr was used. */ | 1444 | operand form of mfcr was used. */ |
1069 | else if ((value & -value) == value | 1445 | else if (value > 0 |
1446 | && (value & -value) == value | ||
1070 | && ((dialect & PPC_OPCODE_POWER4) != 0 | 1447 | && ((dialect & PPC_OPCODE_POWER4) != 0 |
1071 | || ((dialect & PPC_OPCODE_ANY) != 0 | 1448 | || ((dialect & PPC_OPCODE_ANY) != 0 |
1072 | && (insn & (0x3ff << 1)) == 19 << 1))) | 1449 | && (insn & (0x3ff << 1)) == 19 << 1))) |
@@ -1075,7 +1452,10 @@ insert_fxm (unsigned long insn, | |||
1075 | /* Any other value on mfcr is an error. */ | 1452 | /* Any other value on mfcr is an error. */ |
1076 | else if ((insn & (0x3ff << 1)) == 19 << 1) | 1453 | else if ((insn & (0x3ff << 1)) == 19 << 1) |
1077 | { | 1454 | { |
1078 | *errmsg = _("ignoring invalid mfcr mask"); | 1455 | /* A value of -1 means we used the one operand form of |
1456 | mfcr which is valid. */ | ||
1457 | if (value != -1) | ||
1458 | *errmsg = _("invalid mfcr mask"); | ||
1079 | value = 0; | 1459 | value = 0; |
1080 | } | 1460 | } |
1081 | 1461 | ||
@@ -1084,7 +1464,7 @@ insert_fxm (unsigned long insn, | |||
1084 | 1464 | ||
1085 | static long | 1465 | static long |
1086 | extract_fxm (unsigned long insn, | 1466 | extract_fxm (unsigned long insn, |
1087 | int dialect ATTRIBUTE_UNUSED, | 1467 | ppc_cpu_t dialect ATTRIBUTE_UNUSED, |
1088 | int *invalid) | 1468 | int *invalid) |
1089 | { | 1469 | { |
1090 | long mask = (insn >> 12) & 0xff; | 1470 | long mask = (insn >> 12) & 0xff; |
@@ -1102,31 +1482,86 @@ extract_fxm (unsigned long insn, | |||
1102 | { | 1482 | { |
1103 | if (mask != 0) | 1483 | if (mask != 0) |
1104 | *invalid = 1; | 1484 | *invalid = 1; |
1485 | else | ||
1486 | mask = -1; | ||
1105 | } | 1487 | } |
1106 | 1488 | ||
1107 | return mask; | 1489 | return mask; |
1108 | } | 1490 | } |
1109 | 1491 | ||
1110 | /* The LI field in an I form instruction. The lower two bits are | 1492 | static unsigned long |
1111 | forced to zero. */ | 1493 | insert_li20 (unsigned long insn, |
1494 | long value, | ||
1495 | ppc_cpu_t dialect ATTRIBUTE_UNUSED, | ||
1496 | const char **errmsg ATTRIBUTE_UNUSED) | ||
1497 | { | ||
1498 | return insn | ((value & 0xf0000) >> 5) | ((value & 0x0f800) << 5) | (value & 0x7ff); | ||
1499 | } | ||
1500 | |||
1501 | static long | ||
1502 | extract_li20 (unsigned long insn, | ||
1503 | ppc_cpu_t dialect ATTRIBUTE_UNUSED, | ||
1504 | int *invalid ATTRIBUTE_UNUSED) | ||
1505 | { | ||
1506 | long ext = ((insn & 0x4000) == 0x4000) ? 0xfff00000 : 0x00000000; | ||
1507 | |||
1508 | return ext | ||
1509 | | (((insn >> 11) & 0xf) << 16) | ||
1510 | | (((insn >> 17) & 0xf) << 12) | ||
1511 | | (((insn >> 16) & 0x1) << 11) | ||
1512 | | (insn & 0x7ff); | ||
1513 | } | ||
1514 | |||
1515 | /* The 2-bit L field in a SYNC or WC field in a WAIT instruction. | ||
1516 | For SYNC, some L values are reserved: | ||
1517 | * Value 3 is reserved on newer server cpus. | ||
1518 | * Values 2 and 3 are reserved on all other cpus. */ | ||
1112 | 1519 | ||
1113 | static unsigned long | 1520 | static unsigned long |
1114 | insert_li (unsigned long insn, | 1521 | insert_ls (unsigned long insn, |
1115 | long value, | 1522 | long value, |
1116 | int dialect ATTRIBUTE_UNUSED, | 1523 | ppc_cpu_t dialect, |
1117 | const char **errmsg) | 1524 | const char **errmsg) |
1118 | { | 1525 | { |
1119 | if ((value & 3) != 0) | 1526 | /* For SYNC, some L values are illegal. */ |
1120 | *errmsg = _("ignoring least significant bits in branch offset"); | 1527 | if (((insn >> 1) & 0x3ff) == 598) |
1121 | return insn | (value & 0x3fffffc); | 1528 | { |
1529 | long max_lvalue = (dialect & PPC_OPCODE_POWER4) ? 2 : 1; | ||
1530 | if (value > max_lvalue) | ||
1531 | { | ||
1532 | *errmsg = _("illegal L operand value"); | ||
1533 | return insn; | ||
1534 | } | ||
1535 | } | ||
1536 | |||
1537 | return insn | ((value & 0x3) << 21); | ||
1122 | } | 1538 | } |
1123 | 1539 | ||
1124 | static long | 1540 | /* The 4-bit E field in a sync instruction that accepts 2 operands. |
1125 | extract_li (unsigned long insn, | 1541 | If ESYNC is non-zero, then the L field must be either 0 or 1 and |
1126 | int dialect ATTRIBUTE_UNUSED, | 1542 | the complement of ESYNC-bit2. */ |
1127 | int *invalid ATTRIBUTE_UNUSED) | 1543 | |
1544 | static unsigned long | ||
1545 | insert_esync (unsigned long insn, | ||
1546 | long value, | ||
1547 | ppc_cpu_t dialect, | ||
1548 | const char **errmsg) | ||
1128 | { | 1549 | { |
1129 | return ((insn & 0x3fffffc) ^ 0x2000000) - 0x2000000; | 1550 | unsigned long ls = (insn >> 21) & 0x03; |
1551 | |||
1552 | if (value == 0) | ||
1553 | { | ||
1554 | if (((dialect & PPC_OPCODE_E6500) != 0 && ls > 1) | ||
1555 | || ((dialect & PPC_OPCODE_POWER9) != 0 && ls > 2)) | ||
1556 | *errmsg = _("illegal L operand value"); | ||
1557 | return insn; | ||
1558 | } | ||
1559 | |||
1560 | if ((ls & ~0x1) | ||
1561 | || (((value >> 1) & 0x1) ^ ls) == 0) | ||
1562 | *errmsg = _("incompatible L operand value"); | ||
1563 | |||
1564 | return insn | ((value & 0xf) << 16); | ||
1130 | } | 1565 | } |
1131 | 1566 | ||
1132 | /* The MB and ME fields in an M form instruction expressed as a single | 1567 | /* The MB and ME fields in an M form instruction expressed as a single |
@@ -1137,7 +1572,7 @@ extract_li (unsigned long insn, | |||
1137 | static unsigned long | 1572 | static unsigned long |
1138 | insert_mbe (unsigned long insn, | 1573 | insert_mbe (unsigned long insn, |
1139 | long value, | 1574 | long value, |
1140 | int dialect ATTRIBUTE_UNUSED, | 1575 | ppc_cpu_t dialect ATTRIBUTE_UNUSED, |
1141 | const char **errmsg) | 1576 | const char **errmsg) |
1142 | { | 1577 | { |
1143 | unsigned long uval, mask; | 1578 | unsigned long uval, mask; |
@@ -1189,7 +1624,7 @@ insert_mbe (unsigned long insn, | |||
1189 | 1624 | ||
1190 | static long | 1625 | static long |
1191 | extract_mbe (unsigned long insn, | 1626 | extract_mbe (unsigned long insn, |
1192 | int dialect ATTRIBUTE_UNUSED, | 1627 | ppc_cpu_t dialect ATTRIBUTE_UNUSED, |
1193 | int *invalid) | 1628 | int *invalid) |
1194 | { | 1629 | { |
1195 | long ret; | 1630 | long ret; |
@@ -1223,7 +1658,7 @@ extract_mbe (unsigned long insn, | |||
1223 | static unsigned long | 1658 | static unsigned long |
1224 | insert_mb6 (unsigned long insn, | 1659 | insert_mb6 (unsigned long insn, |
1225 | long value, | 1660 | long value, |
1226 | int dialect ATTRIBUTE_UNUSED, | 1661 | ppc_cpu_t dialect ATTRIBUTE_UNUSED, |
1227 | const char **errmsg ATTRIBUTE_UNUSED) | 1662 | const char **errmsg ATTRIBUTE_UNUSED) |
1228 | { | 1663 | { |
1229 | return insn | ((value & 0x1f) << 6) | (value & 0x20); | 1664 | return insn | ((value & 0x1f) << 6) | (value & 0x20); |
@@ -1231,7 +1666,7 @@ insert_mb6 (unsigned long insn, | |||
1231 | 1666 | ||
1232 | static long | 1667 | static long |
1233 | extract_mb6 (unsigned long insn, | 1668 | extract_mb6 (unsigned long insn, |
1234 | int dialect ATTRIBUTE_UNUSED, | 1669 | ppc_cpu_t dialect ATTRIBUTE_UNUSED, |
1235 | int *invalid ATTRIBUTE_UNUSED) | 1670 | int *invalid ATTRIBUTE_UNUSED) |
1236 | { | 1671 | { |
1237 | return ((insn >> 6) & 0x1f) | (insn & 0x20); | 1672 | return ((insn >> 6) & 0x1f) | (insn & 0x20); |
@@ -1240,22 +1675,9 @@ extract_mb6 (unsigned long insn, | |||
1240 | /* The NB field in an X form instruction. The value 32 is stored as | 1675 | /* The NB field in an X form instruction. The value 32 is stored as |
1241 | 0. */ | 1676 | 0. */ |
1242 | 1677 | ||
1243 | static unsigned long | ||
1244 | insert_nb (unsigned long insn, | ||
1245 | long value, | ||
1246 | int dialect ATTRIBUTE_UNUSED, | ||
1247 | const char **errmsg) | ||
1248 | { | ||
1249 | if (value < 0 || value > 32) | ||
1250 | *errmsg = _("value out of range"); | ||
1251 | if (value == 32) | ||
1252 | value = 0; | ||
1253 | return insn | ((value & 0x1f) << 11); | ||
1254 | } | ||
1255 | |||
1256 | static long | 1678 | static long |
1257 | extract_nb (unsigned long insn, | 1679 | extract_nb (unsigned long insn, |
1258 | int dialect ATTRIBUTE_UNUSED, | 1680 | ppc_cpu_t dialect ATTRIBUTE_UNUSED, |
1259 | int *invalid ATTRIBUTE_UNUSED) | 1681 | int *invalid ATTRIBUTE_UNUSED) |
1260 | { | 1682 | { |
1261 | long ret; | 1683 | long ret; |
@@ -1266,6 +1688,26 @@ extract_nb (unsigned long insn, | |||
1266 | return ret; | 1688 | return ret; |
1267 | } | 1689 | } |
1268 | 1690 | ||
1691 | /* The NB field in an lswi instruction, which has special value | ||
1692 | restrictions. The value 32 is stored as 0. */ | ||
1693 | |||
1694 | static unsigned long | ||
1695 | insert_nbi (unsigned long insn, | ||
1696 | long value, | ||
1697 | ppc_cpu_t dialect ATTRIBUTE_UNUSED, | ||
1698 | const char **errmsg ATTRIBUTE_UNUSED) | ||
1699 | { | ||
1700 | long rtvalue = (insn & RT_MASK) >> 21; | ||
1701 | long ravalue = (insn & RA_MASK) >> 16; | ||
1702 | |||
1703 | if (value == 0) | ||
1704 | value = 32; | ||
1705 | if (rtvalue + (value + 3) / 4 > (rtvalue > ravalue ? ravalue + 32 | ||
1706 | : ravalue)) | ||
1707 | *errmsg = _("address register in load range"); | ||
1708 | return insn | ((value & 0x1f) << 11); | ||
1709 | } | ||
1710 | |||
1269 | /* The NSI field in a D form instruction. This is the same as the SI | 1711 | /* The NSI field in a D form instruction. This is the same as the SI |
1270 | field, only negated. The extraction function always marks it as | 1712 | field, only negated. The extraction function always marks it as |
1271 | invalid, since we never want to recognize an instruction which uses | 1713 | invalid, since we never want to recognize an instruction which uses |
@@ -1274,7 +1716,7 @@ extract_nb (unsigned long insn, | |||
1274 | static unsigned long | 1716 | static unsigned long |
1275 | insert_nsi (unsigned long insn, | 1717 | insert_nsi (unsigned long insn, |
1276 | long value, | 1718 | long value, |
1277 | int dialect ATTRIBUTE_UNUSED, | 1719 | ppc_cpu_t dialect ATTRIBUTE_UNUSED, |
1278 | const char **errmsg ATTRIBUTE_UNUSED) | 1720 | const char **errmsg ATTRIBUTE_UNUSED) |
1279 | { | 1721 | { |
1280 | return insn | (-value & 0xffff); | 1722 | return insn | (-value & 0xffff); |
@@ -1282,7 +1724,7 @@ insert_nsi (unsigned long insn, | |||
1282 | 1724 | ||
1283 | static long | 1725 | static long |
1284 | extract_nsi (unsigned long insn, | 1726 | extract_nsi (unsigned long insn, |
1285 | int dialect ATTRIBUTE_UNUSED, | 1727 | ppc_cpu_t dialect ATTRIBUTE_UNUSED, |
1286 | int *invalid) | 1728 | int *invalid) |
1287 | { | 1729 | { |
1288 | *invalid = 1; | 1730 | *invalid = 1; |
@@ -1296,7 +1738,7 @@ extract_nsi (unsigned long insn, | |||
1296 | static unsigned long | 1738 | static unsigned long |
1297 | insert_ral (unsigned long insn, | 1739 | insert_ral (unsigned long insn, |
1298 | long value, | 1740 | long value, |
1299 | int dialect ATTRIBUTE_UNUSED, | 1741 | ppc_cpu_t dialect ATTRIBUTE_UNUSED, |
1300 | const char **errmsg) | 1742 | const char **errmsg) |
1301 | { | 1743 | { |
1302 | if (value == 0 | 1744 | if (value == 0 |
@@ -1311,7 +1753,7 @@ insert_ral (unsigned long insn, | |||
1311 | static unsigned long | 1753 | static unsigned long |
1312 | insert_ram (unsigned long insn, | 1754 | insert_ram (unsigned long insn, |
1313 | long value, | 1755 | long value, |
1314 | int dialect ATTRIBUTE_UNUSED, | 1756 | ppc_cpu_t dialect ATTRIBUTE_UNUSED, |
1315 | const char **errmsg) | 1757 | const char **errmsg) |
1316 | { | 1758 | { |
1317 | if ((unsigned long) value >= ((insn >> 21) & 0x1f)) | 1759 | if ((unsigned long) value >= ((insn >> 21) & 0x1f)) |
@@ -1319,13 +1761,13 @@ insert_ram (unsigned long insn, | |||
1319 | return insn | ((value & 0x1f) << 16); | 1761 | return insn | ((value & 0x1f) << 16); |
1320 | } | 1762 | } |
1321 | 1763 | ||
1322 | /* The RA field in the DQ form lq instruction, which has special | 1764 | /* The RA field in the DQ form lq or an lswx instruction, which have special |
1323 | value restrictions. */ | 1765 | value restrictions. */ |
1324 | 1766 | ||
1325 | static unsigned long | 1767 | static unsigned long |
1326 | insert_raq (unsigned long insn, | 1768 | insert_raq (unsigned long insn, |
1327 | long value, | 1769 | long value, |
1328 | int dialect ATTRIBUTE_UNUSED, | 1770 | ppc_cpu_t dialect ATTRIBUTE_UNUSED, |
1329 | const char **errmsg) | 1771 | const char **errmsg) |
1330 | { | 1772 | { |
1331 | long rtvalue = (insn & RT_MASK) >> 21; | 1773 | long rtvalue = (insn & RT_MASK) >> 21; |
@@ -1342,7 +1784,7 @@ insert_raq (unsigned long insn, | |||
1342 | static unsigned long | 1784 | static unsigned long |
1343 | insert_ras (unsigned long insn, | 1785 | insert_ras (unsigned long insn, |
1344 | long value, | 1786 | long value, |
1345 | int dialect ATTRIBUTE_UNUSED, | 1787 | ppc_cpu_t dialect ATTRIBUTE_UNUSED, |
1346 | const char **errmsg) | 1788 | const char **errmsg) |
1347 | { | 1789 | { |
1348 | if (value == 0) | 1790 | if (value == 0) |
@@ -1359,7 +1801,7 @@ insert_ras (unsigned long insn, | |||
1359 | static unsigned long | 1801 | static unsigned long |
1360 | insert_rbs (unsigned long insn, | 1802 | insert_rbs (unsigned long insn, |
1361 | long value ATTRIBUTE_UNUSED, | 1803 | long value ATTRIBUTE_UNUSED, |
1362 | int dialect ATTRIBUTE_UNUSED, | 1804 | ppc_cpu_t dialect ATTRIBUTE_UNUSED, |
1363 | const char **errmsg ATTRIBUTE_UNUSED) | 1805 | const char **errmsg ATTRIBUTE_UNUSED) |
1364 | { | 1806 | { |
1365 | return insn | (((insn >> 21) & 0x1f) << 11); | 1807 | return insn | (((insn >> 21) & 0x1f) << 11); |
@@ -1367,7 +1809,7 @@ insert_rbs (unsigned long insn, | |||
1367 | 1809 | ||
1368 | static long | 1810 | static long |
1369 | extract_rbs (unsigned long insn, | 1811 | extract_rbs (unsigned long insn, |
1370 | int dialect ATTRIBUTE_UNUSED, | 1812 | ppc_cpu_t dialect ATTRIBUTE_UNUSED, |
1371 | int *invalid) | 1813 | int *invalid) |
1372 | { | 1814 | { |
1373 | if (((insn >> 21) & 0x1f) != ((insn >> 11) & 0x1f)) | 1815 | if (((insn >> 21) & 0x1f) != ((insn >> 11) & 0x1f)) |
@@ -1375,32 +1817,155 @@ extract_rbs (unsigned long insn, | |||
1375 | return 0; | 1817 | return 0; |
1376 | } | 1818 | } |
1377 | 1819 | ||
1378 | /* The RT field of the DQ form lq instruction, which has special | 1820 | /* The RB field in an lswx instruction, which has special value |
1379 | value restrictions. */ | 1821 | restrictions. */ |
1380 | 1822 | ||
1381 | static unsigned long | 1823 | static unsigned long |
1382 | insert_rtq (unsigned long insn, | 1824 | insert_rbx (unsigned long insn, |
1383 | long value, | 1825 | long value, |
1384 | int dialect ATTRIBUTE_UNUSED, | 1826 | ppc_cpu_t dialect ATTRIBUTE_UNUSED, |
1385 | const char **errmsg) | 1827 | const char **errmsg) |
1386 | { | 1828 | { |
1387 | if ((value & 1) != 0) | 1829 | long rtvalue = (insn & RT_MASK) >> 21; |
1388 | *errmsg = _("target register operand must be even"); | 1830 | |
1389 | return insn | ((value & 0x1f) << 21); | 1831 | if (value == rtvalue) |
1832 | *errmsg = _("source and target register operands must be different"); | ||
1833 | return insn | ((value & 0x1f) << 11); | ||
1390 | } | 1834 | } |
1391 | 1835 | ||
1392 | /* The RS field of the DS form stq instruction, which has special | 1836 | /* The SCI8 field is made up of SCL and {U,N}I8 fields. */ |
1393 | value restrictions. */ | 1837 | static unsigned long |
1838 | insert_sci8 (unsigned long insn, | ||
1839 | long value, | ||
1840 | ppc_cpu_t dialect ATTRIBUTE_UNUSED, | ||
1841 | const char **errmsg) | ||
1842 | { | ||
1843 | unsigned int fill_scale = 0; | ||
1844 | unsigned long ui8 = value; | ||
1845 | |||
1846 | if ((ui8 & 0xffffff00) == 0) | ||
1847 | ; | ||
1848 | else if ((ui8 & 0xffffff00) == 0xffffff00) | ||
1849 | fill_scale = 0x400; | ||
1850 | else if ((ui8 & 0xffff00ff) == 0) | ||
1851 | { | ||
1852 | fill_scale = 1 << 8; | ||
1853 | ui8 >>= 8; | ||
1854 | } | ||
1855 | else if ((ui8 & 0xffff00ff) == 0xffff00ff) | ||
1856 | { | ||
1857 | fill_scale = 0x400 | (1 << 8); | ||
1858 | ui8 >>= 8; | ||
1859 | } | ||
1860 | else if ((ui8 & 0xff00ffff) == 0) | ||
1861 | { | ||
1862 | fill_scale = 2 << 8; | ||
1863 | ui8 >>= 16; | ||
1864 | } | ||
1865 | else if ((ui8 & 0xff00ffff) == 0xff00ffff) | ||
1866 | { | ||
1867 | fill_scale = 0x400 | (2 << 8); | ||
1868 | ui8 >>= 16; | ||
1869 | } | ||
1870 | else if ((ui8 & 0x00ffffff) == 0) | ||
1871 | { | ||
1872 | fill_scale = 3 << 8; | ||
1873 | ui8 >>= 24; | ||
1874 | } | ||
1875 | else if ((ui8 & 0x00ffffff) == 0x00ffffff) | ||
1876 | { | ||
1877 | fill_scale = 0x400 | (3 << 8); | ||
1878 | ui8 >>= 24; | ||
1879 | } | ||
1880 | else | ||
1881 | { | ||
1882 | *errmsg = _("illegal immediate value"); | ||
1883 | ui8 = 0; | ||
1884 | } | ||
1885 | |||
1886 | return insn | fill_scale | (ui8 & 0xff); | ||
1887 | } | ||
1888 | |||
1889 | static long | ||
1890 | extract_sci8 (unsigned long insn, | ||
1891 | ppc_cpu_t dialect ATTRIBUTE_UNUSED, | ||
1892 | int *invalid ATTRIBUTE_UNUSED) | ||
1893 | { | ||
1894 | int fill = insn & 0x400; | ||
1895 | int scale_factor = (insn & 0x300) >> 5; | ||
1896 | long value = (insn & 0xff) << scale_factor; | ||
1897 | |||
1898 | if (fill != 0) | ||
1899 | value |= ~((long) 0xff << scale_factor); | ||
1900 | return value; | ||
1901 | } | ||
1394 | 1902 | ||
1395 | static unsigned long | 1903 | static unsigned long |
1396 | insert_rsq (unsigned long insn, | 1904 | insert_sci8n (unsigned long insn, |
1397 | long value ATTRIBUTE_UNUSED, | 1905 | long value, |
1398 | int dialect ATTRIBUTE_UNUSED, | 1906 | ppc_cpu_t dialect, |
1399 | const char **errmsg) | 1907 | const char **errmsg) |
1400 | { | 1908 | { |
1401 | if ((value & 1) != 0) | 1909 | return insert_sci8 (insn, -value, dialect, errmsg); |
1402 | *errmsg = _("source register operand must be even"); | 1910 | } |
1403 | return insn | ((value & 0x1f) << 21); | 1911 | |
1912 | static long | ||
1913 | extract_sci8n (unsigned long insn, | ||
1914 | ppc_cpu_t dialect, | ||
1915 | int *invalid) | ||
1916 | { | ||
1917 | return -extract_sci8 (insn, dialect, invalid); | ||
1918 | } | ||
1919 | |||
1920 | static unsigned long | ||
1921 | insert_sd4h (unsigned long insn, | ||
1922 | long value, | ||
1923 | ppc_cpu_t dialect ATTRIBUTE_UNUSED, | ||
1924 | const char **errmsg ATTRIBUTE_UNUSED) | ||
1925 | { | ||
1926 | return insn | ((value & 0x1e) << 7); | ||
1927 | } | ||
1928 | |||
1929 | static long | ||
1930 | extract_sd4h (unsigned long insn, | ||
1931 | ppc_cpu_t dialect ATTRIBUTE_UNUSED, | ||
1932 | int *invalid ATTRIBUTE_UNUSED) | ||
1933 | { | ||
1934 | return ((insn >> 8) & 0xf) << 1; | ||
1935 | } | ||
1936 | |||
1937 | static unsigned long | ||
1938 | insert_sd4w (unsigned long insn, | ||
1939 | long value, | ||
1940 | ppc_cpu_t dialect ATTRIBUTE_UNUSED, | ||
1941 | const char **errmsg ATTRIBUTE_UNUSED) | ||
1942 | { | ||
1943 | return insn | ((value & 0x3c) << 6); | ||
1944 | } | ||
1945 | |||
1946 | static long | ||
1947 | extract_sd4w (unsigned long insn, | ||
1948 | ppc_cpu_t dialect ATTRIBUTE_UNUSED, | ||
1949 | int *invalid ATTRIBUTE_UNUSED) | ||
1950 | { | ||
1951 | return ((insn >> 8) & 0xf) << 2; | ||
1952 | } | ||
1953 | |||
1954 | static unsigned long | ||
1955 | insert_oimm (unsigned long insn, | ||
1956 | long value, | ||
1957 | ppc_cpu_t dialect ATTRIBUTE_UNUSED, | ||
1958 | const char **errmsg ATTRIBUTE_UNUSED) | ||
1959 | { | ||
1960 | return insn | (((value - 1) & 0x1f) << 4); | ||
1961 | } | ||
1962 | |||
1963 | static long | ||
1964 | extract_oimm (unsigned long insn, | ||
1965 | ppc_cpu_t dialect ATTRIBUTE_UNUSED, | ||
1966 | int *invalid ATTRIBUTE_UNUSED) | ||
1967 | { | ||
1968 | return ((insn >> 4) & 0x1f) + 1; | ||
1404 | } | 1969 | } |
1405 | 1970 | ||
1406 | /* The SH field in an MD form instruction. This is split. */ | 1971 | /* The SH field in an MD form instruction. This is split. */ |
@@ -1408,18 +1973,26 @@ insert_rsq (unsigned long insn, | |||
1408 | static unsigned long | 1973 | static unsigned long |
1409 | insert_sh6 (unsigned long insn, | 1974 | insert_sh6 (unsigned long insn, |
1410 | long value, | 1975 | long value, |
1411 | int dialect ATTRIBUTE_UNUSED, | 1976 | ppc_cpu_t dialect ATTRIBUTE_UNUSED, |
1412 | const char **errmsg ATTRIBUTE_UNUSED) | 1977 | const char **errmsg ATTRIBUTE_UNUSED) |
1413 | { | 1978 | { |
1414 | return insn | ((value & 0x1f) << 11) | ((value & 0x20) >> 4); | 1979 | /* SH6 operand in the rldixor instructions. */ |
1980 | if (PPC_OP (insn) == 4) | ||
1981 | return insn | ((value & 0x1f) << 6) | ((value & 0x20) >> 5); | ||
1982 | else | ||
1983 | return insn | ((value & 0x1f) << 11) | ((value & 0x20) >> 4); | ||
1415 | } | 1984 | } |
1416 | 1985 | ||
1417 | static long | 1986 | static long |
1418 | extract_sh6 (unsigned long insn, | 1987 | extract_sh6 (unsigned long insn, |
1419 | int dialect ATTRIBUTE_UNUSED, | 1988 | ppc_cpu_t dialect ATTRIBUTE_UNUSED, |
1420 | int *invalid ATTRIBUTE_UNUSED) | 1989 | int *invalid ATTRIBUTE_UNUSED) |
1421 | { | 1990 | { |
1422 | return ((insn >> 11) & 0x1f) | ((insn << 4) & 0x20); | 1991 | /* SH6 operand in the rldixor instructions. */ |
1992 | if (PPC_OP (insn) == 4) | ||
1993 | return ((insn >> 6) & 0x1f) | ((insn << 5) & 0x20); | ||
1994 | else | ||
1995 | return ((insn >> 11) & 0x1f) | ((insn << 4) & 0x20); | ||
1423 | } | 1996 | } |
1424 | 1997 | ||
1425 | /* The SPR field in an XFX form instruction. This is flipped--the | 1998 | /* The SPR field in an XFX form instruction. This is flipped--the |
@@ -1428,7 +2001,7 @@ extract_sh6 (unsigned long insn, | |||
1428 | static unsigned long | 2001 | static unsigned long |
1429 | insert_spr (unsigned long insn, | 2002 | insert_spr (unsigned long insn, |
1430 | long value, | 2003 | long value, |
1431 | int dialect ATTRIBUTE_UNUSED, | 2004 | ppc_cpu_t dialect ATTRIBUTE_UNUSED, |
1432 | const char **errmsg ATTRIBUTE_UNUSED) | 2005 | const char **errmsg ATTRIBUTE_UNUSED) |
1433 | { | 2006 | { |
1434 | return insn | ((value & 0x1f) << 16) | ((value & 0x3e0) << 6); | 2007 | return insn | ((value & 0x1f) << 16) | ((value & 0x3e0) << 6); |
@@ -1436,26 +2009,23 @@ insert_spr (unsigned long insn, | |||
1436 | 2009 | ||
1437 | static long | 2010 | static long |
1438 | extract_spr (unsigned long insn, | 2011 | extract_spr (unsigned long insn, |
1439 | int dialect ATTRIBUTE_UNUSED, | 2012 | ppc_cpu_t dialect ATTRIBUTE_UNUSED, |
1440 | int *invalid ATTRIBUTE_UNUSED) | 2013 | int *invalid ATTRIBUTE_UNUSED) |
1441 | { | 2014 | { |
1442 | return ((insn >> 16) & 0x1f) | ((insn >> 6) & 0x3e0); | 2015 | return ((insn >> 16) & 0x1f) | ((insn >> 6) & 0x3e0); |
1443 | } | 2016 | } |
1444 | 2017 | ||
1445 | /* Some dialects have 8 SPRG registers instead of the standard 4. */ | 2018 | /* Some dialects have 8 SPRG registers instead of the standard 4. */ |
2019 | #define ALLOW8_SPRG (PPC_OPCODE_BOOKE | PPC_OPCODE_405) | ||
1446 | 2020 | ||
1447 | static unsigned long | 2021 | static unsigned long |
1448 | insert_sprg (unsigned long insn, | 2022 | insert_sprg (unsigned long insn, |
1449 | long value, | 2023 | long value, |
1450 | int dialect, | 2024 | ppc_cpu_t dialect, |
1451 | const char **errmsg) | 2025 | const char **errmsg) |
1452 | { | 2026 | { |
1453 | /* This check uses PPC_OPCODE_403 because PPC405 is later defined | ||
1454 | as a synonym. If ever a 405 specific dialect is added this | ||
1455 | check should use that instead. */ | ||
1456 | if (value > 7 | 2027 | if (value > 7 |
1457 | || (value > 3 | 2028 | || (value > 3 && (dialect & ALLOW8_SPRG) == 0)) |
1458 | && (dialect & (PPC_OPCODE_BOOKE | PPC_OPCODE_403)) == 0)) | ||
1459 | *errmsg = _("invalid sprg number"); | 2029 | *errmsg = _("invalid sprg number"); |
1460 | 2030 | ||
1461 | /* If this is mfsprg4..7 then use spr 260..263 which can be read in | 2031 | /* If this is mfsprg4..7 then use spr 260..263 which can be read in |
@@ -1468,54 +2038,272 @@ insert_sprg (unsigned long insn, | |||
1468 | 2038 | ||
1469 | static long | 2039 | static long |
1470 | extract_sprg (unsigned long insn, | 2040 | extract_sprg (unsigned long insn, |
1471 | int dialect, | 2041 | ppc_cpu_t dialect, |
1472 | int *invalid) | 2042 | int *invalid) |
1473 | { | 2043 | { |
1474 | unsigned long val = (insn >> 16) & 0x1f; | 2044 | unsigned long val = (insn >> 16) & 0x1f; |
1475 | 2045 | ||
1476 | /* mfsprg can use 260..263 and 272..279. mtsprg only uses spr 272..279 | 2046 | /* mfsprg can use 260..263 and 272..279. mtsprg only uses spr 272..279 |
1477 | If not BOOKE or 405, then both use only 272..275. */ | 2047 | If not BOOKE, 405 or VLE, then both use only 272..275. */ |
1478 | if (val <= 3 | 2048 | if ((val - 0x10 > 3 && (dialect & ALLOW8_SPRG) == 0) |
1479 | || (val < 0x10 && (insn & 0x100) != 0) | 2049 | || (val - 0x10 > 7 && (insn & 0x100) != 0) |
1480 | || (val - 0x10 > 3 | 2050 | || val <= 3 |
1481 | && (dialect & (PPC_OPCODE_BOOKE | PPC_OPCODE_403)) == 0)) | 2051 | || (val & 8) != 0) |
1482 | *invalid = 1; | 2052 | *invalid = 1; |
1483 | return val & 7; | 2053 | return val & 7; |
1484 | } | 2054 | } |
1485 | 2055 | ||
1486 | /* The TBR field in an XFX instruction. This is just like SPR, but it | 2056 | /* The TBR field in an XFX instruction. This is just like SPR, but it |
1487 | is optional. When TBR is omitted, it must be inserted as 268 (the | 2057 | is optional. */ |
1488 | magic number of the TB register). These functions treat 0 | ||
1489 | (indicating an omitted optional operand) as 268. This means that | ||
1490 | ``mftb 4,0'' is not handled correctly. This does not matter very | ||
1491 | much, since the architecture manual does not define mftb as | ||
1492 | accepting any values other than 268 or 269. */ | ||
1493 | |||
1494 | #define TB (268) | ||
1495 | 2058 | ||
1496 | static unsigned long | 2059 | static unsigned long |
1497 | insert_tbr (unsigned long insn, | 2060 | insert_tbr (unsigned long insn, |
1498 | long value, | 2061 | long value, |
1499 | int dialect ATTRIBUTE_UNUSED, | 2062 | ppc_cpu_t dialect ATTRIBUTE_UNUSED, |
1500 | const char **errmsg ATTRIBUTE_UNUSED) | 2063 | const char **errmsg) |
1501 | { | 2064 | { |
1502 | if (value == 0) | 2065 | if (value != 268 && value != 269) |
1503 | value = TB; | 2066 | *errmsg = _("invalid tbr number"); |
1504 | return insn | ((value & 0x1f) << 16) | ((value & 0x3e0) << 6); | 2067 | return insn | ((value & 0x1f) << 16) | ((value & 0x3e0) << 6); |
1505 | } | 2068 | } |
1506 | 2069 | ||
1507 | static long | 2070 | static long |
1508 | extract_tbr (unsigned long insn, | 2071 | extract_tbr (unsigned long insn, |
1509 | int dialect ATTRIBUTE_UNUSED, | 2072 | ppc_cpu_t dialect ATTRIBUTE_UNUSED, |
1510 | int *invalid ATTRIBUTE_UNUSED) | 2073 | int *invalid) |
1511 | { | 2074 | { |
1512 | long ret; | 2075 | long ret; |
1513 | 2076 | ||
1514 | ret = ((insn >> 16) & 0x1f) | ((insn >> 6) & 0x3e0); | 2077 | ret = ((insn >> 16) & 0x1f) | ((insn >> 6) & 0x3e0); |
1515 | if (ret == TB) | 2078 | if (ret != 268 && ret != 269) |
1516 | ret = 0; | 2079 | *invalid = 1; |
1517 | return ret; | 2080 | return ret; |
1518 | } | 2081 | } |
2082 | |||
2083 | /* The XT and XS fields in an XX1 or XX3 form instruction. This is split. */ | ||
2084 | |||
2085 | static unsigned long | ||
2086 | insert_xt6 (unsigned long insn, | ||
2087 | long value, | ||
2088 | ppc_cpu_t dialect ATTRIBUTE_UNUSED, | ||
2089 | const char **errmsg ATTRIBUTE_UNUSED) | ||
2090 | { | ||
2091 | return insn | ((value & 0x1f) << 21) | ((value & 0x20) >> 5); | ||
2092 | } | ||
2093 | |||
2094 | static long | ||
2095 | extract_xt6 (unsigned long insn, | ||
2096 | ppc_cpu_t dialect ATTRIBUTE_UNUSED, | ||
2097 | int *invalid ATTRIBUTE_UNUSED) | ||
2098 | { | ||
2099 | return ((insn << 5) & 0x20) | ((insn >> 21) & 0x1f); | ||
2100 | } | ||
2101 | |||
2102 | /* The XT and XS fields in an DQ form VSX instruction. This is split. */ | ||
2103 | static unsigned long | ||
2104 | insert_xtq6 (unsigned long insn, | ||
2105 | long value, | ||
2106 | ppc_cpu_t dialect ATTRIBUTE_UNUSED, | ||
2107 | const char **errmsg ATTRIBUTE_UNUSED) | ||
2108 | { | ||
2109 | return insn | ((value & 0x1f) << 21) | ((value & 0x20) >> 2); | ||
2110 | } | ||
2111 | |||
2112 | static long | ||
2113 | extract_xtq6 (unsigned long insn, | ||
2114 | ppc_cpu_t dialect ATTRIBUTE_UNUSED, | ||
2115 | int *invalid ATTRIBUTE_UNUSED) | ||
2116 | { | ||
2117 | return ((insn << 2) & 0x20) | ((insn >> 21) & 0x1f); | ||
2118 | } | ||
2119 | |||
2120 | /* The XA field in an XX3 form instruction. This is split. */ | ||
2121 | |||
2122 | static unsigned long | ||
2123 | insert_xa6 (unsigned long insn, | ||
2124 | long value, | ||
2125 | ppc_cpu_t dialect ATTRIBUTE_UNUSED, | ||
2126 | const char **errmsg ATTRIBUTE_UNUSED) | ||
2127 | { | ||
2128 | return insn | ((value & 0x1f) << 16) | ((value & 0x20) >> 3); | ||
2129 | } | ||
2130 | |||
2131 | static long | ||
2132 | extract_xa6 (unsigned long insn, | ||
2133 | ppc_cpu_t dialect ATTRIBUTE_UNUSED, | ||
2134 | int *invalid ATTRIBUTE_UNUSED) | ||
2135 | { | ||
2136 | return ((insn << 3) & 0x20) | ((insn >> 16) & 0x1f); | ||
2137 | } | ||
2138 | |||
2139 | /* The XB field in an XX3 form instruction. This is split. */ | ||
2140 | |||
2141 | static unsigned long | ||
2142 | insert_xb6 (unsigned long insn, | ||
2143 | long value, | ||
2144 | ppc_cpu_t dialect ATTRIBUTE_UNUSED, | ||
2145 | const char **errmsg ATTRIBUTE_UNUSED) | ||
2146 | { | ||
2147 | return insn | ((value & 0x1f) << 11) | ((value & 0x20) >> 4); | ||
2148 | } | ||
2149 | |||
2150 | static long | ||
2151 | extract_xb6 (unsigned long insn, | ||
2152 | ppc_cpu_t dialect ATTRIBUTE_UNUSED, | ||
2153 | int *invalid ATTRIBUTE_UNUSED) | ||
2154 | { | ||
2155 | return ((insn << 4) & 0x20) | ((insn >> 11) & 0x1f); | ||
2156 | } | ||
2157 | |||
2158 | /* The XB field in an XX3 form instruction when it must be the same as | ||
2159 | the XA field in the instruction. This is used for extended | ||
2160 | mnemonics like xvmovdp. This operand is marked FAKE. The insertion | ||
2161 | function just copies the XA field into the XB field, and the | ||
2162 | extraction function just checks that the fields are the same. */ | ||
2163 | |||
2164 | static unsigned long | ||
2165 | insert_xb6s (unsigned long insn, | ||
2166 | long value ATTRIBUTE_UNUSED, | ||
2167 | ppc_cpu_t dialect ATTRIBUTE_UNUSED, | ||
2168 | const char **errmsg ATTRIBUTE_UNUSED) | ||
2169 | { | ||
2170 | return insn | (((insn >> 16) & 0x1f) << 11) | (((insn >> 2) & 0x1) << 1); | ||
2171 | } | ||
2172 | |||
2173 | static long | ||
2174 | extract_xb6s (unsigned long insn, | ||
2175 | ppc_cpu_t dialect ATTRIBUTE_UNUSED, | ||
2176 | int *invalid) | ||
2177 | { | ||
2178 | if ((((insn >> 16) & 0x1f) != ((insn >> 11) & 0x1f)) | ||
2179 | || (((insn >> 2) & 0x1) != ((insn >> 1) & 0x1))) | ||
2180 | *invalid = 1; | ||
2181 | return 0; | ||
2182 | } | ||
2183 | |||
2184 | /* The XC field in an XX4 form instruction. This is split. */ | ||
2185 | |||
2186 | static unsigned long | ||
2187 | insert_xc6 (unsigned long insn, | ||
2188 | long value, | ||
2189 | ppc_cpu_t dialect ATTRIBUTE_UNUSED, | ||
2190 | const char **errmsg ATTRIBUTE_UNUSED) | ||
2191 | { | ||
2192 | return insn | ((value & 0x1f) << 6) | ((value & 0x20) >> 2); | ||
2193 | } | ||
2194 | |||
2195 | static long | ||
2196 | extract_xc6 (unsigned long insn, | ||
2197 | ppc_cpu_t dialect ATTRIBUTE_UNUSED, | ||
2198 | int *invalid ATTRIBUTE_UNUSED) | ||
2199 | { | ||
2200 | return ((insn << 2) & 0x20) | ((insn >> 6) & 0x1f); | ||
2201 | } | ||
2202 | |||
2203 | static unsigned long | ||
2204 | insert_dm (unsigned long insn, | ||
2205 | long value, | ||
2206 | ppc_cpu_t dialect ATTRIBUTE_UNUSED, | ||
2207 | const char **errmsg) | ||
2208 | { | ||
2209 | if (value != 0 && value != 1) | ||
2210 | *errmsg = _("invalid constant"); | ||
2211 | return insn | (((value) ? 3 : 0) << 8); | ||
2212 | } | ||
2213 | |||
2214 | static long | ||
2215 | extract_dm (unsigned long insn, | ||
2216 | ppc_cpu_t dialect ATTRIBUTE_UNUSED, | ||
2217 | int *invalid) | ||
2218 | { | ||
2219 | long value; | ||
2220 | |||
2221 | value = (insn >> 8) & 3; | ||
2222 | if (value != 0 && value != 3) | ||
2223 | *invalid = 1; | ||
2224 | return (value) ? 1 : 0; | ||
2225 | } | ||
2226 | |||
2227 | /* The VLESIMM field in an I16A form instruction. This is split. */ | ||
2228 | |||
2229 | static unsigned long | ||
2230 | insert_vlesi (unsigned long insn, | ||
2231 | long value, | ||
2232 | ppc_cpu_t dialect ATTRIBUTE_UNUSED, | ||
2233 | const char **errmsg ATTRIBUTE_UNUSED) | ||
2234 | { | ||
2235 | return insn | ((value & 0xf800) << 10) | (value & 0x7ff); | ||
2236 | } | ||
2237 | |||
2238 | static long | ||
2239 | extract_vlesi (unsigned long insn, | ||
2240 | ppc_cpu_t dialect ATTRIBUTE_UNUSED, | ||
2241 | int *invalid ATTRIBUTE_UNUSED) | ||
2242 | { | ||
2243 | long value = ((insn >> 10) & 0xf800) | (insn & 0x7ff); | ||
2244 | value = (value ^ 0x8000) - 0x8000; | ||
2245 | return value; | ||
2246 | } | ||
2247 | |||
2248 | static unsigned long | ||
2249 | insert_vlensi (unsigned long insn, | ||
2250 | long value, | ||
2251 | ppc_cpu_t dialect ATTRIBUTE_UNUSED, | ||
2252 | const char **errmsg ATTRIBUTE_UNUSED) | ||
2253 | { | ||
2254 | value = -value; | ||
2255 | return insn | ((value & 0xf800) << 10) | (value & 0x7ff); | ||
2256 | } | ||
2257 | static long | ||
2258 | extract_vlensi (unsigned long insn, | ||
2259 | ppc_cpu_t dialect ATTRIBUTE_UNUSED, | ||
2260 | int *invalid ATTRIBUTE_UNUSED) | ||
2261 | { | ||
2262 | long value = ((insn >> 10) & 0xf800) | (insn & 0x7ff); | ||
2263 | value = (value ^ 0x8000) - 0x8000; | ||
2264 | /* Don't use for disassembly. */ | ||
2265 | *invalid = 1; | ||
2266 | return -value; | ||
2267 | } | ||
2268 | |||
2269 | /* The VLEUIMM field in an I16A form instruction. This is split. */ | ||
2270 | |||
2271 | static unsigned long | ||
2272 | insert_vleui (unsigned long insn, | ||
2273 | long value, | ||
2274 | ppc_cpu_t dialect ATTRIBUTE_UNUSED, | ||
2275 | const char **errmsg ATTRIBUTE_UNUSED) | ||
2276 | { | ||
2277 | return insn | ((value & 0xf800) << 10) | (value & 0x7ff); | ||
2278 | } | ||
2279 | |||
2280 | static long | ||
2281 | extract_vleui (unsigned long insn, | ||
2282 | ppc_cpu_t dialect ATTRIBUTE_UNUSED, | ||
2283 | int *invalid ATTRIBUTE_UNUSED) | ||
2284 | { | ||
2285 | return ((insn >> 10) & 0xf800) | (insn & 0x7ff); | ||
2286 | } | ||
2287 | |||
2288 | /* The VLEUIMML field in an I16L form instruction. This is split. */ | ||
2289 | |||
2290 | static unsigned long | ||
2291 | insert_vleil (unsigned long insn, | ||
2292 | long value, | ||
2293 | ppc_cpu_t dialect ATTRIBUTE_UNUSED, | ||
2294 | const char **errmsg ATTRIBUTE_UNUSED) | ||
2295 | { | ||
2296 | return insn | ((value & 0xf800) << 5) | (value & 0x7ff); | ||
2297 | } | ||
2298 | |||
2299 | static long | ||
2300 | extract_vleil (unsigned long insn, | ||
2301 | ppc_cpu_t dialect ATTRIBUTE_UNUSED, | ||
2302 | int *invalid ATTRIBUTE_UNUSED) | ||
2303 | { | ||
2304 | return ((insn >> 5) & 0xf800) | (insn & 0x7ff); | ||
2305 | } | ||
2306 | |||
1519 | 2307 | ||
1520 | /* Macros used to form opcodes. */ | 2308 | /* Macros used to form opcodes. */ |
1521 | 2309 | ||
@@ -1535,6 +2323,17 @@ extract_tbr (unsigned long insn, | |||
1535 | #define OPL(x,l) (OP (x) | ((((unsigned long)(l)) & 1) << 21)) | 2323 | #define OPL(x,l) (OP (x) | ((((unsigned long)(l)) & 1) << 21)) |
1536 | #define OPL_MASK OPL (0x3f,1) | 2324 | #define OPL_MASK OPL (0x3f,1) |
1537 | 2325 | ||
2326 | /* The main opcode combined with an update code in D form instruction. | ||
2327 | Used for extended mnemonics for VLE memory instructions. */ | ||
2328 | #define OPVUP(x,vup) (OP (x) | ((((unsigned long)(vup)) & 0xff) << 8)) | ||
2329 | #define OPVUP_MASK OPVUP (0x3f, 0xff) | ||
2330 | |||
2331 | /* The main opcode combined with an update code and the RT fields specified in | ||
2332 | D form instruction. Used for VLE volatile context save/restore | ||
2333 | instructions. */ | ||
2334 | #define OPVUPRT(x,vup,rt) (OPVUP (x, vup) | ((((unsigned long)(rt)) & 0x1f) << 21)) | ||
2335 | #define OPVUPRT_MASK OPVUPRT (0x3f, 0xff, 0x1f) | ||
2336 | |||
1538 | /* An A form instruction. */ | 2337 | /* An A form instruction. */ |
1539 | #define A(op, xop, rc) (OP (op) | ((((unsigned long)(xop)) & 0x1f) << 1) | (((unsigned long)(rc)) & 1)) | 2338 | #define A(op, xop, rc) (OP (op) | ((((unsigned long)(xop)) & 0x1f) << 1) | (((unsigned long)(rc)) & 1)) |
1540 | #define A_MASK A (0x3f, 0x1f, 1) | 2339 | #define A_MASK A (0x3f, 0x1f, 1) |
@@ -1555,6 +2354,43 @@ extract_tbr (unsigned long insn, | |||
1555 | #define B(op, aa, lk) (OP (op) | ((((unsigned long)(aa)) & 1) << 1) | ((lk) & 1)) | 2354 | #define B(op, aa, lk) (OP (op) | ((((unsigned long)(aa)) & 1) << 1) | ((lk) & 1)) |
1556 | #define B_MASK B (0x3f, 1, 1) | 2355 | #define B_MASK B (0x3f, 1, 1) |
1557 | 2356 | ||
2357 | /* A BD8 form instruction. This is a 16-bit instruction. */ | ||
2358 | #define BD8(op, aa, lk) (((((unsigned long)(op)) & 0x3f) << 10) | (((aa) & 1) << 9) | (((lk) & 1) << 8)) | ||
2359 | #define BD8_MASK BD8 (0x3f, 1, 1) | ||
2360 | |||
2361 | /* Another BD8 form instruction. This is a 16-bit instruction. */ | ||
2362 | #define BD8IO(op) ((((unsigned long)(op)) & 0x1f) << 11) | ||
2363 | #define BD8IO_MASK BD8IO (0x1f) | ||
2364 | |||
2365 | /* A BD8 form instruction for simplified mnemonics. */ | ||
2366 | #define EBD8IO(op, bo, bi) (BD8IO ((op)) | ((bo) << 10) | ((bi) << 8)) | ||
2367 | /* A mask that excludes BO32 and BI32. */ | ||
2368 | #define EBD8IO1_MASK 0xf800 | ||
2369 | /* A mask that includes BO32 and excludes BI32. */ | ||
2370 | #define EBD8IO2_MASK 0xfc00 | ||
2371 | /* A mask that include BO32 AND BI32. */ | ||
2372 | #define EBD8IO3_MASK 0xff00 | ||
2373 | |||
2374 | /* A BD15 form instruction. */ | ||
2375 | #define BD15(op, aa, lk) (OP (op) | ((((unsigned long)(aa)) & 0xf) << 22) | ((lk) & 1)) | ||
2376 | #define BD15_MASK BD15 (0x3f, 0xf, 1) | ||
2377 | |||
2378 | /* A BD15 form instruction for extended conditional branch mnemonics. */ | ||
2379 | #define EBD15(op, aa, bo, lk) (((op) & 0x3f) << 26) | (((aa) & 0xf) << 22) | (((bo) & 0x3) << 20) | ((lk) & 1) | ||
2380 | #define EBD15_MASK 0xfff00001 | ||
2381 | |||
2382 | /* A BD15 form instruction for extended conditional branch mnemonics with BI. */ | ||
2383 | #define EBD15BI(op, aa, bo, bi, lk) (((op) & 0x3f) << 26) \ | ||
2384 | | (((aa) & 0xf) << 22) \ | ||
2385 | | (((bo) & 0x3) << 20) \ | ||
2386 | | (((bi) & 0x3) << 16) \ | ||
2387 | | ((lk) & 1) | ||
2388 | #define EBD15BI_MASK 0xfff30001 | ||
2389 | |||
2390 | /* A BD24 form instruction. */ | ||
2391 | #define BD24(op, aa, lk) (OP (op) | ((((unsigned long)(aa)) & 1) << 25) | ((lk) & 1)) | ||
2392 | #define BD24_MASK BD24 (0x3f, 1, 1) | ||
2393 | |||
1558 | /* A B form instruction setting the BO field. */ | 2394 | /* A B form instruction setting the BO field. */ |
1559 | #define BBO(op, bo, aa, lk) (B ((op), (aa), (lk)) | ((((unsigned long)(bo)) & 0x1f) << 21)) | 2395 | #define BBO(op, bo, aa, lk) (B ((op), (aa), (lk)) | ((((unsigned long)(bo)) & 0x1f) << 21)) |
1560 | #define BBO_MASK BBO (0x3f, 0x1f, 1, 1) | 2396 | #define BBO_MASK BBO (0x3f, 0x1f, 1, 1) |
@@ -1562,7 +2398,7 @@ extract_tbr (unsigned long insn, | |||
1562 | /* A BBO_MASK with the y bit of the BO field removed. This permits | 2398 | /* A BBO_MASK with the y bit of the BO field removed. This permits |
1563 | matching a conditional branch regardless of the setting of the y | 2399 | matching a conditional branch regardless of the setting of the y |
1564 | bit. Similarly for the 'at' bits used for power4 branch hints. */ | 2400 | bit. Similarly for the 'at' bits used for power4 branch hints. */ |
1565 | #define Y_MASK (((unsigned long) 1) << 21) | 2401 | #define Y_MASK (((unsigned long) 1) << 21) |
1566 | #define AT1_MASK (((unsigned long) 3) << 21) | 2402 | #define AT1_MASK (((unsigned long) 3) << 21) |
1567 | #define AT2_MASK (((unsigned long) 9) << 21) | 2403 | #define AT2_MASK (((unsigned long) 9) << 21) |
1568 | #define BBOY_MASK (BBO_MASK &~ Y_MASK) | 2404 | #define BBOY_MASK (BBO_MASK &~ Y_MASK) |
@@ -1583,6 +2419,12 @@ extract_tbr (unsigned long insn, | |||
1583 | #define BBOYBI_MASK (BBOYCB_MASK | BI_MASK) | 2419 | #define BBOYBI_MASK (BBOYCB_MASK | BI_MASK) |
1584 | #define BBOATBI_MASK (BBOAT2CB_MASK | BI_MASK) | 2420 | #define BBOATBI_MASK (BBOAT2CB_MASK | BI_MASK) |
1585 | 2421 | ||
2422 | /* A VLE C form instruction. */ | ||
2423 | #define C_LK(x, lk) (((((unsigned long)(x)) & 0x7fff) << 1) | ((lk) & 1)) | ||
2424 | #define C_LK_MASK C_LK(0x7fff, 1) | ||
2425 | #define C(x) ((((unsigned long)(x)) & 0xffff)) | ||
2426 | #define C_MASK C(0xffff) | ||
2427 | |||
1586 | /* An Context form instruction. */ | 2428 | /* An Context form instruction. */ |
1587 | #define CTX(op, xop) (OP (op) | (((unsigned long)(xop)) & 0x7)) | 2429 | #define CTX(op, xop) (OP (op) | (((unsigned long)(xop)) & 0x7)) |
1588 | #define CTX_MASK CTX(0x3f, 0x7) | 2430 | #define CTX_MASK CTX(0x3f, 0x7) |
@@ -1594,22 +2436,46 @@ extract_tbr (unsigned long insn, | |||
1594 | /* The main opcode mask with the RA field clear. */ | 2436 | /* The main opcode mask with the RA field clear. */ |
1595 | #define DRA_MASK (OP_MASK | RA_MASK) | 2437 | #define DRA_MASK (OP_MASK | RA_MASK) |
1596 | 2438 | ||
2439 | /* A DQ form VSX instruction. */ | ||
2440 | #define DQX(op, xop) (OP (op) | ((xop) & 0x7)) | ||
2441 | #define DQX_MASK DQX (0x3f, 7) | ||
2442 | |||
1597 | /* A DS form instruction. */ | 2443 | /* A DS form instruction. */ |
1598 | #define DSO(op, xop) (OP (op) | ((xop) & 0x3)) | 2444 | #define DSO(op, xop) (OP (op) | ((xop) & 0x3)) |
1599 | #define DS_MASK DSO (0x3f, 3) | 2445 | #define DS_MASK DSO (0x3f, 3) |
1600 | 2446 | ||
1601 | /* A DE form instruction. */ | 2447 | /* An DX form instruction. */ |
1602 | #define DEO(op, xop) (OP (op) | ((xop) & 0xf)) | 2448 | #define DX(op, xop) (OP (op) | ((((unsigned long)(xop)) & 0x1f) << 1)) |
1603 | #define DE_MASK DEO (0x3e, 0xf) | 2449 | #define DX_MASK DX (0x3f, 0x1f) |
1604 | 2450 | ||
1605 | /* An EVSEL form instruction. */ | 2451 | /* An EVSEL form instruction. */ |
1606 | #define EVSEL(op, xop) (OP (op) | (((unsigned long)(xop)) & 0xff) << 3) | 2452 | #define EVSEL(op, xop) (OP (op) | (((unsigned long)(xop)) & 0xff) << 3) |
1607 | #define EVSEL_MASK EVSEL(0x3f, 0xff) | 2453 | #define EVSEL_MASK EVSEL(0x3f, 0xff) |
1608 | 2454 | ||
2455 | /* An IA16 form instruction. */ | ||
2456 | #define IA16(op, xop) (OP (op) | (((unsigned long)(xop)) & 0x1f) << 11) | ||
2457 | #define IA16_MASK IA16(0x3f, 0x1f) | ||
2458 | |||
2459 | /* An I16A form instruction. */ | ||
2460 | #define I16A(op, xop) (OP (op) | (((unsigned long)(xop)) & 0x1f) << 11) | ||
2461 | #define I16A_MASK I16A(0x3f, 0x1f) | ||
2462 | |||
2463 | /* An I16L form instruction. */ | ||
2464 | #define I16L(op, xop) (OP (op) | (((unsigned long)(xop)) & 0x1f) << 11) | ||
2465 | #define I16L_MASK I16L(0x3f, 0x1f) | ||
2466 | |||
2467 | /* An IM7 form instruction. */ | ||
2468 | #define IM7(op) ((((unsigned long)(op)) & 0x1f) << 11) | ||
2469 | #define IM7_MASK IM7(0x1f) | ||
2470 | |||
1609 | /* An M form instruction. */ | 2471 | /* An M form instruction. */ |
1610 | #define M(op, rc) (OP (op) | ((rc) & 1)) | 2472 | #define M(op, rc) (OP (op) | ((rc) & 1)) |
1611 | #define M_MASK M (0x3f, 1) | 2473 | #define M_MASK M (0x3f, 1) |
1612 | 2474 | ||
2475 | /* An LI20 form instruction. */ | ||
2476 | #define LI20(op, xop) (OP (op) | (((unsigned long)(xop)) & 0x1) << 15) | ||
2477 | #define LI20_MASK LI20(0x3f, 0x1) | ||
2478 | |||
1613 | /* An M form instruction with the ME field specified. */ | 2479 | /* An M form instruction with the ME field specified. */ |
1614 | #define MME(op, me, rc) (M ((op), (rc)) | ((((unsigned long)(me)) & 0x1f) << 1)) | 2480 | #define MME(op, me, rc) (M ((op), (rc)) | ((((unsigned long)(me)) & 0x1f) << 1)) |
1615 | 2481 | ||
@@ -1640,44 +2506,189 @@ extract_tbr (unsigned long insn, | |||
1640 | #define SC(op, sa, lk) (OP (op) | ((((unsigned long)(sa)) & 1) << 1) | ((lk) & 1)) | 2506 | #define SC(op, sa, lk) (OP (op) | ((((unsigned long)(sa)) & 1) << 1) | ((lk) & 1)) |
1641 | #define SC_MASK (OP_MASK | (((unsigned long)0x3ff) << 16) | (((unsigned long)1) << 1) | 1) | 2507 | #define SC_MASK (OP_MASK | (((unsigned long)0x3ff) << 16) | (((unsigned long)1) << 1) | 1) |
1642 | 2508 | ||
1643 | /* An VX form instruction. */ | 2509 | /* An SCI8 form instruction. */ |
2510 | #define SCI8(op, xop) (OP (op) | ((((unsigned long)(xop)) & 0x1f) << 11)) | ||
2511 | #define SCI8_MASK SCI8(0x3f, 0x1f) | ||
2512 | |||
2513 | /* An SCI8 form instruction. */ | ||
2514 | #define SCI8BF(op, fop, xop) (OP (op) | ((((unsigned long)(xop)) & 0x1f) << 11) | (((fop) & 7) << 23)) | ||
2515 | #define SCI8BF_MASK SCI8BF(0x3f, 7, 0x1f) | ||
2516 | |||
2517 | /* An SD4 form instruction. This is a 16-bit instruction. */ | ||
2518 | #define SD4(op) ((((unsigned long)(op)) & 0xf) << 12) | ||
2519 | #define SD4_MASK SD4(0xf) | ||
2520 | |||
2521 | /* An SE_IM5 form instruction. This is a 16-bit instruction. */ | ||
2522 | #define SE_IM5(op, xop) (((((unsigned long)(op)) & 0x3f) << 10) | (((xop) & 0x1) << 9)) | ||
2523 | #define SE_IM5_MASK SE_IM5(0x3f, 1) | ||
2524 | |||
2525 | /* An SE_R form instruction. This is a 16-bit instruction. */ | ||
2526 | #define SE_R(op, xop) (((((unsigned long)(op)) & 0x3f) << 10) | (((xop) & 0x3f) << 4)) | ||
2527 | #define SE_R_MASK SE_R(0x3f, 0x3f) | ||
2528 | |||
2529 | /* An SE_RR form instruction. This is a 16-bit instruction. */ | ||
2530 | #define SE_RR(op, xop) (((((unsigned long)(op)) & 0x3f) << 10) | (((xop) & 0x3) << 8)) | ||
2531 | #define SE_RR_MASK SE_RR(0x3f, 3) | ||
2532 | |||
2533 | /* A VX form instruction. */ | ||
1644 | #define VX(op, xop) (OP (op) | (((unsigned long)(xop)) & 0x7ff)) | 2534 | #define VX(op, xop) (OP (op) | (((unsigned long)(xop)) & 0x7ff)) |
1645 | 2535 | ||
1646 | /* The mask for an VX form instruction. */ | 2536 | /* The mask for an VX form instruction. */ |
1647 | #define VX_MASK VX(0x3f, 0x7ff) | 2537 | #define VX_MASK VX(0x3f, 0x7ff) |
1648 | 2538 | ||
1649 | /* An VA form instruction. */ | 2539 | /* A VX_MASK with the VA field fixed. */ |
2540 | #define VXVA_MASK (VX_MASK | (0x1f << 16)) | ||
2541 | |||
2542 | /* A VX_MASK with the VB field fixed. */ | ||
2543 | #define VXVB_MASK (VX_MASK | (0x1f << 11)) | ||
2544 | |||
2545 | /* A VX_MASK with the VA and VB fields fixed. */ | ||
2546 | #define VXVAVB_MASK (VX_MASK | (0x1f << 16) | (0x1f << 11)) | ||
2547 | |||
2548 | /* A VX_MASK with the VD and VA fields fixed. */ | ||
2549 | #define VXVDVA_MASK (VX_MASK | (0x1f << 21) | (0x1f << 16)) | ||
2550 | |||
2551 | /* A VX_MASK with a UIMM4 field. */ | ||
2552 | #define VXUIMM4_MASK (VX_MASK | (0x1 << 20)) | ||
2553 | |||
2554 | /* A VX_MASK with a UIMM3 field. */ | ||
2555 | #define VXUIMM3_MASK (VX_MASK | (0x3 << 19)) | ||
2556 | |||
2557 | /* A VX_MASK with a UIMM2 field. */ | ||
2558 | #define VXUIMM2_MASK (VX_MASK | (0x7 << 18)) | ||
2559 | |||
2560 | /* A VX_MASK with a PS field. */ | ||
2561 | #define VXPS_MASK (VX_MASK & ~(0x1 << 9)) | ||
2562 | |||
2563 | /* A VX_MASK with the VA field fixed with a PS field. */ | ||
2564 | #define VXVAPS_MASK ((VX_MASK | (0x1f << 16)) & ~(0x1 << 9)) | ||
2565 | |||
2566 | /* A VA form instruction. */ | ||
1650 | #define VXA(op, xop) (OP (op) | (((unsigned long)(xop)) & 0x03f)) | 2567 | #define VXA(op, xop) (OP (op) | (((unsigned long)(xop)) & 0x03f)) |
1651 | 2568 | ||
1652 | /* The mask for an VA form instruction. */ | 2569 | /* The mask for an VA form instruction. */ |
1653 | #define VXA_MASK VXA(0x3f, 0x3f) | 2570 | #define VXA_MASK VXA(0x3f, 0x3f) |
1654 | 2571 | ||
1655 | /* An VXR form instruction. */ | 2572 | /* A VXA_MASK with a SHB field. */ |
2573 | #define VXASHB_MASK (VXA_MASK | (1 << 10)) | ||
2574 | |||
2575 | /* A VXR form instruction. */ | ||
1656 | #define VXR(op, xop, rc) (OP (op) | (((rc) & 1) << 10) | (((unsigned long)(xop)) & 0x3ff)) | 2576 | #define VXR(op, xop, rc) (OP (op) | (((rc) & 1) << 10) | (((unsigned long)(xop)) & 0x3ff)) |
1657 | 2577 | ||
1658 | /* The mask for a VXR form instruction. */ | 2578 | /* The mask for a VXR form instruction. */ |
1659 | #define VXR_MASK VXR(0x3f, 0x3ff, 1) | 2579 | #define VXR_MASK VXR(0x3f, 0x3ff, 1) |
1660 | 2580 | ||
2581 | /* A VX form instruction with a VA tertiary opcode. */ | ||
2582 | #define VXVA(op, xop, vaop) (VX(op,xop) | (((vaop) & 0x1f) << 16)) | ||
2583 | |||
2584 | #define VXASH(op, xop) (OP (op) | ((((unsigned long)(xop)) & 0x1f) << 1)) | ||
2585 | #define VXASH_MASK VXASH (0x3f, 0x1f) | ||
2586 | |||
1661 | /* An X form instruction. */ | 2587 | /* An X form instruction. */ |
1662 | #define X(op, xop) (OP (op) | ((((unsigned long)(xop)) & 0x3ff) << 1)) | 2588 | #define X(op, xop) (OP (op) | ((((unsigned long)(xop)) & 0x3ff) << 1)) |
1663 | 2589 | ||
2590 | /* A X form instruction for Quad-Precision FP Instructions. */ | ||
2591 | #define XVA(op, xop, vaop) (X(op,xop) | (((vaop) & 0x1f) << 16)) | ||
2592 | |||
2593 | /* An EX form instruction. */ | ||
2594 | #define EX(op, xop) (OP (op) | (((unsigned long)(xop)) & 0x7ff)) | ||
2595 | |||
2596 | /* The mask for an EX form instruction. */ | ||
2597 | #define EX_MASK EX (0x3f, 0x7ff) | ||
2598 | |||
2599 | /* An XX2 form instruction. */ | ||
2600 | #define XX2(op, xop) (OP (op) | ((((unsigned long)(xop)) & 0x1ff) << 2)) | ||
2601 | |||
2602 | /* A XX2 form instruction with the VA bits specified. */ | ||
2603 | #define XX2VA(op, xop, vaop) (XX2(op,xop) | (((vaop) & 0x1f) << 16)) | ||
2604 | |||
2605 | /* An XX3 form instruction. */ | ||
2606 | #define XX3(op, xop) (OP (op) | ((((unsigned long)(xop)) & 0xff) << 3)) | ||
2607 | |||
2608 | /* An XX3 form instruction with the RC bit specified. */ | ||
2609 | #define XX3RC(op, xop, rc) (OP (op) | (((rc) & 1) << 10) | ((((unsigned long)(xop)) & 0x7f) << 3)) | ||
2610 | |||
2611 | /* An XX4 form instruction. */ | ||
2612 | #define XX4(op, xop) (OP (op) | ((((unsigned long)(xop)) & 0x3) << 4)) | ||
2613 | |||
1664 | /* A Z form instruction. */ | 2614 | /* A Z form instruction. */ |
1665 | #define Z(op, xop) (OP (op) | ((((unsigned long)(xop)) & 0x1ff) << 1)) | 2615 | #define Z(op, xop) (OP (op) | ((((unsigned long)(xop)) & 0x1ff) << 1)) |
1666 | 2616 | ||
1667 | /* An X form instruction with the RC bit specified. */ | 2617 | /* An X form instruction with the RC bit specified. */ |
1668 | #define XRC(op, xop, rc) (X ((op), (xop)) | ((rc) & 1)) | 2618 | #define XRC(op, xop, rc) (X ((op), (xop)) | ((rc) & 1)) |
1669 | 2619 | ||
2620 | /* A X form instruction for Quad-Precision FP Instructions with RC bit. */ | ||
2621 | #define XVARC(op, xop, vaop, rc) (XVA ((op), (xop), (vaop)) | ((rc) & 1)) | ||
2622 | |||
2623 | /* An X form instruction with the RA bits specified as two ops. */ | ||
2624 | #define XMMF(op, xop, mop0, mop1) (X ((op), (xop)) | ((mop0) & 3) << 19 | ((mop1) & 7) << 16) | ||
2625 | |||
1670 | /* A Z form instruction with the RC bit specified. */ | 2626 | /* A Z form instruction with the RC bit specified. */ |
1671 | #define ZRC(op, xop, rc) (Z ((op), (xop)) | ((rc) & 1)) | 2627 | #define ZRC(op, xop, rc) (Z ((op), (xop)) | ((rc) & 1)) |
1672 | 2628 | ||
1673 | /* The mask for an X form instruction. */ | 2629 | /* The mask for an X form instruction. */ |
1674 | #define X_MASK XRC (0x3f, 0x3ff, 1) | 2630 | #define X_MASK XRC (0x3f, 0x3ff, 1) |
1675 | 2631 | ||
2632 | /* The mask for an X form instruction with the BF bits specified. */ | ||
2633 | #define XBF_MASK (X_MASK | (3 << 21)) | ||
2634 | |||
2635 | /* An X form wait instruction with everything filled in except the WC field. */ | ||
2636 | #define XWC_MASK (XRC (0x3f, 0x3ff, 1) | (7 << 23) | RA_MASK | RB_MASK) | ||
2637 | |||
2638 | /* The mask for an XX1 form instruction. */ | ||
2639 | #define XX1_MASK X (0x3f, 0x3ff) | ||
2640 | |||
2641 | /* An XX1_MASK with the RB field fixed. */ | ||
2642 | #define XX1RB_MASK (XX1_MASK | RB_MASK) | ||
2643 | |||
2644 | /* The mask for an XX2 form instruction. */ | ||
2645 | #define XX2_MASK (XX2 (0x3f, 0x1ff) | (0x1f << 16)) | ||
2646 | |||
2647 | /* The mask for an XX2 form instruction with the UIM bits specified. */ | ||
2648 | #define XX2UIM_MASK (XX2 (0x3f, 0x1ff) | (7 << 18)) | ||
2649 | |||
2650 | /* The mask for an XX2 form instruction with the 4 UIM bits specified. */ | ||
2651 | #define XX2UIM4_MASK (XX2 (0x3f, 0x1ff) | (1 << 20)) | ||
2652 | |||
2653 | /* The mask for an XX2 form instruction with the BF bits specified. */ | ||
2654 | #define XX2BF_MASK (XX2_MASK | (3 << 21) | (1)) | ||
2655 | |||
2656 | /* The mask for an XX2 form instruction with the BF and DCMX bits specified. */ | ||
2657 | #define XX2BFD_MASK (XX2 (0x3f, 0x1ff) | 1) | ||
2658 | |||
2659 | /* The mask for an XX2 form instruction with a split DCMX bits specified. */ | ||
2660 | #define XX2DCMXS_MASK XX2 (0x3f, 0x1ee) | ||
2661 | |||
2662 | /* The mask for an XX3 form instruction. */ | ||
2663 | #define XX3_MASK XX3 (0x3f, 0xff) | ||
2664 | |||
2665 | /* The mask for an XX3 form instruction with the BF bits specified. */ | ||
2666 | #define XX3BF_MASK (XX3 (0x3f, 0xff) | (3 << 21) | (1)) | ||
2667 | |||
2668 | /* The mask for an XX3 form instruction with the DM or SHW bits specified. */ | ||
2669 | #define XX3DM_MASK (XX3 (0x3f, 0x1f) | (1 << 10)) | ||
2670 | #define XX3SHW_MASK XX3DM_MASK | ||
2671 | |||
2672 | /* The mask for an XX4 form instruction. */ | ||
2673 | #define XX4_MASK XX4 (0x3f, 0x3) | ||
2674 | |||
2675 | /* An X form wait instruction with everything filled in except the WC field. */ | ||
2676 | #define XWC_MASK (XRC (0x3f, 0x3ff, 1) | (7 << 23) | RA_MASK | RB_MASK) | ||
2677 | |||
2678 | /* The mask for an XMMF form instruction. */ | ||
2679 | #define XMMF_MASK (XMMF (0x3f, 0x3ff, 3, 7) | (1)) | ||
2680 | |||
1676 | /* The mask for a Z form instruction. */ | 2681 | /* The mask for a Z form instruction. */ |
1677 | #define Z_MASK ZRC (0x3f, 0x1ff, 1) | 2682 | #define Z_MASK ZRC (0x3f, 0x1ff, 1) |
2683 | #define Z2_MASK ZRC (0x3f, 0xff, 1) | ||
1678 | 2684 | ||
1679 | /* An X_MASK with the RA field fixed. */ | 2685 | /* An X_MASK with the RA/VA field fixed. */ |
1680 | #define XRA_MASK (X_MASK | RA_MASK) | 2686 | #define XRA_MASK (X_MASK | RA_MASK) |
2687 | #define XVA_MASK XRA_MASK | ||
2688 | |||
2689 | /* An XRA_MASK with the A_L/W field clear. */ | ||
2690 | #define XWRA_MASK (XRA_MASK & ~((unsigned long) 1 << 16)) | ||
2691 | #define XRLA_MASK XWRA_MASK | ||
1681 | 2692 | ||
1682 | /* An X_MASK with the RB field fixed. */ | 2693 | /* An X_MASK with the RB field fixed. */ |
1683 | #define XRB_MASK (X_MASK | RB_MASK) | 2694 | #define XRB_MASK (X_MASK | RB_MASK) |
@@ -1691,18 +2702,54 @@ extract_tbr (unsigned long insn, | |||
1691 | /* An X_MASK with the RA and RB fields fixed. */ | 2702 | /* An X_MASK with the RA and RB fields fixed. */ |
1692 | #define XRARB_MASK (X_MASK | RA_MASK | RB_MASK) | 2703 | #define XRARB_MASK (X_MASK | RA_MASK | RB_MASK) |
1693 | 2704 | ||
2705 | /* An XBF_MASK with the RA and RB fields fixed. */ | ||
2706 | #define XBFRARB_MASK (XBF_MASK | RA_MASK | RB_MASK) | ||
2707 | |||
1694 | /* An XRARB_MASK, but with the L bit clear. */ | 2708 | /* An XRARB_MASK, but with the L bit clear. */ |
1695 | #define XRLARB_MASK (XRARB_MASK & ~((unsigned long) 1 << 16)) | 2709 | #define XRLARB_MASK (XRARB_MASK & ~((unsigned long) 1 << 16)) |
1696 | 2710 | ||
2711 | /* An XRARB_MASK, but with the L bits in a darn instruction clear. */ | ||
2712 | #define XLRAND_MASK (XRARB_MASK & ~((unsigned long) 3 << 16)) | ||
2713 | |||
1697 | /* An X_MASK with the RT and RA fields fixed. */ | 2714 | /* An X_MASK with the RT and RA fields fixed. */ |
1698 | #define XRTRA_MASK (X_MASK | RT_MASK | RA_MASK) | 2715 | #define XRTRA_MASK (X_MASK | RT_MASK | RA_MASK) |
1699 | 2716 | ||
2717 | /* An X_MASK with the RT and RB fields fixed. */ | ||
2718 | #define XRTRB_MASK (X_MASK | RT_MASK | RB_MASK) | ||
2719 | |||
1700 | /* An XRTRA_MASK, but with L bit clear. */ | 2720 | /* An XRTRA_MASK, but with L bit clear. */ |
1701 | #define XRTLRA_MASK (XRTRA_MASK & ~((unsigned long) 1 << 21)) | 2721 | #define XRTLRA_MASK (XRTRA_MASK & ~((unsigned long) 1 << 21)) |
1702 | 2722 | ||
2723 | /* An X_MASK with the RT, RA and RB fields fixed. */ | ||
2724 | #define XRTRARB_MASK (X_MASK | RT_MASK | RA_MASK | RB_MASK) | ||
2725 | |||
2726 | /* An XRTRARB_MASK, but with L bit clear. */ | ||
2727 | #define XRTLRARB_MASK (XRTRARB_MASK & ~((unsigned long) 1 << 21)) | ||
2728 | |||
2729 | /* An XRTRARB_MASK, but with A bit clear. */ | ||
2730 | #define XRTARARB_MASK (XRTRARB_MASK & ~((unsigned long) 1 << 25)) | ||
2731 | |||
2732 | /* An XRTRARB_MASK, but with BF bits clear. */ | ||
2733 | #define XRTBFRARB_MASK (XRTRARB_MASK & ~((unsigned long) 7 << 23)) | ||
2734 | |||
1703 | /* An X form instruction with the L bit specified. */ | 2735 | /* An X form instruction with the L bit specified. */ |
1704 | #define XOPL(op, xop, l) (X ((op), (xop)) | ((((unsigned long)(l)) & 1) << 21)) | 2736 | #define XOPL(op, xop, l) (X ((op), (xop)) | ((((unsigned long)(l)) & 1) << 21)) |
1705 | 2737 | ||
2738 | /* An X form instruction with the L bits specified. */ | ||
2739 | #define XOPL2(op, xop, l) (X ((op), (xop)) | ((((unsigned long)(l)) & 3) << 21)) | ||
2740 | |||
2741 | /* An X form instruction with the L bit and RC bit specified. */ | ||
2742 | #define XRCL(op, xop, l, rc) (XRC ((op), (xop), (rc)) | ((((unsigned long)(l)) & 1) << 21)) | ||
2743 | |||
2744 | /* An X form instruction with RT fields specified */ | ||
2745 | #define XRT(op, xop, rt) (X ((op), (xop)) \ | ||
2746 | | ((((unsigned long)(rt)) & 0x1f) << 21)) | ||
2747 | |||
2748 | /* An X form instruction with RT and RA fields specified */ | ||
2749 | #define XRTRA(op, xop, rt, ra) (X ((op), (xop)) \ | ||
2750 | | ((((unsigned long)(rt)) & 0x1f) << 21) \ | ||
2751 | | ((((unsigned long)(ra)) & 0x1f) << 16)) | ||
2752 | |||
1706 | /* The mask for an X form comparison instruction. */ | 2753 | /* The mask for an X form comparison instruction. */ |
1707 | #define XCMP_MASK (X_MASK | (((unsigned long)1) << 22)) | 2754 | #define XCMP_MASK (X_MASK | (((unsigned long)1) << 22)) |
1708 | 2755 | ||
@@ -1724,6 +2771,9 @@ extract_tbr (unsigned long insn, | |||
1724 | /* An X form sync instruction with everything filled in except the LS field. */ | 2771 | /* An X form sync instruction with everything filled in except the LS field. */ |
1725 | #define XSYNC_MASK (0xff9fffff) | 2772 | #define XSYNC_MASK (0xff9fffff) |
1726 | 2773 | ||
2774 | /* An X form sync instruction with everything filled in except the L and E fields. */ | ||
2775 | #define XSYNCLE_MASK (0xff90ffff) | ||
2776 | |||
1727 | /* An X_MASK, but with the EH bit clear. */ | 2777 | /* An X_MASK, but with the EH bit clear. */ |
1728 | #define XEH_MASK (X_MASK & ~((unsigned long )1)) | 2778 | #define XEH_MASK (X_MASK & ~((unsigned long )1)) |
1729 | 2779 | ||
@@ -1733,11 +2783,11 @@ extract_tbr (unsigned long insn, | |||
1733 | 2783 | ||
1734 | /* An XFL form instruction. */ | 2784 | /* An XFL form instruction. */ |
1735 | #define XFL(op, xop, rc) (OP (op) | ((((unsigned long)(xop)) & 0x3ff) << 1) | (((unsigned long)(rc)) & 1)) | 2785 | #define XFL(op, xop, rc) (OP (op) | ((((unsigned long)(xop)) & 0x3ff) << 1) | (((unsigned long)(rc)) & 1)) |
1736 | #define XFL_MASK (XFL (0x3f, 0x3ff, 1) | (((unsigned long)1) << 25) | (((unsigned long)1) << 16)) | 2786 | #define XFL_MASK XFL (0x3f, 0x3ff, 1) |
1737 | 2787 | ||
1738 | /* An X form isel instruction. */ | 2788 | /* An X form isel instruction. */ |
1739 | #define XISEL(op, xop) (OP (op) | ((((unsigned long)(xop)) & 0x1f) << 1)) | 2789 | #define XISEL(op, xop) (OP (op) | ((((unsigned long)(xop)) & 0x1f) << 1)) |
1740 | #define XISEL_MASK XISEL(0x3f, 0x1f) | 2790 | #define XISEL_MASK XISEL(0x3f, 0x1f) |
1741 | 2791 | ||
1742 | /* An XL form instruction with the LK field set to 0. */ | 2792 | /* An XL form instruction with the LK field set to 0. */ |
1743 | #define XL(op, xop) (OP (op) | ((((unsigned long)(xop)) & 0x3ff) << 1)) | 2793 | #define XL(op, xop) (OP (op) | ((((unsigned long)(xop)) & 0x3ff) << 1)) |
@@ -1748,6 +2798,9 @@ extract_tbr (unsigned long insn, | |||
1748 | /* The mask for an XL form instruction. */ | 2798 | /* The mask for an XL form instruction. */ |
1749 | #define XL_MASK XLLK (0x3f, 0x3ff, 1) | 2799 | #define XL_MASK XLLK (0x3f, 0x3ff, 1) |
1750 | 2800 | ||
2801 | /* An XL_MASK with the RT, RA and RB fields fixed, but S bit clear. */ | ||
2802 | #define XLS_MASK ((XL_MASK | RT_MASK | RA_MASK | RB_MASK) & ~(1 << 11)) | ||
2803 | |||
1751 | /* An XL form instruction which explicitly sets the BO field. */ | 2804 | /* An XL form instruction which explicitly sets the BO field. */ |
1752 | #define XLO(op, bo, xop, lk) \ | 2805 | #define XLO(op, bo, xop, lk) \ |
1753 | (XLLK ((op), (xop), (lk)) | ((((unsigned long)(bo)) & 0x1f) << 21)) | 2806 | (XLLK ((op), (xop), (lk)) | ((((unsigned long)(bo)) & 0x1f) << 21)) |
@@ -1778,6 +2831,9 @@ extract_tbr (unsigned long insn, | |||
1778 | /* An XL_MASK with the BO, BI and BB fields fixed. */ | 2831 | /* An XL_MASK with the BO, BI and BB fields fixed. */ |
1779 | #define XLBOBIBB_MASK (XL_MASK | BO_MASK | BI_MASK | BB_MASK) | 2832 | #define XLBOBIBB_MASK (XL_MASK | BO_MASK | BI_MASK | BB_MASK) |
1780 | 2833 | ||
2834 | /* An X form mbar instruction with MO field. */ | ||
2835 | #define XMBAR(op, xop, mo) (X ((op), (xop)) | ((((unsigned long)(mo)) & 1) << 21)) | ||
2836 | |||
1781 | /* An XO form instruction. */ | 2837 | /* An XO form instruction. */ |
1782 | #define XO(op, xop, oe, rc) \ | 2838 | #define XO(op, xop, oe, rc) \ |
1783 | (OP (op) | ((((unsigned long)(xop)) & 0x1ff) << 1) | ((((unsigned long)(oe)) & 1) << 10) | (((unsigned long)(rc)) & 1)) | 2839 | (OP (op) | ((((unsigned long)(xop)) & 0x1ff) << 1) | ((((unsigned long)(oe)) & 1) << 10) | (((unsigned long)(rc)) & 1)) |
@@ -1786,6 +2842,12 @@ extract_tbr (unsigned long insn, | |||
1786 | /* An XO_MASK with the RB field fixed. */ | 2842 | /* An XO_MASK with the RB field fixed. */ |
1787 | #define XORB_MASK (XO_MASK | RB_MASK) | 2843 | #define XORB_MASK (XO_MASK | RB_MASK) |
1788 | 2844 | ||
2845 | /* An XOPS form instruction for paired singles. */ | ||
2846 | #define XOPS(op, xop, rc) \ | ||
2847 | (OP (op) | ((((unsigned long)(xop)) & 0x3ff) << 1) | (((unsigned long)(rc)) & 1)) | ||
2848 | #define XOPS_MASK XOPS (0x3f, 0x3ff, 1) | ||
2849 | |||
2850 | |||
1789 | /* An XS form instruction. */ | 2851 | /* An XS form instruction. */ |
1790 | #define XS(op, xop, rc) (OP (op) | ((((unsigned long)(xop)) & 0x1ff) << 2) | (((unsigned long)(rc)) & 1)) | 2852 | #define XS(op, xop, rc) (OP (op) | ((((unsigned long)(xop)) & 0x1ff) << 2) | (((unsigned long)(rc)) & 1)) |
1791 | #define XS_MASK XS (0x3f, 0x1ff, 1) | 2853 | #define XS_MASK XS (0x3f, 0x1ff, 1) |
@@ -1809,7 +2871,7 @@ extract_tbr (unsigned long insn, | |||
1809 | 2871 | ||
1810 | /* An XFX form instruction with the SPR field filled in except for the | 2872 | /* An XFX form instruction with the SPR field filled in except for the |
1811 | SPRG field. */ | 2873 | SPRG field. */ |
1812 | #define XSPRG_MASK (XSPR_MASK & ~(0x17 << 16)) | 2874 | #define XSPRG_MASK (XSPR_MASK & ~(0x1f << 16)) |
1813 | 2875 | ||
1814 | /* An X form instruction with everything filled in except the E field. */ | 2876 | /* An X form instruction with everything filled in except the E field. */ |
1815 | #define XE_MASK (0xffff7fff) | 2877 | #define XE_MASK (0xffff7fff) |
@@ -1818,6 +2880,19 @@ extract_tbr (unsigned long insn, | |||
1818 | #define XUC(op, xop) (OP (op) | (((unsigned long)(xop)) & 0x1f)) | 2880 | #define XUC(op, xop) (OP (op) | (((unsigned long)(xop)) & 0x1f)) |
1819 | #define XUC_MASK XUC(0x3f, 0x1f) | 2881 | #define XUC_MASK XUC(0x3f, 0x1f) |
1820 | 2882 | ||
2883 | /* An XW form instruction. */ | ||
2884 | #define XW(op, xop, rc) (OP (op) | ((((unsigned long)(xop)) & 0x3f) << 1) | ((rc) & 1)) | ||
2885 | /* The mask for a G form instruction. rc not supported at present. */ | ||
2886 | #define XW_MASK XW (0x3f, 0x3f, 0) | ||
2887 | |||
2888 | /* An APU form instruction. */ | ||
2889 | #define APU(op, xop, rc) (OP (op) | (((unsigned long)(xop)) & 0x3ff) << 1 | ((rc) & 1)) | ||
2890 | |||
2891 | /* The mask for an APU form instruction. */ | ||
2892 | #define APU_MASK APU (0x3f, 0x3ff, 1) | ||
2893 | #define APU_RT_MASK (APU_MASK | RT_MASK) | ||
2894 | #define APU_RA_MASK (APU_MASK | RA_MASK) | ||
2895 | |||
1821 | /* The BO encodings used in extended conditional branch mnemonics. */ | 2896 | /* The BO encodings used in extended conditional branch mnemonics. */ |
1822 | #define BODNZF (0x0) | 2897 | #define BODNZF (0x0) |
1823 | #define BODNZFP (0x1) | 2898 | #define BODNZFP (0x1) |
@@ -1848,6 +2923,16 @@ extract_tbr (unsigned long insn, | |||
1848 | 2923 | ||
1849 | #define BOU (0x14) | 2924 | #define BOU (0x14) |
1850 | 2925 | ||
2926 | /* The BO16 encodings used in extended VLE conditional branch mnemonics. */ | ||
2927 | #define BO16F (0x0) | ||
2928 | #define BO16T (0x1) | ||
2929 | |||
2930 | /* The BO32 encodings used in extended VLE conditional branch mnemonics. */ | ||
2931 | #define BO32F (0x0) | ||
2932 | #define BO32T (0x1) | ||
2933 | #define BO32DNZ (0x2) | ||
2934 | #define BO32DZ (0x3) | ||
2935 | |||
1851 | /* The BI condition bit encodings used in extended conditional branch | 2936 | /* The BI condition bit encodings used in extended conditional branch |
1852 | mnemonics. */ | 2937 | mnemonics. */ |
1853 | #define CBLT (0) | 2938 | #define CBLT (0) |
@@ -1875,3066 +2960,4267 @@ extract_tbr (unsigned long insn, | |||
1875 | /* Smaller names for the flags so each entry in the opcodes table will | 2960 | /* Smaller names for the flags so each entry in the opcodes table will |
1876 | fit on a single line. */ | 2961 | fit on a single line. */ |
1877 | #undef PPC | 2962 | #undef PPC |
1878 | #define PPC PPC_OPCODE_PPC | 2963 | #define PPC PPC_OPCODE_PPC |
1879 | #define PPCCOM PPC_OPCODE_PPC | PPC_OPCODE_COMMON | 2964 | #define PPCCOM PPC_OPCODE_PPC | PPC_OPCODE_COMMON |
1880 | #define NOPOWER4 PPC_OPCODE_NOPOWER4 | PPCCOM | ||
1881 | #define POWER4 PPC_OPCODE_POWER4 | 2965 | #define POWER4 PPC_OPCODE_POWER4 |
1882 | #define POWER5 PPC_OPCODE_POWER5 | 2966 | #define POWER5 PPC_OPCODE_POWER5 |
1883 | #define POWER6 PPC_OPCODE_POWER6 | 2967 | #define POWER6 PPC_OPCODE_POWER6 |
2968 | #define POWER7 PPC_OPCODE_POWER7 | ||
2969 | #define POWER8 PPC_OPCODE_POWER8 | ||
2970 | #define POWER9 PPC_OPCODE_POWER9 | ||
1884 | #define CELL PPC_OPCODE_CELL | 2971 | #define CELL PPC_OPCODE_CELL |
1885 | #define PPC32 PPC_OPCODE_32 | PPC_OPCODE_PPC | 2972 | #define PPC64 PPC_OPCODE_64 | PPC_OPCODE_64_BRIDGE |
1886 | #define PPC64 PPC_OPCODE_64 | PPC_OPCODE_PPC | 2973 | #define NON32 (PPC_OPCODE_64 | PPC_OPCODE_POWER4 \ |
2974 | | PPC_OPCODE_EFS | PPC_OPCODE_E500MC | PPC_OPCODE_TITAN) | ||
1887 | #define PPC403 PPC_OPCODE_403 | 2975 | #define PPC403 PPC_OPCODE_403 |
1888 | #define PPC405 PPC403 | 2976 | #define PPC405 PPC_OPCODE_405 |
1889 | #define PPC440 PPC_OPCODE_440 | 2977 | #define PPC440 PPC_OPCODE_440 |
1890 | #define PPC750 PPC | 2978 | #define PPC464 PPC440 |
1891 | #define PPC860 PPC | 2979 | #define PPC476 PPC_OPCODE_476 |
2980 | #define PPC750 PPC_OPCODE_750 | ||
2981 | #define PPC7450 PPC_OPCODE_7450 | ||
2982 | #define PPC860 PPC_OPCODE_860 | ||
2983 | #define PPCPS PPC_OPCODE_PPCPS | ||
1892 | #define PPCVEC PPC_OPCODE_ALTIVEC | 2984 | #define PPCVEC PPC_OPCODE_ALTIVEC |
1893 | #define POWER PPC_OPCODE_POWER | 2985 | #define PPCVEC2 PPC_OPCODE_ALTIVEC2 |
1894 | #define POWER2 PPC_OPCODE_POWER | PPC_OPCODE_POWER2 | 2986 | #define PPCVEC3 PPC_OPCODE_ALTIVEC2 |
1895 | #define PPCPWR2 PPC_OPCODE_PPC | PPC_OPCODE_POWER | PPC_OPCODE_POWER2 | 2987 | #define PPCVSX PPC_OPCODE_VSX |
1896 | #define POWER32 PPC_OPCODE_POWER | PPC_OPCODE_32 | 2988 | #define PPCVSX2 PPC_OPCODE_VSX |
1897 | #define COM PPC_OPCODE_POWER | PPC_OPCODE_PPC | PPC_OPCODE_COMMON | 2989 | #define PPCVSX3 PPC_OPCODE_VSX3 |
1898 | #define COM32 PPC_OPCODE_POWER | PPC_OPCODE_PPC | PPC_OPCODE_COMMON | PPC_OPCODE_32 | 2990 | #define POWER PPC_OPCODE_POWER |
1899 | #define M601 PPC_OPCODE_POWER | PPC_OPCODE_601 | 2991 | #define POWER2 PPC_OPCODE_POWER | PPC_OPCODE_POWER2 |
2992 | #define PWR2COM PPC_OPCODE_POWER | PPC_OPCODE_POWER2 | PPC_OPCODE_COMMON | ||
2993 | #define PPCPWR2 PPC_OPCODE_PPC | PPC_OPCODE_POWER | PPC_OPCODE_POWER2 | PPC_OPCODE_COMMON | ||
2994 | #define COM PPC_OPCODE_POWER | PPC_OPCODE_PPC | PPC_OPCODE_COMMON | ||
2995 | #define M601 PPC_OPCODE_POWER | PPC_OPCODE_601 | ||
1900 | #define PWRCOM PPC_OPCODE_POWER | PPC_OPCODE_601 | PPC_OPCODE_COMMON | 2996 | #define PWRCOM PPC_OPCODE_POWER | PPC_OPCODE_601 | PPC_OPCODE_COMMON |
1901 | #define MFDEC1 PPC_OPCODE_POWER | 2997 | #define MFDEC1 PPC_OPCODE_POWER |
1902 | #define MFDEC2 PPC_OPCODE_PPC | PPC_OPCODE_601 | PPC_OPCODE_BOOKE | 2998 | #define MFDEC2 PPC_OPCODE_PPC | PPC_OPCODE_601 | PPC_OPCODE_BOOKE | PPC_OPCODE_TITAN |
1903 | #define BOOKE PPC_OPCODE_BOOKE | 2999 | #define BOOKE PPC_OPCODE_BOOKE |
1904 | #define BOOKE64 PPC_OPCODE_BOOKE64 | 3000 | #define NO371 PPC_OPCODE_BOOKE | PPC_OPCODE_PPCPS | PPC_OPCODE_EFS |
1905 | #define CLASSIC PPC_OPCODE_CLASSIC | ||
1906 | #define PPCE300 PPC_OPCODE_E300 | 3001 | #define PPCE300 PPC_OPCODE_E300 |
1907 | #define PPCSPE PPC_OPCODE_SPE | 3002 | #define PPCSPE PPC_OPCODE_SPE |
1908 | #define PPCISEL PPC_OPCODE_ISEL | 3003 | #define PPCISEL PPC_OPCODE_ISEL |
1909 | #define PPCEFS PPC_OPCODE_EFS | 3004 | #define PPCEFS PPC_OPCODE_EFS |
1910 | #define PPCBRLK PPC_OPCODE_BRLOCK | 3005 | #define PPCBRLK PPC_OPCODE_BRLOCK |
1911 | #define PPCPMR PPC_OPCODE_PMR | 3006 | #define PPCPMR PPC_OPCODE_PMR |
1912 | #define PPCCHLK PPC_OPCODE_CACHELCK | 3007 | #define PPCTMR PPC_OPCODE_TMR |
1913 | #define PPCCHLK64 PPC_OPCODE_CACHELCK | PPC_OPCODE_BOOKE64 | 3008 | #define PPCCHLK PPC_OPCODE_CACHELCK |
1914 | #define PPCRFMCI PPC_OPCODE_RFMCI | 3009 | #define PPCRFMCI PPC_OPCODE_RFMCI |
3010 | #define E500MC PPC_OPCODE_E500MC | ||
3011 | #define PPCA2 PPC_OPCODE_A2 | ||
3012 | #define TITAN PPC_OPCODE_TITAN | ||
3013 | #define MULHW PPC_OPCODE_405 | PPC_OPCODE_440 | TITAN | ||
3014 | #define E500 PPC_OPCODE_E500 | ||
3015 | #define E6500 PPC_OPCODE_E6500 | ||
3016 | #define PPCVLE PPC_OPCODE_VLE | ||
3017 | #define PPCHTM PPC_OPCODE_HTM | ||
3018 | #define E200Z4 PPC_OPCODE_E200Z4 | ||
3019 | /* The list of embedded processors that use the embedded operand ordering | ||
3020 | for the 3 operand dcbt and dcbtst instructions. */ | ||
3021 | #define DCBT_EO (PPC_OPCODE_E500 | PPC_OPCODE_E500MC | PPC_OPCODE_476 \ | ||
3022 | | PPC_OPCODE_A2) | ||
3023 | |||
3024 | |||
1915 | 3025 | ||
1916 | /* The opcode table. | 3026 | /* The opcode table. |
1917 | 3027 | ||
1918 | The format of the opcode table is: | 3028 | The format of the opcode table is: |
1919 | 3029 | ||
1920 | NAME OPCODE MASK FLAGS { OPERANDS } | 3030 | NAME OPCODE MASK FLAGS ANTI {OPERANDS} |
1921 | 3031 | ||
1922 | NAME is the name of the instruction. | 3032 | NAME is the name of the instruction. |
1923 | OPCODE is the instruction opcode. | 3033 | OPCODE is the instruction opcode. |
1924 | MASK is the opcode mask; this is used to tell the disassembler | 3034 | MASK is the opcode mask; this is used to tell the disassembler |
1925 | which bits in the actual opcode must match OPCODE. | 3035 | which bits in the actual opcode must match OPCODE. |
1926 | FLAGS are flags indicated what processors support the instruction. | 3036 | FLAGS are flags indicating which processors support the instruction. |
3037 | ANTI indicates which processors don't support the instruction. | ||
1927 | OPERANDS is the list of operands. | 3038 | OPERANDS is the list of operands. |
1928 | 3039 | ||
1929 | The disassembler reads the table in order and prints the first | 3040 | The disassembler reads the table in order and prints the first |
1930 | instruction which matches, so this table is sorted to put more | 3041 | instruction which matches, so this table is sorted to put more |
1931 | specific instructions before more general instructions. It is also | 3042 | specific instructions before more general instructions. |
1932 | sorted by major opcode. */ | 3043 | |
3044 | This table must be sorted by major opcode. Please try to keep it | ||
3045 | vaguely sorted within major opcode too, except of course where | ||
3046 | constrained otherwise by disassembler operation. */ | ||
1933 | 3047 | ||
1934 | const struct powerpc_opcode powerpc_opcodes[] = { | 3048 | const struct powerpc_opcode powerpc_opcodes[] = { |
1935 | { "attn", X(0,256), X_MASK, POWER4, { 0 } }, | 3049 | {"attn", X(0,256), X_MASK, POWER4|PPCA2, PPC476|PPCVLE, {0}}, |
1936 | { "tdlgti", OPTO(2,TOLGT), OPTO_MASK, PPC64, { RA, SI } }, | 3050 | {"tdlgti", OPTO(2,TOLGT), OPTO_MASK, PPC64, PPCVLE, {RA, SI}}, |
1937 | { "tdllti", OPTO(2,TOLLT), OPTO_MASK, PPC64, { RA, SI } }, | 3051 | {"tdllti", OPTO(2,TOLLT), OPTO_MASK, PPC64, PPCVLE, {RA, SI}}, |
1938 | { "tdeqi", OPTO(2,TOEQ), OPTO_MASK, PPC64, { RA, SI } }, | 3052 | {"tdeqi", OPTO(2,TOEQ), OPTO_MASK, PPC64, PPCVLE, {RA, SI}}, |
1939 | { "tdlgei", OPTO(2,TOLGE), OPTO_MASK, PPC64, { RA, SI } }, | 3053 | {"tdlgei", OPTO(2,TOLGE), OPTO_MASK, PPC64, PPCVLE, {RA, SI}}, |
1940 | { "tdlnli", OPTO(2,TOLNL), OPTO_MASK, PPC64, { RA, SI } }, | 3054 | {"tdlnli", OPTO(2,TOLNL), OPTO_MASK, PPC64, PPCVLE, {RA, SI}}, |
1941 | { "tdllei", OPTO(2,TOLLE), OPTO_MASK, PPC64, { RA, SI } }, | 3055 | {"tdllei", OPTO(2,TOLLE), OPTO_MASK, PPC64, PPCVLE, {RA, SI}}, |
1942 | { "tdlngi", OPTO(2,TOLNG), OPTO_MASK, PPC64, { RA, SI } }, | 3056 | {"tdlngi", OPTO(2,TOLNG), OPTO_MASK, PPC64, PPCVLE, {RA, SI}}, |
1943 | { "tdgti", OPTO(2,TOGT), OPTO_MASK, PPC64, { RA, SI } }, | 3057 | {"tdgti", OPTO(2,TOGT), OPTO_MASK, PPC64, PPCVLE, {RA, SI}}, |
1944 | { "tdgei", OPTO(2,TOGE), OPTO_MASK, PPC64, { RA, SI } }, | 3058 | {"tdgei", OPTO(2,TOGE), OPTO_MASK, PPC64, PPCVLE, {RA, SI}}, |
1945 | { "tdnli", OPTO(2,TONL), OPTO_MASK, PPC64, { RA, SI } }, | 3059 | {"tdnli", OPTO(2,TONL), OPTO_MASK, PPC64, PPCVLE, {RA, SI}}, |
1946 | { "tdlti", OPTO(2,TOLT), OPTO_MASK, PPC64, { RA, SI } }, | 3060 | {"tdlti", OPTO(2,TOLT), OPTO_MASK, PPC64, PPCVLE, {RA, SI}}, |
1947 | { "tdlei", OPTO(2,TOLE), OPTO_MASK, PPC64, { RA, SI } }, | 3061 | {"tdlei", OPTO(2,TOLE), OPTO_MASK, PPC64, PPCVLE, {RA, SI}}, |
1948 | { "tdngi", OPTO(2,TONG), OPTO_MASK, PPC64, { RA, SI } }, | 3062 | {"tdngi", OPTO(2,TONG), OPTO_MASK, PPC64, PPCVLE, {RA, SI}}, |
1949 | { "tdnei", OPTO(2,TONE), OPTO_MASK, PPC64, { RA, SI } }, | 3063 | {"tdnei", OPTO(2,TONE), OPTO_MASK, PPC64, PPCVLE, {RA, SI}}, |
1950 | { "tdi", OP(2), OP_MASK, PPC64, { TO, RA, SI } }, | 3064 | {"tdui", OPTO(2,TOU), OPTO_MASK, PPC64, PPCVLE, {RA, SI}}, |
1951 | 3065 | {"tdi", OP(2), OP_MASK, PPC64, PPCVLE, {TO, RA, SI}}, | |
1952 | { "twlgti", OPTO(3,TOLGT), OPTO_MASK, PPCCOM, { RA, SI } }, | 3066 | |
1953 | { "tlgti", OPTO(3,TOLGT), OPTO_MASK, PWRCOM, { RA, SI } }, | 3067 | {"twlgti", OPTO(3,TOLGT), OPTO_MASK, PPCCOM, PPCVLE, {RA, SI}}, |
1954 | { "twllti", OPTO(3,TOLLT), OPTO_MASK, PPCCOM, { RA, SI } }, | 3068 | {"tlgti", OPTO(3,TOLGT), OPTO_MASK, PWRCOM, PPCVLE, {RA, SI}}, |
1955 | { "tllti", OPTO(3,TOLLT), OPTO_MASK, PWRCOM, { RA, SI } }, | 3069 | {"twllti", OPTO(3,TOLLT), OPTO_MASK, PPCCOM, PPCVLE, {RA, SI}}, |
1956 | { "tweqi", OPTO(3,TOEQ), OPTO_MASK, PPCCOM, { RA, SI } }, | 3070 | {"tllti", OPTO(3,TOLLT), OPTO_MASK, PWRCOM, PPCVLE, {RA, SI}}, |
1957 | { "teqi", OPTO(3,TOEQ), OPTO_MASK, PWRCOM, { RA, SI } }, | 3071 | {"tweqi", OPTO(3,TOEQ), OPTO_MASK, PPCCOM, PPCVLE, {RA, SI}}, |
1958 | { "twlgei", OPTO(3,TOLGE), OPTO_MASK, PPCCOM, { RA, SI } }, | 3072 | {"teqi", OPTO(3,TOEQ), OPTO_MASK, PWRCOM, PPCVLE, {RA, SI}}, |
1959 | { "tlgei", OPTO(3,TOLGE), OPTO_MASK, PWRCOM, { RA, SI } }, | 3073 | {"twlgei", OPTO(3,TOLGE), OPTO_MASK, PPCCOM, PPCVLE, {RA, SI}}, |
1960 | { "twlnli", OPTO(3,TOLNL), OPTO_MASK, PPCCOM, { RA, SI } }, | 3074 | {"tlgei", OPTO(3,TOLGE), OPTO_MASK, PWRCOM, PPCVLE, {RA, SI}}, |
1961 | { "tlnli", OPTO(3,TOLNL), OPTO_MASK, PWRCOM, { RA, SI } }, | 3075 | {"twlnli", OPTO(3,TOLNL), OPTO_MASK, PPCCOM, PPCVLE, {RA, SI}}, |
1962 | { "twllei", OPTO(3,TOLLE), OPTO_MASK, PPCCOM, { RA, SI } }, | 3076 | {"tlnli", OPTO(3,TOLNL), OPTO_MASK, PWRCOM, PPCVLE, {RA, SI}}, |
1963 | { "tllei", OPTO(3,TOLLE), OPTO_MASK, PWRCOM, { RA, SI } }, | 3077 | {"twllei", OPTO(3,TOLLE), OPTO_MASK, PPCCOM, PPCVLE, {RA, SI}}, |
1964 | { "twlngi", OPTO(3,TOLNG), OPTO_MASK, PPCCOM, { RA, SI } }, | 3078 | {"tllei", OPTO(3,TOLLE), OPTO_MASK, PWRCOM, PPCVLE, {RA, SI}}, |
1965 | { "tlngi", OPTO(3,TOLNG), OPTO_MASK, PWRCOM, { RA, SI } }, | 3079 | {"twlngi", OPTO(3,TOLNG), OPTO_MASK, PPCCOM, PPCVLE, {RA, SI}}, |
1966 | { "twgti", OPTO(3,TOGT), OPTO_MASK, PPCCOM, { RA, SI } }, | 3080 | {"tlngi", OPTO(3,TOLNG), OPTO_MASK, PWRCOM, PPCVLE, {RA, SI}}, |
1967 | { "tgti", OPTO(3,TOGT), OPTO_MASK, PWRCOM, { RA, SI } }, | 3081 | {"twgti", OPTO(3,TOGT), OPTO_MASK, PPCCOM, PPCVLE, {RA, SI}}, |
1968 | { "twgei", OPTO(3,TOGE), OPTO_MASK, PPCCOM, { RA, SI } }, | 3082 | {"tgti", OPTO(3,TOGT), OPTO_MASK, PWRCOM, PPCVLE, {RA, SI}}, |
1969 | { "tgei", OPTO(3,TOGE), OPTO_MASK, PWRCOM, { RA, SI } }, | 3083 | {"twgei", OPTO(3,TOGE), OPTO_MASK, PPCCOM, PPCVLE, {RA, SI}}, |
1970 | { "twnli", OPTO(3,TONL), OPTO_MASK, PPCCOM, { RA, SI } }, | 3084 | {"tgei", OPTO(3,TOGE), OPTO_MASK, PWRCOM, PPCVLE, {RA, SI}}, |
1971 | { "tnli", OPTO(3,TONL), OPTO_MASK, PWRCOM, { RA, SI } }, | 3085 | {"twnli", OPTO(3,TONL), OPTO_MASK, PPCCOM, PPCVLE, {RA, SI}}, |
1972 | { "twlti", OPTO(3,TOLT), OPTO_MASK, PPCCOM, { RA, SI } }, | 3086 | {"tnli", OPTO(3,TONL), OPTO_MASK, PWRCOM, PPCVLE, {RA, SI}}, |
1973 | { "tlti", OPTO(3,TOLT), OPTO_MASK, PWRCOM, { RA, SI } }, | 3087 | {"twlti", OPTO(3,TOLT), OPTO_MASK, PPCCOM, PPCVLE, {RA, SI}}, |
1974 | { "twlei", OPTO(3,TOLE), OPTO_MASK, PPCCOM, { RA, SI } }, | 3088 | {"tlti", OPTO(3,TOLT), OPTO_MASK, PWRCOM, PPCVLE, {RA, SI}}, |
1975 | { "tlei", OPTO(3,TOLE), OPTO_MASK, PWRCOM, { RA, SI } }, | 3089 | {"twlei", OPTO(3,TOLE), OPTO_MASK, PPCCOM, PPCVLE, {RA, SI}}, |
1976 | { "twngi", OPTO(3,TONG), OPTO_MASK, PPCCOM, { RA, SI } }, | 3090 | {"tlei", OPTO(3,TOLE), OPTO_MASK, PWRCOM, PPCVLE, {RA, SI}}, |
1977 | { "tngi", OPTO(3,TONG), OPTO_MASK, PWRCOM, { RA, SI } }, | 3091 | {"twngi", OPTO(3,TONG), OPTO_MASK, PPCCOM, PPCVLE, {RA, SI}}, |
1978 | { "twnei", OPTO(3,TONE), OPTO_MASK, PPCCOM, { RA, SI } }, | 3092 | {"tngi", OPTO(3,TONG), OPTO_MASK, PWRCOM, PPCVLE, {RA, SI}}, |
1979 | { "tnei", OPTO(3,TONE), OPTO_MASK, PWRCOM, { RA, SI } }, | 3093 | {"twnei", OPTO(3,TONE), OPTO_MASK, PPCCOM, PPCVLE, {RA, SI}}, |
1980 | { "twi", OP(3), OP_MASK, PPCCOM, { TO, RA, SI } }, | 3094 | {"tnei", OPTO(3,TONE), OPTO_MASK, PWRCOM, PPCVLE, {RA, SI}}, |
1981 | { "ti", OP(3), OP_MASK, PWRCOM, { TO, RA, SI } }, | 3095 | {"twui", OPTO(3,TOU), OPTO_MASK, PPCCOM, PPCVLE, {RA, SI}}, |
1982 | 3096 | {"tui", OPTO(3,TOU), OPTO_MASK, PWRCOM, PPCVLE, {RA, SI}}, | |
1983 | { "macchw", XO(4,172,0,0), XO_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3097 | {"twi", OP(3), OP_MASK, PPCCOM, PPCVLE, {TO, RA, SI}}, |
1984 | { "macchw.", XO(4,172,0,1), XO_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3098 | {"ti", OP(3), OP_MASK, PWRCOM, PPCVLE, {TO, RA, SI}}, |
1985 | { "macchwo", XO(4,172,1,0), XO_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3099 | |
1986 | { "macchwo.", XO(4,172,1,1), XO_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3100 | {"ps_cmpu0", X (4, 0), XBF_MASK, PPCPS, 0, {BF, FRA, FRB}}, |
1987 | { "macchws", XO(4,236,0,0), XO_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3101 | {"vaddubm", VX (4, 0), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
1988 | { "macchws.", XO(4,236,0,1), XO_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3102 | {"vmul10cuq", VX (4, 1), VXVB_MASK, PPCVEC3, 0, {VD, VA}}, |
1989 | { "macchwso", XO(4,236,1,0), XO_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3103 | {"vmaxub", VX (4, 2), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
1990 | { "macchwso.", XO(4,236,1,1), XO_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3104 | {"vrlb", VX (4, 4), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
1991 | { "macchwsu", XO(4,204,0,0), XO_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3105 | {"vcmpequb", VXR(4, 6,0), VXR_MASK, PPCVEC, 0, {VD, VA, VB}}, |
1992 | { "macchwsu.", XO(4,204,0,1), XO_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3106 | {"vcmpneb", VXR(4, 7,0), VXR_MASK, PPCVEC3, 0, {VD, VA, VB}}, |
1993 | { "macchwsuo", XO(4,204,1,0), XO_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3107 | {"vmuloub", VX (4, 8), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
1994 | { "macchwsuo.", XO(4,204,1,1), XO_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3108 | {"vaddfp", VX (4, 10), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
1995 | { "macchwu", XO(4,140,0,0), XO_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3109 | {"psq_lx", XW (4, 6,0), XW_MASK, PPCPS, 0, {FRT,RA,RB,PSWM,PSQM}}, |
1996 | { "macchwu.", XO(4,140,0,1), XO_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3110 | {"vmrghb", VX (4, 12), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
1997 | { "macchwuo", XO(4,140,1,0), XO_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3111 | {"psq_stx", XW (4, 7,0), XW_MASK, PPCPS, 0, {FRS,RA,RB,PSWM,PSQM}}, |
1998 | { "macchwuo.", XO(4,140,1,1), XO_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3112 | {"vpkuhum", VX (4, 14), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
1999 | { "machhw", XO(4,44,0,0), XO_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3113 | {"mulhhwu", XRC(4, 8,0), X_MASK, MULHW, 0, {RT, RA, RB}}, |
2000 | { "machhw.", XO(4,44,0,1), XO_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3114 | {"mulhhwu.", XRC(4, 8,1), X_MASK, MULHW, 0, {RT, RA, RB}}, |
2001 | { "machhwo", XO(4,44,1,0), XO_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3115 | {"ps_sum0", A (4, 10,0), A_MASK, PPCPS, 0, {FRT, FRA, FRC, FRB}}, |
2002 | { "machhwo.", XO(4,44,1,1), XO_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3116 | {"ps_sum0.", A (4, 10,1), A_MASK, PPCPS, 0, {FRT, FRA, FRC, FRB}}, |
2003 | { "machhws", XO(4,108,0,0), XO_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3117 | {"ps_sum1", A (4, 11,0), A_MASK, PPCPS, 0, {FRT, FRA, FRC, FRB}}, |
2004 | { "machhws.", XO(4,108,0,1), XO_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3118 | {"ps_sum1.", A (4, 11,1), A_MASK, PPCPS, 0, {FRT, FRA, FRC, FRB}}, |
2005 | { "machhwso", XO(4,108,1,0), XO_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3119 | {"ps_muls0", A (4, 12,0), AFRB_MASK, PPCPS, 0, {FRT, FRA, FRC}}, |
2006 | { "machhwso.", XO(4,108,1,1), XO_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3120 | {"machhwu", XO (4, 12,0,0), XO_MASK, MULHW, 0, {RT, RA, RB}}, |
2007 | { "machhwsu", XO(4,76,0,0), XO_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3121 | {"ps_muls0.", A (4, 12,1), AFRB_MASK, PPCPS, 0, {FRT, FRA, FRC}}, |
2008 | { "machhwsu.", XO(4,76,0,1), XO_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3122 | {"machhwu.", XO (4, 12,0,1), XO_MASK, MULHW, 0, {RT, RA, RB}}, |
2009 | { "machhwsuo", XO(4,76,1,0), XO_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3123 | {"ps_muls1", A (4, 13,0), AFRB_MASK, PPCPS, 0, {FRT, FRA, FRC}}, |
2010 | { "machhwsuo.", XO(4,76,1,1), XO_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3124 | {"ps_muls1.", A (4, 13,1), AFRB_MASK, PPCPS, 0, {FRT, FRA, FRC}}, |
2011 | { "machhwu", XO(4,12,0,0), XO_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3125 | {"ps_madds0", A (4, 14,0), A_MASK, PPCPS, 0, {FRT, FRA, FRC, FRB}}, |
2012 | { "machhwu.", XO(4,12,0,1), XO_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3126 | {"ps_madds0.", A (4, 14,1), A_MASK, PPCPS, 0, {FRT, FRA, FRC, FRB}}, |
2013 | { "machhwuo", XO(4,12,1,0), XO_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3127 | {"ps_madds1", A (4, 15,0), A_MASK, PPCPS, 0, {FRT, FRA, FRC, FRB}}, |
2014 | { "machhwuo.", XO(4,12,1,1), XO_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3128 | {"ps_madds1.", A (4, 15,1), A_MASK, PPCPS, 0, {FRT, FRA, FRC, FRB}}, |
2015 | { "maclhw", XO(4,428,0,0), XO_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3129 | {"vmhaddshs", VXA(4, 32), VXA_MASK, PPCVEC, 0, {VD, VA, VB, VC}}, |
2016 | { "maclhw.", XO(4,428,0,1), XO_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3130 | {"vmhraddshs", VXA(4, 33), VXA_MASK, PPCVEC, 0, {VD, VA, VB, VC}}, |
2017 | { "maclhwo", XO(4,428,1,0), XO_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3131 | {"vmladduhm", VXA(4, 34), VXA_MASK, PPCVEC, 0, {VD, VA, VB, VC}}, |
2018 | { "maclhwo.", XO(4,428,1,1), XO_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3132 | {"vmsumudm", VXA(4, 35), VXA_MASK, PPCVEC3, 0, {VD, VA, VB, VC}}, |
2019 | { "maclhws", XO(4,492,0,0), XO_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3133 | {"ps_div", A (4, 18,0), AFRC_MASK, PPCPS, 0, {FRT, FRA, FRB}}, |
2020 | { "maclhws.", XO(4,492,0,1), XO_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3134 | {"vmsumubm", VXA(4, 36), VXA_MASK, PPCVEC, 0, {VD, VA, VB, VC}}, |
2021 | { "maclhwso", XO(4,492,1,0), XO_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3135 | {"ps_div.", A (4, 18,1), AFRC_MASK, PPCPS, 0, {FRT, FRA, FRB}}, |
2022 | { "maclhwso.", XO(4,492,1,1), XO_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3136 | {"vmsummbm", VXA(4, 37), VXA_MASK, PPCVEC, 0, {VD, VA, VB, VC}}, |
2023 | { "maclhwsu", XO(4,460,0,0), XO_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3137 | {"vmsumuhm", VXA(4, 38), VXA_MASK, PPCVEC, 0, {VD, VA, VB, VC}}, |
2024 | { "maclhwsu.", XO(4,460,0,1), XO_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3138 | {"vmsumuhs", VXA(4, 39), VXA_MASK, PPCVEC, 0, {VD, VA, VB, VC}}, |
2025 | { "maclhwsuo", XO(4,460,1,0), XO_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3139 | {"ps_sub", A (4, 20,0), AFRC_MASK, PPCPS, 0, {FRT, FRA, FRB}}, |
2026 | { "maclhwsuo.", XO(4,460,1,1), XO_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3140 | {"vmsumshm", VXA(4, 40), VXA_MASK, PPCVEC, 0, {VD, VA, VB, VC}}, |
2027 | { "maclhwu", XO(4,396,0,0), XO_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3141 | {"ps_sub.", A (4, 20,1), AFRC_MASK, PPCPS, 0, {FRT, FRA, FRB}}, |
2028 | { "maclhwu.", XO(4,396,0,1), XO_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3142 | {"vmsumshs", VXA(4, 41), VXA_MASK, PPCVEC, 0, {VD, VA, VB, VC}}, |
2029 | { "maclhwuo", XO(4,396,1,0), XO_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3143 | {"ps_add", A (4, 21,0), AFRC_MASK, PPCPS, 0, {FRT, FRA, FRB}}, |
2030 | { "maclhwuo.", XO(4,396,1,1), XO_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3144 | {"vsel", VXA(4, 42), VXA_MASK, PPCVEC, 0, {VD, VA, VB, VC}}, |
2031 | { "mulchw", XRC(4,168,0), X_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3145 | {"ps_add.", A (4, 21,1), AFRC_MASK, PPCPS, 0, {FRT, FRA, FRB}}, |
2032 | { "mulchw.", XRC(4,168,1), X_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3146 | {"vperm", VXA(4, 43), VXA_MASK, PPCVEC, 0, {VD, VA, VB, VC}}, |
2033 | { "mulchwu", XRC(4,136,0), X_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3147 | {"vsldoi", VXA(4, 44), VXASHB_MASK, PPCVEC, 0, {VD, VA, VB, SHB}}, |
2034 | { "mulchwu.", XRC(4,136,1), X_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3148 | {"vpermxor", VXA(4, 45), VXA_MASK, PPCVEC2, 0, {VD, VA, VB, VC}}, |
2035 | { "mulhhw", XRC(4,40,0), X_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3149 | {"ps_sel", A (4, 23,0), A_MASK, PPCPS, 0, {FRT, FRA, FRC, FRB}}, |
2036 | { "mulhhw.", XRC(4,40,1), X_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3150 | {"vmaddfp", VXA(4, 46), VXA_MASK, PPCVEC, 0, {VD, VA, VC, VB}}, |
2037 | { "mulhhwu", XRC(4,8,0), X_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3151 | {"ps_sel.", A (4, 23,1), A_MASK, PPCPS, 0, {FRT, FRA, FRC, FRB}}, |
2038 | { "mulhhwu.", XRC(4,8,1), X_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3152 | {"vnmsubfp", VXA(4, 47), VXA_MASK, PPCVEC, 0, {VD, VA, VC, VB}}, |
2039 | { "mullhw", XRC(4,424,0), X_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3153 | {"ps_res", A (4, 24,0), AFRAFRC_MASK, PPCPS, 0, {FRT, FRB}}, |
2040 | { "mullhw.", XRC(4,424,1), X_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3154 | {"maddhd", VXA(4, 48), VXA_MASK, POWER9, 0, {RT, RA, RB, RC}}, |
2041 | { "mullhwu", XRC(4,392,0), X_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3155 | {"ps_res.", A (4, 24,1), AFRAFRC_MASK, PPCPS, 0, {FRT, FRB}}, |
2042 | { "mullhwu.", XRC(4,392,1), X_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3156 | {"maddhdu", VXA(4, 49), VXA_MASK, POWER9, 0, {RT, RA, RB, RC}}, |
2043 | { "nmacchw", XO(4,174,0,0), XO_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3157 | {"ps_mul", A (4, 25,0), AFRB_MASK, PPCPS, 0, {FRT, FRA, FRC}}, |
2044 | { "nmacchw.", XO(4,174,0,1), XO_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3158 | {"ps_mul.", A (4, 25,1), AFRB_MASK, PPCPS, 0, {FRT, FRA, FRC}}, |
2045 | { "nmacchwo", XO(4,174,1,0), XO_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3159 | {"maddld", VXA(4, 51), VXA_MASK, POWER9, 0, {RT, RA, RB, RC}}, |
2046 | { "nmacchwo.", XO(4,174,1,1), XO_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3160 | {"ps_rsqrte", A (4, 26,0), AFRAFRC_MASK, PPCPS, 0, {FRT, FRB}}, |
2047 | { "nmacchws", XO(4,238,0,0), XO_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3161 | {"ps_rsqrte.", A (4, 26,1), AFRAFRC_MASK, PPCPS, 0, {FRT, FRB}}, |
2048 | { "nmacchws.", XO(4,238,0,1), XO_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3162 | {"ps_msub", A (4, 28,0), A_MASK, PPCPS, 0, {FRT, FRA, FRC, FRB}}, |
2049 | { "nmacchwso", XO(4,238,1,0), XO_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3163 | {"ps_msub.", A (4, 28,1), A_MASK, PPCPS, 0, {FRT, FRA, FRC, FRB}}, |
2050 | { "nmacchwso.", XO(4,238,1,1), XO_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3164 | {"ps_madd", A (4, 29,0), A_MASK, PPCPS, 0, {FRT, FRA, FRC, FRB}}, |
2051 | { "nmachhw", XO(4,46,0,0), XO_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3165 | {"ps_madd.", A (4, 29,1), A_MASK, PPCPS, 0, {FRT, FRA, FRC, FRB}}, |
2052 | { "nmachhw.", XO(4,46,0,1), XO_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3166 | {"vpermr", VXA(4, 59), VXA_MASK, PPCVEC3, 0, {VD, VA, VB, VC}}, |
2053 | { "nmachhwo", XO(4,46,1,0), XO_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3167 | {"ps_nmsub", A (4, 30,0), A_MASK, PPCPS, 0, {FRT, FRA, FRC, FRB}}, |
2054 | { "nmachhwo.", XO(4,46,1,1), XO_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3168 | {"vaddeuqm", VXA(4, 60), VXA_MASK, PPCVEC2, 0, {VD, VA, VB, VC}}, |
2055 | { "nmachhws", XO(4,110,0,0), XO_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3169 | {"ps_nmsub.", A (4, 30,1), A_MASK, PPCPS, 0, {FRT, FRA, FRC, FRB}}, |
2056 | { "nmachhws.", XO(4,110,0,1), XO_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3170 | {"vaddecuq", VXA(4, 61), VXA_MASK, PPCVEC2, 0, {VD, VA, VB, VC}}, |
2057 | { "nmachhwso", XO(4,110,1,0), XO_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3171 | {"ps_nmadd", A (4, 31,0), A_MASK, PPCPS, 0, {FRT, FRA, FRC, FRB}}, |
2058 | { "nmachhwso.", XO(4,110,1,1), XO_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3172 | {"vsubeuqm", VXA(4, 62), VXA_MASK, PPCVEC2, 0, {VD, VA, VB, VC}}, |
2059 | { "nmaclhw", XO(4,430,0,0), XO_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3173 | {"ps_nmadd.", A (4, 31,1), A_MASK, PPCPS, 0, {FRT, FRA, FRC, FRB}}, |
2060 | { "nmaclhw.", XO(4,430,0,1), XO_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3174 | {"vsubecuq", VXA(4, 63), VXA_MASK, PPCVEC2, 0, {VD, VA, VB, VC}}, |
2061 | { "nmaclhwo", XO(4,430,1,0), XO_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3175 | {"ps_cmpo0", X (4, 32), XBF_MASK, PPCPS, 0, {BF, FRA, FRB}}, |
2062 | { "nmaclhwo.", XO(4,430,1,1), XO_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3176 | {"vadduhm", VX (4, 64), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2063 | { "nmaclhws", XO(4,494,0,0), XO_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3177 | {"vmul10ecuq", VX (4, 65), VX_MASK, PPCVEC3, 0, {VD, VA, VB}}, |
2064 | { "nmaclhws.", XO(4,494,0,1), XO_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3178 | {"vmaxuh", VX (4, 66), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2065 | { "nmaclhwso", XO(4,494,1,0), XO_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3179 | {"vrlh", VX (4, 68), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2066 | { "nmaclhwso.", XO(4,494,1,1), XO_MASK, PPC405|PPC440, { RT, RA, RB } }, | 3180 | {"vcmpequh", VXR(4, 70,0), VXR_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2067 | { "mfvscr", VX(4, 1540), VX_MASK, PPCVEC, { VD } }, | 3181 | {"vcmpneh", VXR(4, 71,0), VXR_MASK, PPCVEC3, 0, {VD, VA, VB}}, |
2068 | { "mtvscr", VX(4, 1604), VX_MASK, PPCVEC, { VB } }, | 3182 | {"vmulouh", VX (4, 72), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2069 | 3183 | {"vsubfp", VX (4, 74), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, | |
2070 | /* Double-precision opcodes. */ | 3184 | {"psq_lux", XW (4, 38,0), XW_MASK, PPCPS, 0, {FRT,RA,RB,PSWM,PSQM}}, |
2071 | /* Some of these conflict with AltiVec, so move them before, since | 3185 | {"vmrghh", VX (4, 76), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2072 | PPCVEC includes the PPC_OPCODE_PPC set. */ | 3186 | {"psq_stux", XW (4, 39,0), XW_MASK, PPCPS, 0, {FRS,RA,RB,PSWM,PSQM}}, |
2073 | { "efscfd", VX(4, 719), VX_MASK, PPCEFS, { RS, RB } }, | 3187 | {"vpkuwum", VX (4, 78), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2074 | { "efdabs", VX(4, 740), VX_MASK, PPCEFS, { RS, RA } }, | 3188 | {"ps_neg", XRC(4, 40,0), XRA_MASK, PPCPS, 0, {FRT, FRB}}, |
2075 | { "efdnabs", VX(4, 741), VX_MASK, PPCEFS, { RS, RA } }, | 3189 | {"mulhhw", XRC(4, 40,0), X_MASK, MULHW, 0, {RT, RA, RB}}, |
2076 | { "efdneg", VX(4, 742), VX_MASK, PPCEFS, { RS, RA } }, | 3190 | {"ps_neg.", XRC(4, 40,1), XRA_MASK, PPCPS, 0, {FRT, FRB}}, |
2077 | { "efdadd", VX(4, 736), VX_MASK, PPCEFS, { RS, RA, RB } }, | 3191 | {"mulhhw.", XRC(4, 40,1), X_MASK, MULHW, 0, {RT, RA, RB}}, |
2078 | { "efdsub", VX(4, 737), VX_MASK, PPCEFS, { RS, RA, RB } }, | 3192 | {"machhw", XO (4, 44,0,0), XO_MASK, MULHW, 0, {RT, RA, RB}}, |
2079 | { "efdmul", VX(4, 744), VX_MASK, PPCEFS, { RS, RA, RB } }, | 3193 | {"machhw.", XO (4, 44,0,1), XO_MASK, MULHW, 0, {RT, RA, RB}}, |
2080 | { "efddiv", VX(4, 745), VX_MASK, PPCEFS, { RS, RA, RB } }, | 3194 | {"nmachhw", XO (4, 46,0,0), XO_MASK, MULHW, 0, {RT, RA, RB}}, |
2081 | { "efdcmpgt", VX(4, 748), VX_MASK, PPCEFS, { CRFD, RA, RB } }, | 3195 | {"nmachhw.", XO (4, 46,0,1), XO_MASK, MULHW, 0, {RT, RA, RB}}, |
2082 | { "efdcmplt", VX(4, 749), VX_MASK, PPCEFS, { CRFD, RA, RB } }, | 3196 | {"ps_cmpu1", X (4, 64), XBF_MASK, PPCPS, 0, {BF, FRA, FRB}}, |
2083 | { "efdcmpeq", VX(4, 750), VX_MASK, PPCEFS, { CRFD, RA, RB } }, | 3197 | {"vadduwm", VX (4, 128), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2084 | { "efdtstgt", VX(4, 764), VX_MASK, PPCEFS, { CRFD, RA, RB } }, | 3198 | {"vmaxuw", VX (4, 130), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2085 | { "efdtstlt", VX(4, 765), VX_MASK, PPCEFS, { CRFD, RA, RB } }, | 3199 | {"vrlw", VX (4, 132), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2086 | { "efdtsteq", VX(4, 766), VX_MASK, PPCEFS, { CRFD, RA, RB } }, | 3200 | {"vrlwmi", VX (4, 133), VX_MASK, PPCVEC3, 0, {VD, VA, VB}}, |
2087 | { "efdcfsi", VX(4, 753), VX_MASK, PPCEFS, { RS, RB } }, | 3201 | {"vcmpequw", VXR(4, 134,0), VXR_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2088 | { "efdcfsid", VX(4, 739), VX_MASK, PPCEFS, { RS, RB } }, | 3202 | {"vcmpnew", VXR(4, 135,0), VXR_MASK, PPCVEC3, 0, {VD, VA, VB}}, |
2089 | { "efdcfui", VX(4, 752), VX_MASK, PPCEFS, { RS, RB } }, | 3203 | {"vmulouw", VX (4, 136), VX_MASK, PPCVEC2, 0, {VD, VA, VB}}, |
2090 | { "efdcfuid", VX(4, 738), VX_MASK, PPCEFS, { RS, RB } }, | 3204 | {"vmuluwm", VX (4, 137), VX_MASK, PPCVEC2, 0, {VD, VA, VB}}, |
2091 | { "efdcfsf", VX(4, 755), VX_MASK, PPCEFS, { RS, RB } }, | 3205 | {"vmrghw", VX (4, 140), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2092 | { "efdcfuf", VX(4, 754), VX_MASK, PPCEFS, { RS, RB } }, | 3206 | {"vpkuhus", VX (4, 142), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2093 | { "efdctsi", VX(4, 757), VX_MASK, PPCEFS, { RS, RB } }, | 3207 | {"ps_mr", XRC(4, 72,0), XRA_MASK, PPCPS, 0, {FRT, FRB}}, |
2094 | { "efdctsidz",VX(4, 747), VX_MASK, PPCEFS, { RS, RB } }, | 3208 | {"ps_mr.", XRC(4, 72,1), XRA_MASK, PPCPS, 0, {FRT, FRB}}, |
2095 | { "efdctsiz", VX(4, 762), VX_MASK, PPCEFS, { RS, RB } }, | 3209 | {"machhwsu", XO (4, 76,0,0), XO_MASK, MULHW, 0, {RT, RA, RB}}, |
2096 | { "efdctui", VX(4, 756), VX_MASK, PPCEFS, { RS, RB } }, | 3210 | {"machhwsu.", XO (4, 76,0,1), XO_MASK, MULHW, 0, {RT, RA, RB}}, |
2097 | { "efdctuidz",VX(4, 746), VX_MASK, PPCEFS, { RS, RB } }, | 3211 | {"ps_cmpo1", X (4, 96), XBF_MASK, PPCPS, 0, {BF, FRA, FRB}}, |
2098 | { "efdctuiz", VX(4, 760), VX_MASK, PPCEFS, { RS, RB } }, | 3212 | {"vaddudm", VX (4, 192), VX_MASK, PPCVEC2, 0, {VD, VA, VB}}, |
2099 | { "efdctsf", VX(4, 759), VX_MASK, PPCEFS, { RS, RB } }, | 3213 | {"vmaxud", VX (4, 194), VX_MASK, PPCVEC2, 0, {VD, VA, VB}}, |
2100 | { "efdctuf", VX(4, 758), VX_MASK, PPCEFS, { RS, RB } }, | 3214 | {"vrld", VX (4, 196), VX_MASK, PPCVEC2, 0, {VD, VA, VB}}, |
2101 | { "efdcfs", VX(4, 751), VX_MASK, PPCEFS, { RS, RB } }, | 3215 | {"vrldmi", VX (4, 197), VX_MASK, PPCVEC3, 0, {VD, VA, VB}}, |
2102 | /* End of double-precision opcodes. */ | 3216 | {"vcmpeqfp", VXR(4, 198,0), VXR_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2103 | 3217 | {"vcmpequd", VXR(4, 199,0), VXR_MASK, PPCVEC2, 0, {VD, VA, VB}}, | |
2104 | { "vaddcuw", VX(4, 384), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3218 | {"vpkuwus", VX (4, 206), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2105 | { "vaddfp", VX(4, 10), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3219 | {"machhws", XO (4, 108,0,0), XO_MASK, MULHW, 0, {RT, RA, RB}}, |
2106 | { "vaddsbs", VX(4, 768), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3220 | {"machhws.", XO (4, 108,0,1), XO_MASK, MULHW, 0, {RT, RA, RB}}, |
2107 | { "vaddshs", VX(4, 832), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3221 | {"nmachhws", XO (4, 110,0,0), XO_MASK, MULHW, 0, {RT, RA, RB}}, |
2108 | { "vaddsws", VX(4, 896), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3222 | {"nmachhws.", XO (4, 110,0,1), XO_MASK, MULHW, 0, {RT, RA, RB}}, |
2109 | { "vaddubm", VX(4, 0), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3223 | {"vadduqm", VX (4, 256), VX_MASK, PPCVEC2, 0, {VD, VA, VB}}, |
2110 | { "vaddubs", VX(4, 512), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3224 | {"vmaxsb", VX (4, 258), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2111 | { "vadduhm", VX(4, 64), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3225 | {"vslb", VX (4, 260), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2112 | { "vadduhs", VX(4, 576), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3226 | {"vcmpnezb", VXR(4, 263,0), VXR_MASK, PPCVEC3, 0, {VD, VA, VB}}, |
2113 | { "vadduwm", VX(4, 128), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3227 | {"vmulosb", VX (4, 264), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2114 | { "vadduws", VX(4, 640), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3228 | {"vrefp", VX (4, 266), VXVA_MASK, PPCVEC, 0, {VD, VB}}, |
2115 | { "vand", VX(4, 1028), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3229 | {"vmrglb", VX (4, 268), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2116 | { "vandc", VX(4, 1092), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3230 | {"vpkshus", VX (4, 270), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2117 | { "vavgsb", VX(4, 1282), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3231 | {"ps_nabs", XRC(4, 136,0), XRA_MASK, PPCPS, 0, {FRT, FRB}}, |
2118 | { "vavgsh", VX(4, 1346), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3232 | {"mulchwu", XRC(4, 136,0), X_MASK, MULHW, 0, {RT, RA, RB}}, |
2119 | { "vavgsw", VX(4, 1410), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3233 | {"ps_nabs.", XRC(4, 136,1), XRA_MASK, PPCPS, 0, {FRT, FRB}}, |
2120 | { "vavgub", VX(4, 1026), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3234 | {"mulchwu.", XRC(4, 136,1), X_MASK, MULHW, 0, {RT, RA, RB}}, |
2121 | { "vavguh", VX(4, 1090), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3235 | {"macchwu", XO (4, 140,0,0), XO_MASK, MULHW, 0, {RT, RA, RB}}, |
2122 | { "vavguw", VX(4, 1154), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3236 | {"macchwu.", XO (4, 140,0,1), XO_MASK, MULHW, 0, {RT, RA, RB}}, |
2123 | { "vcfsx", VX(4, 842), VX_MASK, PPCVEC, { VD, VB, UIMM } }, | 3237 | {"vaddcuq", VX (4, 320), VX_MASK, PPCVEC2, 0, {VD, VA, VB}}, |
2124 | { "vcfux", VX(4, 778), VX_MASK, PPCVEC, { VD, VB, UIMM } }, | 3238 | {"vmaxsh", VX (4, 322), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2125 | { "vcmpbfp", VXR(4, 966, 0), VXR_MASK, PPCVEC, { VD, VA, VB } }, | 3239 | {"vslh", VX (4, 324), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2126 | { "vcmpbfp.", VXR(4, 966, 1), VXR_MASK, PPCVEC, { VD, VA, VB } }, | 3240 | {"vcmpnezh", VXR(4, 327,0), VXR_MASK, PPCVEC3, 0, {VD, VA, VB}}, |
2127 | { "vcmpeqfp", VXR(4, 198, 0), VXR_MASK, PPCVEC, { VD, VA, VB } }, | 3241 | {"vmulosh", VX (4, 328), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2128 | { "vcmpeqfp.", VXR(4, 198, 1), VXR_MASK, PPCVEC, { VD, VA, VB } }, | 3242 | {"vrsqrtefp", VX (4, 330), VXVA_MASK, PPCVEC, 0, {VD, VB}}, |
2129 | { "vcmpequb", VXR(4, 6, 0), VXR_MASK, PPCVEC, { VD, VA, VB } }, | 3243 | {"vmrglh", VX (4, 332), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2130 | { "vcmpequb.", VXR(4, 6, 1), VXR_MASK, PPCVEC, { VD, VA, VB } }, | 3244 | {"vpkswus", VX (4, 334), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2131 | { "vcmpequh", VXR(4, 70, 0), VXR_MASK, PPCVEC, { VD, VA, VB } }, | 3245 | {"mulchw", XRC(4, 168,0), X_MASK, MULHW, 0, {RT, RA, RB}}, |
2132 | { "vcmpequh.", VXR(4, 70, 1), VXR_MASK, PPCVEC, { VD, VA, VB } }, | 3246 | {"mulchw.", XRC(4, 168,1), X_MASK, MULHW, 0, {RT, RA, RB}}, |
2133 | { "vcmpequw", VXR(4, 134, 0), VXR_MASK, PPCVEC, { VD, VA, VB } }, | 3247 | {"macchw", XO (4, 172,0,0), XO_MASK, MULHW, 0, {RT, RA, RB}}, |
2134 | { "vcmpequw.", VXR(4, 134, 1), VXR_MASK, PPCVEC, { VD, VA, VB } }, | 3248 | {"macchw.", XO (4, 172,0,1), XO_MASK, MULHW, 0, {RT, RA, RB}}, |
2135 | { "vcmpgefp", VXR(4, 454, 0), VXR_MASK, PPCVEC, { VD, VA, VB } }, | 3249 | {"nmacchw", XO (4, 174,0,0), XO_MASK, MULHW, 0, {RT, RA, RB}}, |
2136 | { "vcmpgefp.", VXR(4, 454, 1), VXR_MASK, PPCVEC, { VD, VA, VB } }, | 3250 | {"nmacchw.", XO (4, 174,0,1), XO_MASK, MULHW, 0, {RT, RA, RB}}, |
2137 | { "vcmpgtfp", VXR(4, 710, 0), VXR_MASK, PPCVEC, { VD, VA, VB } }, | 3251 | {"vaddcuw", VX (4, 384), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2138 | { "vcmpgtfp.", VXR(4, 710, 1), VXR_MASK, PPCVEC, { VD, VA, VB } }, | 3252 | {"vmaxsw", VX (4, 386), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2139 | { "vcmpgtsb", VXR(4, 774, 0), VXR_MASK, PPCVEC, { VD, VA, VB } }, | 3253 | {"vslw", VX (4, 388), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2140 | { "vcmpgtsb.", VXR(4, 774, 1), VXR_MASK, PPCVEC, { VD, VA, VB } }, | 3254 | {"vrlwnm", VX (4, 389), VX_MASK, PPCVEC3, 0, {VD, VA, VB}}, |
2141 | { "vcmpgtsh", VXR(4, 838, 0), VXR_MASK, PPCVEC, { VD, VA, VB } }, | 3255 | {"vcmpnezw", VXR(4, 391,0), VXR_MASK, PPCVEC3, 0, {VD, VA, VB}}, |
2142 | { "vcmpgtsh.", VXR(4, 838, 1), VXR_MASK, PPCVEC, { VD, VA, VB } }, | 3256 | {"vmulosw", VX (4, 392), VX_MASK, PPCVEC2, 0, {VD, VA, VB}}, |
2143 | { "vcmpgtsw", VXR(4, 902, 0), VXR_MASK, PPCVEC, { VD, VA, VB } }, | 3257 | {"vexptefp", VX (4, 394), VXVA_MASK, PPCVEC, 0, {VD, VB}}, |
2144 | { "vcmpgtsw.", VXR(4, 902, 1), VXR_MASK, PPCVEC, { VD, VA, VB } }, | 3258 | {"vmrglw", VX (4, 396), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2145 | { "vcmpgtub", VXR(4, 518, 0), VXR_MASK, PPCVEC, { VD, VA, VB } }, | 3259 | {"vpkshss", VX (4, 398), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2146 | { "vcmpgtub.", VXR(4, 518, 1), VXR_MASK, PPCVEC, { VD, VA, VB } }, | 3260 | {"macchwsu", XO (4, 204,0,0), XO_MASK, MULHW, 0, {RT, RA, RB}}, |
2147 | { "vcmpgtuh", VXR(4, 582, 0), VXR_MASK, PPCVEC, { VD, VA, VB } }, | 3261 | {"macchwsu.", XO (4, 204,0,1), XO_MASK, MULHW, 0, {RT, RA, RB}}, |
2148 | { "vcmpgtuh.", VXR(4, 582, 1), VXR_MASK, PPCVEC, { VD, VA, VB } }, | 3262 | {"vmaxsd", VX (4, 450), VX_MASK, PPCVEC2, 0, {VD, VA, VB}}, |
2149 | { "vcmpgtuw", VXR(4, 646, 0), VXR_MASK, PPCVEC, { VD, VA, VB } }, | 3263 | {"vsl", VX (4, 452), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2150 | { "vcmpgtuw.", VXR(4, 646, 1), VXR_MASK, PPCVEC, { VD, VA, VB } }, | 3264 | {"vrldnm", VX (4, 453), VX_MASK, PPCVEC3, 0, {VD, VA, VB}}, |
2151 | { "vctsxs", VX(4, 970), VX_MASK, PPCVEC, { VD, VB, UIMM } }, | 3265 | {"vcmpgefp", VXR(4, 454,0), VXR_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2152 | { "vctuxs", VX(4, 906), VX_MASK, PPCVEC, { VD, VB, UIMM } }, | 3266 | {"vlogefp", VX (4, 458), VXVA_MASK, PPCVEC, 0, {VD, VB}}, |
2153 | { "vexptefp", VX(4, 394), VX_MASK, PPCVEC, { VD, VB } }, | 3267 | {"vpkswss", VX (4, 462), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2154 | { "vlogefp", VX(4, 458), VX_MASK, PPCVEC, { VD, VB } }, | 3268 | {"macchws", XO (4, 236,0,0), XO_MASK, MULHW, 0, {RT, RA, RB}}, |
2155 | { "vmaddfp", VXA(4, 46), VXA_MASK, PPCVEC, { VD, VA, VC, VB } }, | 3269 | {"macchws.", XO (4, 236,0,1), XO_MASK, MULHW, 0, {RT, RA, RB}}, |
2156 | { "vmaxfp", VX(4, 1034), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3270 | {"nmacchws", XO (4, 238,0,0), XO_MASK, MULHW, 0, {RT, RA, RB}}, |
2157 | { "vmaxsb", VX(4, 258), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3271 | {"nmacchws.", XO (4, 238,0,1), XO_MASK, MULHW, 0, {RT, RA, RB}}, |
2158 | { "vmaxsh", VX(4, 322), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3272 | {"evaddw", VX (4, 512), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2159 | { "vmaxsw", VX(4, 386), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3273 | {"vaddubs", VX (4, 512), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2160 | { "vmaxub", VX(4, 2), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3274 | {"vmul10uq", VX (4, 513), VXVB_MASK, PPCVEC3, 0, {VD, VA}}, |
2161 | { "vmaxuh", VX(4, 66), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3275 | {"evaddiw", VX (4, 514), VX_MASK, PPCSPE, 0, {RS, RB, UIMM}}, |
2162 | { "vmaxuw", VX(4, 130), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3276 | {"vminub", VX (4, 514), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2163 | { "vmhaddshs", VXA(4, 32), VXA_MASK, PPCVEC, { VD, VA, VB, VC } }, | 3277 | {"evsubfw", VX (4, 516), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2164 | { "vmhraddshs", VXA(4, 33), VXA_MASK, PPCVEC, { VD, VA, VB, VC } }, | 3278 | {"evsubw", VX (4, 516), VX_MASK, PPCSPE, 0, {RS, RB, RA}}, |
2165 | { "vminfp", VX(4, 1098), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3279 | {"vsrb", VX (4, 516), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2166 | { "vminsb", VX(4, 770), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3280 | {"evsubifw", VX (4, 518), VX_MASK, PPCSPE, 0, {RS, UIMM, RB}}, |
2167 | { "vminsh", VX(4, 834), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3281 | {"evsubiw", VX (4, 518), VX_MASK, PPCSPE, 0, {RS, RB, UIMM}}, |
2168 | { "vminsw", VX(4, 898), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3282 | {"vcmpgtub", VXR(4, 518,0), VXR_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2169 | { "vminub", VX(4, 514), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3283 | {"evabs", VX (4, 520), VX_MASK, PPCSPE, 0, {RS, RA}}, |
2170 | { "vminuh", VX(4, 578), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3284 | {"vmuleub", VX (4, 520), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2171 | { "vminuw", VX(4, 642), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3285 | {"evneg", VX (4, 521), VX_MASK, PPCSPE, 0, {RS, RA}}, |
2172 | { "vmladduhm", VXA(4, 34), VXA_MASK, PPCVEC, { VD, VA, VB, VC } }, | 3286 | {"evextsb", VX (4, 522), VX_MASK, PPCSPE, 0, {RS, RA}}, |
2173 | { "vmrghb", VX(4, 12), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3287 | {"vrfin", VX (4, 522), VXVA_MASK, PPCVEC, 0, {VD, VB}}, |
2174 | { "vmrghh", VX(4, 76), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3288 | {"evextsh", VX (4, 523), VX_MASK, PPCSPE, 0, {RS, RA}}, |
2175 | { "vmrghw", VX(4, 140), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3289 | {"evrndw", VX (4, 524), VX_MASK, PPCSPE, 0, {RS, RA}}, |
2176 | { "vmrglb", VX(4, 268), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3290 | {"vspltb", VX (4, 524), VXUIMM4_MASK, PPCVEC, 0, {VD, VB, UIMM4}}, |
2177 | { "vmrglh", VX(4, 332), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3291 | {"vextractub", VX (4, 525), VXUIMM4_MASK, PPCVEC3, 0, {VD, VB, UIMM4}}, |
2178 | { "vmrglw", VX(4, 396), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3292 | {"evcntlzw", VX (4, 525), VX_MASK, PPCSPE, 0, {RS, RA}}, |
2179 | { "vmsummbm", VXA(4, 37), VXA_MASK, PPCVEC, { VD, VA, VB, VC } }, | 3293 | {"evcntlsw", VX (4, 526), VX_MASK, PPCSPE, 0, {RS, RA}}, |
2180 | { "vmsumshm", VXA(4, 40), VXA_MASK, PPCVEC, { VD, VA, VB, VC } }, | 3294 | {"vupkhsb", VX (4, 526), VXVA_MASK, PPCVEC, 0, {VD, VB}}, |
2181 | { "vmsumshs", VXA(4, 41), VXA_MASK, PPCVEC, { VD, VA, VB, VC } }, | 3295 | {"brinc", VX (4, 527), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2182 | { "vmsumubm", VXA(4, 36), VXA_MASK, PPCVEC, { VD, VA, VB, VC } }, | 3296 | {"ps_abs", XRC(4, 264,0), XRA_MASK, PPCPS, 0, {FRT, FRB}}, |
2183 | { "vmsumuhm", VXA(4, 38), VXA_MASK, PPCVEC, { VD, VA, VB, VC } }, | 3297 | {"ps_abs.", XRC(4, 264,1), XRA_MASK, PPCPS, 0, {FRT, FRB}}, |
2184 | { "vmsumuhs", VXA(4, 39), VXA_MASK, PPCVEC, { VD, VA, VB, VC } }, | 3298 | {"evand", VX (4, 529), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2185 | { "vmulesb", VX(4, 776), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3299 | {"evandc", VX (4, 530), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2186 | { "vmulesh", VX(4, 840), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3300 | {"evxor", VX (4, 534), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2187 | { "vmuleub", VX(4, 520), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3301 | {"evmr", VX (4, 535), VX_MASK, PPCSPE, 0, {RS, RA, BBA}}, |
2188 | { "vmuleuh", VX(4, 584), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3302 | {"evor", VX (4, 535), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2189 | { "vmulosb", VX(4, 264), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3303 | {"evnor", VX (4, 536), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2190 | { "vmulosh", VX(4, 328), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3304 | {"evnot", VX (4, 536), VX_MASK, PPCSPE, 0, {RS, RA, BBA}}, |
2191 | { "vmuloub", VX(4, 8), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3305 | {"get", APU(4, 268,0), APU_RA_MASK, PPC405, 0, {RT, FSL}}, |
2192 | { "vmulouh", VX(4, 72), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3306 | {"eveqv", VX (4, 537), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2193 | { "vnmsubfp", VXA(4, 47), VXA_MASK, PPCVEC, { VD, VA, VC, VB } }, | 3307 | {"evorc", VX (4, 539), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2194 | { "vnor", VX(4, 1284), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3308 | {"evnand", VX (4, 542), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2195 | { "vor", VX(4, 1156), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3309 | {"evsrwu", VX (4, 544), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2196 | { "vperm", VXA(4, 43), VXA_MASK, PPCVEC, { VD, VA, VB, VC } }, | 3310 | {"evsrws", VX (4, 545), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2197 | { "vpkpx", VX(4, 782), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3311 | {"evsrwiu", VX (4, 546), VX_MASK, PPCSPE, 0, {RS, RA, EVUIMM}}, |
2198 | { "vpkshss", VX(4, 398), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3312 | {"evsrwis", VX (4, 547), VX_MASK, PPCSPE, 0, {RS, RA, EVUIMM}}, |
2199 | { "vpkshus", VX(4, 270), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3313 | {"evslw", VX (4, 548), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2200 | { "vpkswss", VX(4, 462), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3314 | {"evslwi", VX (4, 550), VX_MASK, PPCSPE, 0, {RS, RA, EVUIMM}}, |
2201 | { "vpkswus", VX(4, 334), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3315 | {"evrlw", VX (4, 552), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2202 | { "vpkuhum", VX(4, 14), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3316 | {"evsplati", VX (4, 553), VX_MASK, PPCSPE, 0, {RS, SIMM}}, |
2203 | { "vpkuhus", VX(4, 142), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3317 | {"evrlwi", VX (4, 554), VX_MASK, PPCSPE, 0, {RS, RA, EVUIMM}}, |
2204 | { "vpkuwum", VX(4, 78), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3318 | {"evsplatfi", VX (4, 555), VX_MASK, PPCSPE, 0, {RS, SIMM}}, |
2205 | { "vpkuwus", VX(4, 206), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3319 | {"evmergehi", VX (4, 556), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2206 | { "vrefp", VX(4, 266), VX_MASK, PPCVEC, { VD, VB } }, | 3320 | {"evmergelo", VX (4, 557), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2207 | { "vrfim", VX(4, 714), VX_MASK, PPCVEC, { VD, VB } }, | 3321 | {"evmergehilo", VX (4, 558), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2208 | { "vrfin", VX(4, 522), VX_MASK, PPCVEC, { VD, VB } }, | 3322 | {"evmergelohi", VX (4, 559), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2209 | { "vrfip", VX(4, 650), VX_MASK, PPCVEC, { VD, VB } }, | 3323 | {"evcmpgtu", VX (4, 560), VX_MASK, PPCSPE, 0, {CRFD, RA, RB}}, |
2210 | { "vrfiz", VX(4, 586), VX_MASK, PPCVEC, { VD, VB } }, | 3324 | {"evcmpgts", VX (4, 561), VX_MASK, PPCSPE, 0, {CRFD, RA, RB}}, |
2211 | { "vrlb", VX(4, 4), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3325 | {"evcmpltu", VX (4, 562), VX_MASK, PPCSPE, 0, {CRFD, RA, RB}}, |
2212 | { "vrlh", VX(4, 68), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3326 | {"evcmplts", VX (4, 563), VX_MASK, PPCSPE, 0, {CRFD, RA, RB}}, |
2213 | { "vrlw", VX(4, 132), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3327 | {"evcmpeq", VX (4, 564), VX_MASK, PPCSPE, 0, {CRFD, RA, RB}}, |
2214 | { "vrsqrtefp", VX(4, 330), VX_MASK, PPCVEC, { VD, VB } }, | 3328 | {"cget", APU(4, 284,0), APU_RA_MASK, PPC405, 0, {RT, FSL}}, |
2215 | { "vsel", VXA(4, 42), VXA_MASK, PPCVEC, { VD, VA, VB, VC } }, | 3329 | {"vadduhs", VX (4, 576), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2216 | { "vsl", VX(4, 452), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3330 | {"vmul10euq", VX (4, 577), VX_MASK, PPCVEC3, 0, {VD, VA, VB}}, |
2217 | { "vslb", VX(4, 260), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3331 | {"vminuh", VX (4, 578), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2218 | { "vsldoi", VXA(4, 44), VXA_MASK, PPCVEC, { VD, VA, VB, SHB } }, | 3332 | {"vsrh", VX (4, 580), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2219 | { "vslh", VX(4, 324), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3333 | {"vcmpgtuh", VXR(4, 582,0), VXR_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2220 | { "vslo", VX(4, 1036), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3334 | {"vmuleuh", VX (4, 584), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2221 | { "vslw", VX(4, 388), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3335 | {"vrfiz", VX (4, 586), VXVA_MASK, PPCVEC, 0, {VD, VB}}, |
2222 | { "vspltb", VX(4, 524), VX_MASK, PPCVEC, { VD, VB, UIMM } }, | 3336 | {"vsplth", VX (4, 588), VXUIMM3_MASK, PPCVEC, 0, {VD, VB, UIMM3}}, |
2223 | { "vsplth", VX(4, 588), VX_MASK, PPCVEC, { VD, VB, UIMM } }, | 3337 | {"vextractuh", VX (4, 589), VXUIMM4_MASK, PPCVEC3, 0, {VD, VB, UIMM4}}, |
2224 | { "vspltisb", VX(4, 780), VX_MASK, PPCVEC, { VD, SIMM } }, | 3338 | {"vupkhsh", VX (4, 590), VXVA_MASK, PPCVEC, 0, {VD, VB}}, |
2225 | { "vspltish", VX(4, 844), VX_MASK, PPCVEC, { VD, SIMM } }, | 3339 | {"nget", APU(4, 300,0), APU_RA_MASK, PPC405, 0, {RT, FSL}}, |
2226 | { "vspltisw", VX(4, 908), VX_MASK, PPCVEC, { VD, SIMM } }, | 3340 | {"evsel", EVSEL(4,79), EVSEL_MASK, PPCSPE, 0, {RS, RA, RB, CRFS}}, |
2227 | { "vspltw", VX(4, 652), VX_MASK, PPCVEC, { VD, VB, UIMM } }, | 3341 | {"ncget", APU(4, 316,0), APU_RA_MASK, PPC405, 0, {RT, FSL}}, |
2228 | { "vsr", VX(4, 708), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3342 | {"evfsadd", VX (4, 640), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2229 | { "vsrab", VX(4, 772), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3343 | {"vadduws", VX (4, 640), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2230 | { "vsrah", VX(4, 836), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3344 | {"evfssub", VX (4, 641), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2231 | { "vsraw", VX(4, 900), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3345 | {"vminuw", VX (4, 642), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2232 | { "vsrb", VX(4, 516), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3346 | {"evfsabs", VX (4, 644), VX_MASK, PPCSPE, 0, {RS, RA}}, |
2233 | { "vsrh", VX(4, 580), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3347 | {"vsrw", VX (4, 644), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2234 | { "vsro", VX(4, 1100), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3348 | {"evfsnabs", VX (4, 645), VX_MASK, PPCSPE, 0, {RS, RA}}, |
2235 | { "vsrw", VX(4, 644), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3349 | {"evfsneg", VX (4, 646), VX_MASK, PPCSPE, 0, {RS, RA}}, |
2236 | { "vsubcuw", VX(4, 1408), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3350 | {"vcmpgtuw", VXR(4, 646,0), VXR_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2237 | { "vsubfp", VX(4, 74), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3351 | {"vmuleuw", VX (4, 648), VX_MASK, PPCVEC2, 0, {VD, VA, VB}}, |
2238 | { "vsubsbs", VX(4, 1792), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3352 | {"evfsmul", VX (4, 648), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2239 | { "vsubshs", VX(4, 1856), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3353 | {"evfsdiv", VX (4, 649), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2240 | { "vsubsws", VX(4, 1920), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3354 | {"vrfip", VX (4, 650), VXVA_MASK, PPCVEC, 0, {VD, VB}}, |
2241 | { "vsububm", VX(4, 1024), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3355 | {"evfscmpgt", VX (4, 652), VX_MASK, PPCSPE, 0, {CRFD, RA, RB}}, |
2242 | { "vsububs", VX(4, 1536), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3356 | {"vspltw", VX (4, 652), VXUIMM2_MASK, PPCVEC, 0, {VD, VB, UIMM2}}, |
2243 | { "vsubuhm", VX(4, 1088), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3357 | {"vextractuw", VX (4, 653), VXUIMM4_MASK, PPCVEC3, 0, {VD, VB, UIMM4}}, |
2244 | { "vsubuhs", VX(4, 1600), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3358 | {"evfscmplt", VX (4, 653), VX_MASK, PPCSPE, 0, {CRFD, RA, RB}}, |
2245 | { "vsubuwm", VX(4, 1152), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3359 | {"evfscmpeq", VX (4, 654), VX_MASK, PPCSPE, 0, {CRFD, RA, RB}}, |
2246 | { "vsubuws", VX(4, 1664), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3360 | {"vupklsb", VX (4, 654), VXVA_MASK, PPCVEC, 0, {VD, VB}}, |
2247 | { "vsumsws", VX(4, 1928), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3361 | {"evfscfui", VX (4, 656), VX_MASK, PPCSPE, 0, {RS, RB}}, |
2248 | { "vsum2sws", VX(4, 1672), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3362 | {"evfscfsi", VX (4, 657), VX_MASK, PPCSPE, 0, {RS, RB}}, |
2249 | { "vsum4sbs", VX(4, 1800), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3363 | {"evfscfuf", VX (4, 658), VX_MASK, PPCSPE, 0, {RS, RB}}, |
2250 | { "vsum4shs", VX(4, 1608), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3364 | {"evfscfsf", VX (4, 659), VX_MASK, PPCSPE, 0, {RS, RB}}, |
2251 | { "vsum4ubs", VX(4, 1544), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3365 | {"evfsctui", VX (4, 660), VX_MASK, PPCSPE, 0, {RS, RB}}, |
2252 | { "vupkhpx", VX(4, 846), VX_MASK, PPCVEC, { VD, VB } }, | 3366 | {"evfsctsi", VX (4, 661), VX_MASK, PPCSPE, 0, {RS, RB}}, |
2253 | { "vupkhsb", VX(4, 526), VX_MASK, PPCVEC, { VD, VB } }, | 3367 | {"evfsctuf", VX (4, 662), VX_MASK, PPCSPE, 0, {RS, RB}}, |
2254 | { "vupkhsh", VX(4, 590), VX_MASK, PPCVEC, { VD, VB } }, | 3368 | {"evfsctsf", VX (4, 663), VX_MASK, PPCSPE, 0, {RS, RB}}, |
2255 | { "vupklpx", VX(4, 974), VX_MASK, PPCVEC, { VD, VB } }, | 3369 | {"evfsctuiz", VX (4, 664), VX_MASK, PPCSPE, 0, {RS, RB}}, |
2256 | { "vupklsb", VX(4, 654), VX_MASK, PPCVEC, { VD, VB } }, | 3370 | {"put", APU(4, 332,0), APU_RT_MASK, PPC405, 0, {RA, FSL}}, |
2257 | { "vupklsh", VX(4, 718), VX_MASK, PPCVEC, { VD, VB } }, | 3371 | {"evfsctsiz", VX (4, 666), VX_MASK, PPCSPE, 0, {RS, RB}}, |
2258 | { "vxor", VX(4, 1220), VX_MASK, PPCVEC, { VD, VA, VB } }, | 3372 | {"evfststgt", VX (4, 668), VX_MASK, PPCSPE, 0, {CRFD, RA, RB}}, |
2259 | 3373 | {"evfststlt", VX (4, 669), VX_MASK, PPCSPE, 0, {CRFD, RA, RB}}, | |
2260 | { "evaddw", VX(4, 512), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3374 | {"evfststeq", VX (4, 670), VX_MASK, PPCSPE, 0, {CRFD, RA, RB}}, |
2261 | { "evaddiw", VX(4, 514), VX_MASK, PPCSPE, { RS, RB, UIMM } }, | 3375 | {"cput", APU(4, 348,0), APU_RT_MASK, PPC405, 0, {RA, FSL}}, |
2262 | { "evsubfw", VX(4, 516), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3376 | {"efsadd", VX (4, 704), VX_MASK, PPCEFS, 0, {RS, RA, RB}}, |
2263 | { "evsubw", VX(4, 516), VX_MASK, PPCSPE, { RS, RB, RA } }, | 3377 | {"efssub", VX (4, 705), VX_MASK, PPCEFS, 0, {RS, RA, RB}}, |
2264 | { "evsubifw", VX(4, 518), VX_MASK, PPCSPE, { RS, UIMM, RB } }, | 3378 | {"vminud", VX (4, 706), VX_MASK, PPCVEC2, 0, {VD, VA, VB}}, |
2265 | { "evsubiw", VX(4, 518), VX_MASK, PPCSPE, { RS, RB, UIMM } }, | 3379 | {"efsabs", VX (4, 708), VX_MASK, PPCEFS, 0, {RS, RA}}, |
2266 | { "evabs", VX(4, 520), VX_MASK, PPCSPE, { RS, RA } }, | 3380 | {"vsr", VX (4, 708), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2267 | { "evneg", VX(4, 521), VX_MASK, PPCSPE, { RS, RA } }, | 3381 | {"efsnabs", VX (4, 709), VX_MASK, PPCEFS, 0, {RS, RA}}, |
2268 | { "evextsb", VX(4, 522), VX_MASK, PPCSPE, { RS, RA } }, | 3382 | {"efsneg", VX (4, 710), VX_MASK, PPCEFS, 0, {RS, RA}}, |
2269 | { "evextsh", VX(4, 523), VX_MASK, PPCSPE, { RS, RA } }, | 3383 | {"vcmpgtfp", VXR(4, 710,0), VXR_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2270 | { "evrndw", VX(4, 524), VX_MASK, PPCSPE, { RS, RA } }, | 3384 | {"vcmpgtud", VXR(4, 711,0), VXR_MASK, PPCVEC2, 0, {VD, VA, VB}}, |
2271 | { "evcntlzw", VX(4, 525), VX_MASK, PPCSPE, { RS, RA } }, | 3385 | {"efsmul", VX (4, 712), VX_MASK, PPCEFS, 0, {RS, RA, RB}}, |
2272 | { "evcntlsw", VX(4, 526), VX_MASK, PPCSPE, { RS, RA } }, | 3386 | {"efsdiv", VX (4, 713), VX_MASK, PPCEFS, 0, {RS, RA, RB}}, |
2273 | 3387 | {"vrfim", VX (4, 714), VXVA_MASK, PPCVEC, 0, {VD, VB}}, | |
2274 | { "brinc", VX(4, 527), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3388 | {"efscmpgt", VX (4, 716), VX_MASK, PPCEFS, 0, {CRFD, RA, RB}}, |
2275 | 3389 | {"vextractd", VX (4, 717), VXUIMM4_MASK, PPCVEC3, 0, {VD, VB, UIMM4}}, | |
2276 | { "evand", VX(4, 529), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3390 | {"efscmplt", VX (4, 717), VX_MASK, PPCEFS, 0, {CRFD, RA, RB}}, |
2277 | { "evandc", VX(4, 530), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3391 | {"efscmpeq", VX (4, 718), VX_MASK, PPCEFS, 0, {CRFD, RA, RB}}, |
2278 | { "evmr", VX(4, 535), VX_MASK, PPCSPE, { RS, RA, BBA } }, | 3392 | {"vupklsh", VX (4, 718), VXVA_MASK, PPCVEC, 0, {VD, VB}}, |
2279 | { "evor", VX(4, 535), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3393 | {"efscfd", VX (4, 719), VX_MASK, PPCEFS, 0, {RS, RB}}, |
2280 | { "evorc", VX(4, 539), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3394 | {"efscfui", VX (4, 720), VX_MASK, PPCEFS, 0, {RS, RB}}, |
2281 | { "evxor", VX(4, 534), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3395 | {"efscfsi", VX (4, 721), VX_MASK, PPCEFS, 0, {RS, RB}}, |
2282 | { "eveqv", VX(4, 537), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3396 | {"efscfuf", VX (4, 722), VX_MASK, PPCEFS, 0, {RS, RB}}, |
2283 | { "evnand", VX(4, 542), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3397 | {"efscfsf", VX (4, 723), VX_MASK, PPCEFS, 0, {RS, RB}}, |
2284 | { "evnot", VX(4, 536), VX_MASK, PPCSPE, { RS, RA, BBA } }, | 3398 | {"efsctui", VX (4, 724), VX_MASK, PPCEFS, 0, {RS, RB}}, |
2285 | { "evnor", VX(4, 536), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3399 | {"efsctsi", VX (4, 725), VX_MASK, PPCEFS, 0, {RS, RB}}, |
2286 | 3400 | {"efsctuf", VX (4, 726), VX_MASK, PPCEFS, 0, {RS, RB}}, | |
2287 | { "evrlw", VX(4, 552), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3401 | {"efsctsf", VX (4, 727), VX_MASK, PPCEFS, 0, {RS, RB}}, |
2288 | { "evrlwi", VX(4, 554), VX_MASK, PPCSPE, { RS, RA, EVUIMM } }, | 3402 | {"efsctuiz", VX (4, 728), VX_MASK, PPCEFS, 0, {RS, RB}}, |
2289 | { "evslw", VX(4, 548), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3403 | {"nput", APU(4, 364,0), APU_RT_MASK, PPC405, 0, {RA, FSL}}, |
2290 | { "evslwi", VX(4, 550), VX_MASK, PPCSPE, { RS, RA, EVUIMM } }, | 3404 | {"efsctsiz", VX (4, 730), VX_MASK, PPCEFS, 0, {RS, RB}}, |
2291 | { "evsrws", VX(4, 545), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3405 | {"efststgt", VX (4, 732), VX_MASK, PPCEFS, 0, {CRFD, RA, RB}}, |
2292 | { "evsrwu", VX(4, 544), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3406 | {"efststlt", VX (4, 733), VX_MASK, PPCEFS, 0, {CRFD, RA, RB}}, |
2293 | { "evsrwis", VX(4, 547), VX_MASK, PPCSPE, { RS, RA, EVUIMM } }, | 3407 | {"efststeq", VX (4, 734), VX_MASK, PPCEFS, 0, {CRFD, RA, RB}}, |
2294 | { "evsrwiu", VX(4, 546), VX_MASK, PPCSPE, { RS, RA, EVUIMM } }, | 3408 | {"efdadd", VX (4, 736), VX_MASK, PPCEFS, 0, {RS, RA, RB}}, |
2295 | { "evsplati", VX(4, 553), VX_MASK, PPCSPE, { RS, SIMM } }, | 3409 | {"efdsub", VX (4, 737), VX_MASK, PPCEFS, 0, {RS, RA, RB}}, |
2296 | { "evsplatfi", VX(4, 555), VX_MASK, PPCSPE, { RS, SIMM } }, | 3410 | {"efdcfuid", VX (4, 738), VX_MASK, PPCEFS, 0, {RS, RB}}, |
2297 | { "evmergehi", VX(4, 556), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3411 | {"efdcfsid", VX (4, 739), VX_MASK, PPCEFS, 0, {RS, RB}}, |
2298 | { "evmergelo", VX(4, 557), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3412 | {"efdabs", VX (4, 740), VX_MASK, PPCEFS, 0, {RS, RA}}, |
2299 | { "evmergehilo",VX(4,558), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3413 | {"efdnabs", VX (4, 741), VX_MASK, PPCEFS, 0, {RS, RA}}, |
2300 | { "evmergelohi",VX(4,559), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3414 | {"efdneg", VX (4, 742), VX_MASK, PPCEFS, 0, {RS, RA}}, |
2301 | 3415 | {"efdmul", VX (4, 744), VX_MASK, PPCEFS, 0, {RS, RA, RB}}, | |
2302 | { "evcmpgts", VX(4, 561), VX_MASK, PPCSPE, { CRFD, RA, RB } }, | 3416 | {"efddiv", VX (4, 745), VX_MASK, PPCEFS, 0, {RS, RA, RB}}, |
2303 | { "evcmpgtu", VX(4, 560), VX_MASK, PPCSPE, { CRFD, RA, RB } }, | 3417 | {"efdctuidz", VX (4, 746), VX_MASK, PPCEFS, 0, {RS, RB}}, |
2304 | { "evcmplts", VX(4, 563), VX_MASK, PPCSPE, { CRFD, RA, RB } }, | 3418 | {"efdctsidz", VX (4, 747), VX_MASK, PPCEFS, 0, {RS, RB}}, |
2305 | { "evcmpltu", VX(4, 562), VX_MASK, PPCSPE, { CRFD, RA, RB } }, | 3419 | {"efdcmpgt", VX (4, 748), VX_MASK, PPCEFS, 0, {CRFD, RA, RB}}, |
2306 | { "evcmpeq", VX(4, 564), VX_MASK, PPCSPE, { CRFD, RA, RB } }, | 3420 | {"efdcmplt", VX (4, 749), VX_MASK, PPCEFS, 0, {CRFD, RA, RB}}, |
2307 | { "evsel", EVSEL(4,79),EVSEL_MASK, PPCSPE, { RS, RA, RB, CRFS } }, | 3421 | {"efdcmpeq", VX (4, 750), VX_MASK, PPCEFS, 0, {CRFD, RA, RB}}, |
2308 | 3422 | {"efdcfs", VX (4, 751), VX_MASK, PPCEFS, 0, {RS, RB}}, | |
2309 | { "evldd", VX(4, 769), VX_MASK, PPCSPE, { RS, EVUIMM_8, RA } }, | 3423 | {"efdcfui", VX (4, 752), VX_MASK, PPCEFS, 0, {RS, RB}}, |
2310 | { "evlddx", VX(4, 768), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3424 | {"efdcfsi", VX (4, 753), VX_MASK, PPCEFS, 0, {RS, RB}}, |
2311 | { "evldw", VX(4, 771), VX_MASK, PPCSPE, { RS, EVUIMM_8, RA } }, | 3425 | {"efdcfuf", VX (4, 754), VX_MASK, PPCEFS, 0, {RS, RB}}, |
2312 | { "evldwx", VX(4, 770), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3426 | {"efdcfsf", VX (4, 755), VX_MASK, PPCEFS, 0, {RS, RB}}, |
2313 | { "evldh", VX(4, 773), VX_MASK, PPCSPE, { RS, EVUIMM_8, RA } }, | 3427 | {"efdctui", VX (4, 756), VX_MASK, PPCEFS, 0, {RS, RB}}, |
2314 | { "evldhx", VX(4, 772), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3428 | {"efdctsi", VX (4, 757), VX_MASK, PPCEFS, 0, {RS, RB}}, |
2315 | { "evlwhe", VX(4, 785), VX_MASK, PPCSPE, { RS, EVUIMM_4, RA } }, | 3429 | {"efdctuf", VX (4, 758), VX_MASK, PPCEFS, 0, {RS, RB}}, |
2316 | { "evlwhex", VX(4, 784), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3430 | {"efdctsf", VX (4, 759), VX_MASK, PPCEFS, 0, {RS, RB}}, |
2317 | { "evlwhou", VX(4, 789), VX_MASK, PPCSPE, { RS, EVUIMM_4, RA } }, | 3431 | {"efdctuiz", VX (4, 760), VX_MASK, PPCEFS, 0, {RS, RB}}, |
2318 | { "evlwhoux", VX(4, 788), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3432 | {"ncput", APU(4, 380,0), APU_RT_MASK, PPC405, 0, {RA, FSL}}, |
2319 | { "evlwhos", VX(4, 791), VX_MASK, PPCSPE, { RS, EVUIMM_4, RA } }, | 3433 | {"efdctsiz", VX (4, 762), VX_MASK, PPCEFS, 0, {RS, RB}}, |
2320 | { "evlwhosx", VX(4, 790), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3434 | {"efdtstgt", VX (4, 764), VX_MASK, PPCEFS, 0, {CRFD, RA, RB}}, |
2321 | { "evlwwsplat",VX(4, 793), VX_MASK, PPCSPE, { RS, EVUIMM_4, RA } }, | 3435 | {"efdtstlt", VX (4, 765), VX_MASK, PPCEFS, 0, {CRFD, RA, RB}}, |
2322 | { "evlwwsplatx",VX(4, 792), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3436 | {"efdtsteq", VX (4, 766), VX_MASK, PPCEFS, 0, {CRFD, RA, RB}}, |
2323 | { "evlwhsplat",VX(4, 797), VX_MASK, PPCSPE, { RS, EVUIMM_4, RA } }, | 3437 | {"evlddx", VX (4, 768), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2324 | { "evlwhsplatx",VX(4, 796), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3438 | {"vaddsbs", VX (4, 768), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2325 | { "evlhhesplat",VX(4, 777), VX_MASK, PPCSPE, { RS, EVUIMM_2, RA } }, | 3439 | {"evldd", VX (4, 769), VX_MASK, PPCSPE, 0, {RS, EVUIMM_8, RA}}, |
2326 | { "evlhhesplatx",VX(4, 776), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3440 | {"evldwx", VX (4, 770), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2327 | { "evlhhousplat",VX(4, 781), VX_MASK, PPCSPE, { RS, EVUIMM_2, RA } }, | 3441 | {"vminsb", VX (4, 770), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2328 | { "evlhhousplatx",VX(4, 780), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3442 | {"evldw", VX (4, 771), VX_MASK, PPCSPE, 0, {RS, EVUIMM_8, RA}}, |
2329 | { "evlhhossplat",VX(4, 783), VX_MASK, PPCSPE, { RS, EVUIMM_2, RA } }, | 3443 | {"evldhx", VX (4, 772), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2330 | { "evlhhossplatx",VX(4, 782), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3444 | {"vsrab", VX (4, 772), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2331 | 3445 | {"evldh", VX (4, 773), VX_MASK, PPCSPE, 0, {RS, EVUIMM_8, RA}}, | |
2332 | { "evstdd", VX(4, 801), VX_MASK, PPCSPE, { RS, EVUIMM_8, RA } }, | 3446 | {"vcmpgtsb", VXR(4, 774,0), VXR_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2333 | { "evstddx", VX(4, 800), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3447 | {"evlhhesplatx",VX (4, 776), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2334 | { "evstdw", VX(4, 803), VX_MASK, PPCSPE, { RS, EVUIMM_8, RA } }, | 3448 | {"vmulesb", VX (4, 776), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2335 | { "evstdwx", VX(4, 802), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3449 | {"evlhhesplat", VX (4, 777), VX_MASK, PPCSPE, 0, {RS, EVUIMM_2, RA}}, |
2336 | { "evstdh", VX(4, 805), VX_MASK, PPCSPE, { RS, EVUIMM_8, RA } }, | 3450 | {"vcfux", VX (4, 778), VX_MASK, PPCVEC, 0, {VD, VB, UIMM}}, |
2337 | { "evstdhx", VX(4, 804), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3451 | {"vcuxwfp", VX (4, 778), VX_MASK, PPCVEC, 0, {VD, VB, UIMM}}, |
2338 | { "evstwwe", VX(4, 825), VX_MASK, PPCSPE, { RS, EVUIMM_4, RA } }, | 3452 | {"evlhhousplatx",VX(4, 780), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2339 | { "evstwwex", VX(4, 824), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3453 | {"vspltisb", VX (4, 780), VXVB_MASK, PPCVEC, 0, {VD, SIMM}}, |
2340 | { "evstwwo", VX(4, 829), VX_MASK, PPCSPE, { RS, EVUIMM_4, RA } }, | 3454 | {"vinsertb", VX (4, 781), VXUIMM4_MASK, PPCVEC3, 0, {VD, VB, UIMM4}}, |
2341 | { "evstwwox", VX(4, 828), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3455 | {"evlhhousplat",VX (4, 781), VX_MASK, PPCSPE, 0, {RS, EVUIMM_2, RA}}, |
2342 | { "evstwhe", VX(4, 817), VX_MASK, PPCSPE, { RS, EVUIMM_4, RA } }, | 3456 | {"evlhhossplatx",VX(4, 782), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2343 | { "evstwhex", VX(4, 816), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3457 | {"vpkpx", VX (4, 782), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2344 | { "evstwho", VX(4, 821), VX_MASK, PPCSPE, { RS, EVUIMM_4, RA } }, | 3458 | {"evlhhossplat",VX (4, 783), VX_MASK, PPCSPE, 0, {RS, EVUIMM_2, RA}}, |
2345 | { "evstwhox", VX(4, 820), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3459 | {"mullhwu", XRC(4, 392,0), X_MASK, MULHW, 0, {RT, RA, RB}}, |
2346 | 3460 | {"evlwhex", VX (4, 784), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, | |
2347 | { "evfsabs", VX(4, 644), VX_MASK, PPCSPE, { RS, RA } }, | 3461 | {"mullhwu.", XRC(4, 392,1), X_MASK, MULHW, 0, {RT, RA, RB}}, |
2348 | { "evfsnabs", VX(4, 645), VX_MASK, PPCSPE, { RS, RA } }, | 3462 | {"evlwhe", VX (4, 785), VX_MASK, PPCSPE, 0, {RS, EVUIMM_4, RA}}, |
2349 | { "evfsneg", VX(4, 646), VX_MASK, PPCSPE, { RS, RA } }, | 3463 | {"evlwhoux", VX (4, 788), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2350 | { "evfsadd", VX(4, 640), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3464 | {"evlwhou", VX (4, 789), VX_MASK, PPCSPE, 0, {RS, EVUIMM_4, RA}}, |
2351 | { "evfssub", VX(4, 641), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3465 | {"evlwhosx", VX (4, 790), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2352 | { "evfsmul", VX(4, 648), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3466 | {"evlwhos", VX (4, 791), VX_MASK, PPCSPE, 0, {RS, EVUIMM_4, RA}}, |
2353 | { "evfsdiv", VX(4, 649), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3467 | {"maclhwu", XO (4, 396,0,0),XO_MASK, MULHW, 0, {RT, RA, RB}}, |
2354 | { "evfscmpgt", VX(4, 652), VX_MASK, PPCSPE, { CRFD, RA, RB } }, | 3468 | {"evlwwsplatx", VX (4, 792), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2355 | { "evfscmplt", VX(4, 653), VX_MASK, PPCSPE, { CRFD, RA, RB } }, | 3469 | {"maclhwu.", XO (4, 396,0,1),XO_MASK, MULHW, 0, {RT, RA, RB}}, |
2356 | { "evfscmpeq", VX(4, 654), VX_MASK, PPCSPE, { CRFD, RA, RB } }, | 3470 | {"evlwwsplat", VX (4, 793), VX_MASK, PPCSPE, 0, {RS, EVUIMM_4, RA}}, |
2357 | { "evfststgt", VX(4, 668), VX_MASK, PPCSPE, { CRFD, RA, RB } }, | 3471 | {"evlwhsplatx", VX (4, 796), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2358 | { "evfststlt", VX(4, 669), VX_MASK, PPCSPE, { CRFD, RA, RB } }, | 3472 | {"evlwhsplat", VX (4, 797), VX_MASK, PPCSPE, 0, {RS, EVUIMM_4, RA}}, |
2359 | { "evfststeq", VX(4, 670), VX_MASK, PPCSPE, { CRFD, RA, RB } }, | 3473 | {"evstddx", VX (4, 800), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2360 | { "evfscfui", VX(4, 656), VX_MASK, PPCSPE, { RS, RB } }, | 3474 | {"evstdd", VX (4, 801), VX_MASK, PPCSPE, 0, {RS, EVUIMM_8, RA}}, |
2361 | { "evfsctuiz", VX(4, 664), VX_MASK, PPCSPE, { RS, RB } }, | 3475 | {"evstdwx", VX (4, 802), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2362 | { "evfscfsi", VX(4, 657), VX_MASK, PPCSPE, { RS, RB } }, | 3476 | {"evstdw", VX (4, 803), VX_MASK, PPCSPE, 0, {RS, EVUIMM_8, RA}}, |
2363 | { "evfscfuf", VX(4, 658), VX_MASK, PPCSPE, { RS, RB } }, | 3477 | {"evstdhx", VX (4, 804), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2364 | { "evfscfsf", VX(4, 659), VX_MASK, PPCSPE, { RS, RB } }, | 3478 | {"evstdh", VX (4, 805), VX_MASK, PPCSPE, 0, {RS, EVUIMM_8, RA}}, |
2365 | { "evfsctui", VX(4, 660), VX_MASK, PPCSPE, { RS, RB } }, | 3479 | {"evstwhex", VX (4, 816), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2366 | { "evfsctsi", VX(4, 661), VX_MASK, PPCSPE, { RS, RB } }, | 3480 | {"evstwhe", VX (4, 817), VX_MASK, PPCSPE, 0, {RS, EVUIMM_4, RA}}, |
2367 | { "evfsctsiz", VX(4, 666), VX_MASK, PPCSPE, { RS, RB } }, | 3481 | {"evstwhox", VX (4, 820), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2368 | { "evfsctuf", VX(4, 662), VX_MASK, PPCSPE, { RS, RB } }, | 3482 | {"evstwho", VX (4, 821), VX_MASK, PPCSPE, 0, {RS, EVUIMM_4, RA}}, |
2369 | { "evfsctsf", VX(4, 663), VX_MASK, PPCSPE, { RS, RB } }, | 3483 | {"evstwwex", VX (4, 824), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2370 | 3484 | {"evstwwe", VX (4, 825), VX_MASK, PPCSPE, 0, {RS, EVUIMM_4, RA}}, | |
2371 | { "efsabs", VX(4, 708), VX_MASK, PPCEFS, { RS, RA } }, | 3485 | {"evstwwox", VX (4, 828), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2372 | { "efsnabs", VX(4, 709), VX_MASK, PPCEFS, { RS, RA } }, | 3486 | {"evstwwo", VX (4, 829), VX_MASK, PPCSPE, 0, {RS, EVUIMM_4, RA}}, |
2373 | { "efsneg", VX(4, 710), VX_MASK, PPCEFS, { RS, RA } }, | 3487 | {"vaddshs", VX (4, 832), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2374 | { "efsadd", VX(4, 704), VX_MASK, PPCEFS, { RS, RA, RB } }, | 3488 | {"bcdcpsgn.", VX (4, 833), VX_MASK, PPCVEC3, 0, {VD, VA, VB}}, |
2375 | { "efssub", VX(4, 705), VX_MASK, PPCEFS, { RS, RA, RB } }, | 3489 | {"vminsh", VX (4, 834), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2376 | { "efsmul", VX(4, 712), VX_MASK, PPCEFS, { RS, RA, RB } }, | 3490 | {"vsrah", VX (4, 836), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2377 | { "efsdiv", VX(4, 713), VX_MASK, PPCEFS, { RS, RA, RB } }, | 3491 | {"vcmpgtsh", VXR(4, 838,0), VXR_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2378 | { "efscmpgt", VX(4, 716), VX_MASK, PPCEFS, { CRFD, RA, RB } }, | 3492 | {"vmulesh", VX (4, 840), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2379 | { "efscmplt", VX(4, 717), VX_MASK, PPCEFS, { CRFD, RA, RB } }, | 3493 | {"vcfsx", VX (4, 842), VX_MASK, PPCVEC, 0, {VD, VB, UIMM}}, |
2380 | { "efscmpeq", VX(4, 718), VX_MASK, PPCEFS, { CRFD, RA, RB } }, | 3494 | {"vcsxwfp", VX (4, 842), VX_MASK, PPCVEC, 0, {VD, VB, UIMM}}, |
2381 | { "efststgt", VX(4, 732), VX_MASK, PPCEFS, { CRFD, RA, RB } }, | 3495 | {"vspltish", VX (4, 844), VXVB_MASK, PPCVEC, 0, {VD, SIMM}}, |
2382 | { "efststlt", VX(4, 733), VX_MASK, PPCEFS, { CRFD, RA, RB } }, | 3496 | {"vinserth", VX (4, 845), VXUIMM4_MASK, PPCVEC3, 0, {VD, VB, UIMM4}}, |
2383 | { "efststeq", VX(4, 734), VX_MASK, PPCEFS, { CRFD, RA, RB } }, | 3497 | {"vupkhpx", VX (4, 846), VXVA_MASK, PPCVEC, 0, {VD, VB}}, |
2384 | { "efscfui", VX(4, 720), VX_MASK, PPCEFS, { RS, RB } }, | 3498 | {"mullhw", XRC(4, 424,0), X_MASK, MULHW, 0, {RT, RA, RB}}, |
2385 | { "efsctuiz", VX(4, 728), VX_MASK, PPCEFS, { RS, RB } }, | 3499 | {"mullhw.", XRC(4, 424,1), X_MASK, MULHW, 0, {RT, RA, RB}}, |
2386 | { "efscfsi", VX(4, 721), VX_MASK, PPCEFS, { RS, RB } }, | 3500 | {"maclhw", XO (4, 428,0,0),XO_MASK, MULHW, 0, {RT, RA, RB}}, |
2387 | { "efscfuf", VX(4, 722), VX_MASK, PPCEFS, { RS, RB } }, | 3501 | {"maclhw.", XO (4, 428,0,1),XO_MASK, MULHW, 0, {RT, RA, RB}}, |
2388 | { "efscfsf", VX(4, 723), VX_MASK, PPCEFS, { RS, RB } }, | 3502 | {"nmaclhw", XO (4, 430,0,0),XO_MASK, MULHW, 0, {RT, RA, RB}}, |
2389 | { "efsctui", VX(4, 724), VX_MASK, PPCEFS, { RS, RB } }, | 3503 | {"nmaclhw.", XO (4, 430,0,1),XO_MASK, MULHW, 0, {RT, RA, RB}}, |
2390 | { "efsctsi", VX(4, 725), VX_MASK, PPCEFS, { RS, RB } }, | 3504 | {"vaddsws", VX (4, 896), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2391 | { "efsctsiz", VX(4, 730), VX_MASK, PPCEFS, { RS, RB } }, | 3505 | {"vminsw", VX (4, 898), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2392 | { "efsctuf", VX(4, 726), VX_MASK, PPCEFS, { RS, RB } }, | 3506 | {"vsraw", VX (4, 900), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2393 | { "efsctsf", VX(4, 727), VX_MASK, PPCEFS, { RS, RB } }, | 3507 | {"vcmpgtsw", VXR(4, 902,0), VXR_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2394 | 3508 | {"vmulesw", VX (4, 904), VX_MASK, PPCVEC2, 0, {VD, VA, VB}}, | |
2395 | { "evmhossf", VX(4, 1031), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3509 | {"vctuxs", VX (4, 906), VX_MASK, PPCVEC, 0, {VD, VB, UIMM}}, |
2396 | { "evmhossfa", VX(4, 1063), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3510 | {"vcfpuxws", VX (4, 906), VX_MASK, PPCVEC, 0, {VD, VB, UIMM}}, |
2397 | { "evmhosmf", VX(4, 1039), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3511 | {"vspltisw", VX (4, 908), VXVB_MASK, PPCVEC, 0, {VD, SIMM}}, |
2398 | { "evmhosmfa", VX(4, 1071), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3512 | {"vinsertw", VX (4, 909), VXUIMM4_MASK, PPCVEC3, 0, {VD, VB, UIMM4}}, |
2399 | { "evmhosmi", VX(4, 1037), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3513 | {"maclhwsu", XO (4, 460,0,0), XO_MASK, MULHW, 0, {RT, RA, RB}}, |
2400 | { "evmhosmia", VX(4, 1069), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3514 | {"maclhwsu.", XO (4, 460,0,1), XO_MASK, MULHW, 0, {RT, RA, RB}}, |
2401 | { "evmhoumi", VX(4, 1036), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3515 | {"vminsd", VX (4, 962), VX_MASK, PPCVEC2, 0, {VD, VA, VB}}, |
2402 | { "evmhoumia", VX(4, 1068), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3516 | {"vsrad", VX (4, 964), VX_MASK, PPCVEC2, 0, {VD, VA, VB}}, |
2403 | { "evmhessf", VX(4, 1027), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3517 | {"vcmpbfp", VXR(4, 966,0), VXR_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2404 | { "evmhessfa", VX(4, 1059), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3518 | {"vcmpgtsd", VXR(4, 967,0), VXR_MASK, PPCVEC2, 0, {VD, VA, VB}}, |
2405 | { "evmhesmf", VX(4, 1035), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3519 | {"vctsxs", VX (4, 970), VX_MASK, PPCVEC, 0, {VD, VB, UIMM}}, |
2406 | { "evmhesmfa", VX(4, 1067), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3520 | {"vcfpsxws", VX (4, 970), VX_MASK, PPCVEC, 0, {VD, VB, UIMM}}, |
2407 | { "evmhesmi", VX(4, 1033), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3521 | {"vinsertd", VX (4, 973), VXUIMM4_MASK, PPCVEC3, 0, {VD, VB, UIMM4}}, |
2408 | { "evmhesmia", VX(4, 1065), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3522 | {"vupklpx", VX (4, 974), VXVA_MASK, PPCVEC, 0, {VD, VB}}, |
2409 | { "evmheumi", VX(4, 1032), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3523 | {"maclhws", XO (4, 492,0,0), XO_MASK, MULHW, 0, {RT, RA, RB}}, |
2410 | { "evmheumia", VX(4, 1064), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3524 | {"maclhws.", XO (4, 492,0,1), XO_MASK, MULHW, 0, {RT, RA, RB}}, |
2411 | 3525 | {"nmaclhws", XO (4, 494,0,0), XO_MASK, MULHW, 0, {RT, RA, RB}}, | |
2412 | { "evmhossfaaw",VX(4, 1287), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3526 | {"nmaclhws.", XO (4, 494,0,1), XO_MASK, MULHW, 0, {RT, RA, RB}}, |
2413 | { "evmhossiaaw",VX(4, 1285), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3527 | {"vsububm", VX (4,1024), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2414 | { "evmhosmfaaw",VX(4, 1295), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3528 | {"bcdadd.", VX (4,1025), VXPS_MASK, PPCVEC2, 0, {VD, VA, VB, PS}}, |
2415 | { "evmhosmiaaw",VX(4, 1293), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3529 | {"vavgub", VX (4,1026), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2416 | { "evmhousiaaw",VX(4, 1284), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3530 | {"vabsdub", VX (4,1027), VX_MASK, PPCVEC2, 0, {VD, VA, VB}}, |
2417 | { "evmhoumiaaw",VX(4, 1292), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3531 | {"evmhessf", VX (4,1027), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2418 | { "evmhessfaaw",VX(4, 1283), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3532 | {"vand", VX (4,1028), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2419 | { "evmhessiaaw",VX(4, 1281), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3533 | {"vcmpequb.", VXR(4, 6,1), VXR_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2420 | { "evmhesmfaaw",VX(4, 1291), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3534 | {"vcmpneb.", VXR(4, 7,1), VXR_MASK, PPCVEC3, 0, {VD, VA, VB}}, |
2421 | { "evmhesmiaaw",VX(4, 1289), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3535 | {"udi0fcm.", APU(4, 515,0), APU_MASK, PPC405|PPC440, PPC476, {URT, URA, URB}}, |
2422 | { "evmheusiaaw",VX(4, 1280), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3536 | {"udi0fcm", APU(4, 515,1), APU_MASK, PPC405|PPC440, PPC476, {URT, URA, URB}}, |
2423 | { "evmheumiaaw",VX(4, 1288), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3537 | {"evmhossf", VX (4,1031), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2424 | 3538 | {"vpmsumb", VX (4,1032), VX_MASK, PPCVEC2, 0, {VD, VA, VB}}, | |
2425 | { "evmhossfanw",VX(4, 1415), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3539 | {"evmheumi", VX (4,1032), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2426 | { "evmhossianw",VX(4, 1413), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3540 | {"evmhesmi", VX (4,1033), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2427 | { "evmhosmfanw",VX(4, 1423), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3541 | {"vmaxfp", VX (4,1034), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2428 | { "evmhosmianw",VX(4, 1421), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3542 | {"evmhesmf", VX (4,1035), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2429 | { "evmhousianw",VX(4, 1412), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3543 | {"evmhoumi", VX (4,1036), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2430 | { "evmhoumianw",VX(4, 1420), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3544 | {"vslo", VX (4,1036), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2431 | { "evmhessfanw",VX(4, 1411), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3545 | {"evmhosmi", VX (4,1037), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2432 | { "evmhessianw",VX(4, 1409), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3546 | {"evmhosmf", VX (4,1039), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2433 | { "evmhesmfanw",VX(4, 1419), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3547 | {"machhwuo", XO (4, 12,1,0), XO_MASK, MULHW, 0, {RT, RA, RB}}, |
2434 | { "evmhesmianw",VX(4, 1417), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3548 | {"machhwuo.", XO (4, 12,1,1), XO_MASK, MULHW, 0, {RT, RA, RB}}, |
2435 | { "evmheusianw",VX(4, 1408), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3549 | {"ps_merge00", XOPS(4,528,0), XOPS_MASK, PPCPS, 0, {FRT, FRA, FRB}}, |
2436 | { "evmheumianw",VX(4, 1416), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3550 | {"ps_merge00.", XOPS(4,528,1), XOPS_MASK, PPCPS, 0, {FRT, FRA, FRB}}, |
2437 | 3551 | {"evmhessfa", VX (4,1059), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, | |
2438 | { "evmhogsmfaa",VX(4, 1327), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3552 | {"evmhossfa", VX (4,1063), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2439 | { "evmhogsmiaa",VX(4, 1325), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3553 | {"evmheumia", VX (4,1064), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2440 | { "evmhogumiaa",VX(4, 1324), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3554 | {"evmhesmia", VX (4,1065), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2441 | { "evmhegsmfaa",VX(4, 1323), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3555 | {"evmhesmfa", VX (4,1067), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2442 | { "evmhegsmiaa",VX(4, 1321), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3556 | {"evmhoumia", VX (4,1068), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2443 | { "evmhegumiaa",VX(4, 1320), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3557 | {"evmhosmia", VX (4,1069), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2444 | 3558 | {"evmhosmfa", VX (4,1071), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, | |
2445 | { "evmhogsmfan",VX(4, 1455), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3559 | {"vsubuhm", VX (4,1088), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2446 | { "evmhogsmian",VX(4, 1453), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3560 | {"bcdsub.", VX (4,1089), VXPS_MASK, PPCVEC2, 0, {VD, VA, VB, PS}}, |
2447 | { "evmhogumian",VX(4, 1452), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3561 | {"vavguh", VX (4,1090), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2448 | { "evmhegsmfan",VX(4, 1451), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3562 | {"vabsduh", VX (4,1091), VX_MASK, PPCVEC2, 0, {VD, VA, VB}}, |
2449 | { "evmhegsmian",VX(4, 1449), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3563 | {"vandc", VX (4,1092), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2450 | { "evmhegumian",VX(4, 1448), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3564 | {"vcmpequh.", VXR(4, 70,1), VXR_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2451 | 3565 | {"udi1fcm.", APU(4, 547,0), APU_MASK, PPC405|PPC440, PPC476, {URT, URA, URB}}, | |
2452 | { "evmwhssf", VX(4, 1095), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3566 | {"udi1fcm", APU(4, 547,1), APU_MASK, PPC405|PPC440, PPC476, {URT, URA, URB}}, |
2453 | { "evmwhssfa", VX(4, 1127), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3567 | {"vcmpneh.", VXR(4, 71,1), VXR_MASK, PPCVEC3, 0, {VD, VA, VB}}, |
2454 | { "evmwhsmf", VX(4, 1103), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3568 | {"evmwhssf", VX (4,1095), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2455 | { "evmwhsmfa", VX(4, 1135), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3569 | {"vpmsumh", VX (4,1096), VX_MASK, PPCVEC2, 0, {VD, VA, VB}}, |
2456 | { "evmwhsmi", VX(4, 1101), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3570 | {"evmwlumi", VX (4,1096), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2457 | { "evmwhsmia", VX(4, 1133), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3571 | {"vminfp", VX (4,1098), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2458 | { "evmwhumi", VX(4, 1100), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3572 | {"evmwhumi", VX (4,1100), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2459 | { "evmwhumia", VX(4, 1132), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3573 | {"vsro", VX (4,1100), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2460 | 3574 | {"evmwhsmi", VX (4,1101), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, | |
2461 | { "evmwlumi", VX(4, 1096), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3575 | {"vpkudum", VX (4,1102), VX_MASK, PPCVEC2, 0, {VD, VA, VB}}, |
2462 | { "evmwlumia", VX(4, 1128), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3576 | {"evmwhsmf", VX (4,1103), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2463 | 3577 | {"evmwssf", VX (4,1107), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, | |
2464 | { "evmwlssiaaw",VX(4, 1345), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3578 | {"machhwo", XO (4, 44,1,0), XO_MASK, MULHW, 0, {RT, RA, RB}}, |
2465 | { "evmwlsmiaaw",VX(4, 1353), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3579 | {"evmwumi", VX (4,1112), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2466 | { "evmwlusiaaw",VX(4, 1344), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3580 | {"machhwo.", XO (4, 44,1,1), XO_MASK, MULHW, 0, {RT, RA, RB}}, |
2467 | { "evmwlumiaaw",VX(4, 1352), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3581 | {"evmwsmi", VX (4,1113), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2468 | 3582 | {"evmwsmf", VX (4,1115), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, | |
2469 | { "evmwlssianw",VX(4, 1473), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3583 | {"nmachhwo", XO (4, 46,1,0), XO_MASK, MULHW, 0, {RT, RA, RB}}, |
2470 | { "evmwlsmianw",VX(4, 1481), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3584 | {"nmachhwo.", XO (4, 46,1,1), XO_MASK, MULHW, 0, {RT, RA, RB}}, |
2471 | { "evmwlusianw",VX(4, 1472), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3585 | {"ps_merge01", XOPS(4,560,0), XOPS_MASK, PPCPS, 0, {FRT, FRA, FRB}}, |
2472 | { "evmwlumianw",VX(4, 1480), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3586 | {"ps_merge01.", XOPS(4,560,1), XOPS_MASK, PPCPS, 0, {FRT, FRA, FRB}}, |
2473 | 3587 | {"evmwhssfa", VX (4,1127), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, | |
2474 | { "evmwssf", VX(4, 1107), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3588 | {"evmwlumia", VX (4,1128), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2475 | { "evmwssfa", VX(4, 1139), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3589 | {"evmwhumia", VX (4,1132), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2476 | { "evmwsmf", VX(4, 1115), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3590 | {"evmwhsmia", VX (4,1133), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2477 | { "evmwsmfa", VX(4, 1147), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3591 | {"evmwhsmfa", VX (4,1135), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2478 | { "evmwsmi", VX(4, 1113), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3592 | {"evmwssfa", VX (4,1139), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2479 | { "evmwsmia", VX(4, 1145), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3593 | {"evmwumia", VX (4,1144), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2480 | { "evmwumi", VX(4, 1112), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3594 | {"evmwsmia", VX (4,1145), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2481 | { "evmwumia", VX(4, 1144), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3595 | {"evmwsmfa", VX (4,1147), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2482 | 3596 | {"vsubuwm", VX (4,1152), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, | |
2483 | { "evmwssfaa", VX(4, 1363), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3597 | {"bcdus.", VX (4,1153), VX_MASK, PPCVEC3, 0, {VD, VA, VB}}, |
2484 | { "evmwsmfaa", VX(4, 1371), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3598 | {"vavguw", VX (4,1154), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2485 | { "evmwsmiaa", VX(4, 1369), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3599 | {"vabsduw", VX (4,1155), VX_MASK, PPCVEC2, 0, {VD, VA, VB}}, |
2486 | { "evmwumiaa", VX(4, 1368), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3600 | {"vmr", VX (4,1156), VX_MASK, PPCVEC, 0, {VD, VA, VBA}}, |
2487 | 3601 | {"vor", VX (4,1156), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, | |
2488 | { "evmwssfan", VX(4, 1491), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3602 | {"vcmpnew.", VXR(4, 135,1), VXR_MASK, PPCVEC3, 0, {VD, VA, VB}}, |
2489 | { "evmwsmfan", VX(4, 1499), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3603 | {"vpmsumw", VX (4,1160), VX_MASK, PPCVEC2, 0, {VD, VA, VB}}, |
2490 | { "evmwsmian", VX(4, 1497), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3604 | {"vcmpequw.", VXR(4, 134,1), VXR_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2491 | { "evmwumian", VX(4, 1496), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3605 | {"udi2fcm.", APU(4, 579,0), APU_MASK, PPC405|PPC440, PPC476, {URT, URA, URB}}, |
2492 | 3606 | {"udi2fcm", APU(4, 579,1), APU_MASK, PPC405|PPC440, PPC476, {URT, URA, URB}}, | |
2493 | { "evaddssiaaw",VX(4, 1217), VX_MASK, PPCSPE, { RS, RA } }, | 3607 | {"machhwsuo", XO (4, 76,1,0), XO_MASK, MULHW, 0, {RT, RA, RB}}, |
2494 | { "evaddsmiaaw",VX(4, 1225), VX_MASK, PPCSPE, { RS, RA } }, | 3608 | {"machhwsuo.", XO (4, 76,1,1), XO_MASK, MULHW, 0, {RT, RA, RB}}, |
2495 | { "evaddusiaaw",VX(4, 1216), VX_MASK, PPCSPE, { RS, RA } }, | 3609 | {"ps_merge10", XOPS(4,592,0), XOPS_MASK, PPCPS, 0, {FRT, FRA, FRB}}, |
2496 | { "evaddumiaaw",VX(4, 1224), VX_MASK, PPCSPE, { RS, RA } }, | 3610 | {"ps_merge10.", XOPS(4,592,1), XOPS_MASK, PPCPS, 0, {FRT, FRA, FRB}}, |
2497 | 3611 | {"vsubudm", VX (4,1216), VX_MASK, PPCVEC2, 0, {VD, VA, VB}}, | |
2498 | { "evsubfssiaaw",VX(4, 1219), VX_MASK, PPCSPE, { RS, RA } }, | 3612 | {"evaddusiaaw", VX (4,1216), VX_MASK, PPCSPE, 0, {RS, RA}}, |
2499 | { "evsubfsmiaaw",VX(4, 1227), VX_MASK, PPCSPE, { RS, RA } }, | 3613 | {"bcds.", VX (4,1217), VXPS_MASK, PPCVEC3, 0, {VD, VA, VB, PS}}, |
2500 | { "evsubfusiaaw",VX(4, 1218), VX_MASK, PPCSPE, { RS, RA } }, | 3614 | {"evaddssiaaw", VX (4,1217), VX_MASK, PPCSPE, 0, {RS, RA}}, |
2501 | { "evsubfumiaaw",VX(4, 1226), VX_MASK, PPCSPE, { RS, RA } }, | 3615 | {"evsubfusiaaw",VX (4,1218), VX_MASK, PPCSPE, 0, {RS, RA}}, |
2502 | 3616 | {"evsubfssiaaw",VX (4,1219), VX_MASK, PPCSPE, 0, {RS, RA}}, | |
2503 | { "evmra", VX(4, 1220), VX_MASK, PPCSPE, { RS, RA } }, | 3617 | {"evmra", VX (4,1220), VX_MASK, PPCSPE, 0, {RS, RA}}, |
2504 | 3618 | {"vxor", VX (4,1220), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, | |
2505 | { "evdivws", VX(4, 1222), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3619 | {"evdivws", VX (4,1222), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2506 | { "evdivwu", VX(4, 1223), VX_MASK, PPCSPE, { RS, RA, RB } }, | 3620 | {"vcmpeqfp.", VXR(4, 198,1), VXR_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2507 | 3621 | {"udi3fcm.", APU(4, 611,0), APU_MASK, PPC405|PPC440, PPC476, {URT, URA, URB}}, | |
2508 | { "mulli", OP(7), OP_MASK, PPCCOM, { RT, RA, SI } }, | 3622 | {"vcmpequd.", VXR(4, 199,1), VXR_MASK, PPCVEC2, 0, {VD, VA, VB}}, |
2509 | { "muli", OP(7), OP_MASK, PWRCOM, { RT, RA, SI } }, | 3623 | {"udi3fcm", APU(4, 611,1), APU_MASK, PPC405|PPC440, PPC476, {URT, URA, URB}}, |
2510 | 3624 | {"evdivwu", VX (4,1223), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, | |
2511 | { "subfic", OP(8), OP_MASK, PPCCOM, { RT, RA, SI } }, | 3625 | {"vpmsumd", VX (4,1224), VX_MASK, PPCVEC2, 0, {VD, VA, VB}}, |
2512 | { "sfi", OP(8), OP_MASK, PWRCOM, { RT, RA, SI } }, | 3626 | {"evaddumiaaw", VX (4,1224), VX_MASK, PPCSPE, 0, {RS, RA}}, |
2513 | 3627 | {"evaddsmiaaw", VX (4,1225), VX_MASK, PPCSPE, 0, {RS, RA}}, | |
2514 | { "dozi", OP(9), OP_MASK, M601, { RT, RA, SI } }, | 3628 | {"evsubfumiaaw",VX (4,1226), VX_MASK, PPCSPE, 0, {RS, RA}}, |
2515 | 3629 | {"evsubfsmiaaw",VX (4,1227), VX_MASK, PPCSPE, 0, {RS, RA}}, | |
2516 | { "bce", B(9,0,0), B_MASK, BOOKE64, { BO, BI, BD } }, | 3630 | {"vpkudus", VX (4,1230), VX_MASK, PPCVEC2, 0, {VD, VA, VB}}, |
2517 | { "bcel", B(9,0,1), B_MASK, BOOKE64, { BO, BI, BD } }, | 3631 | {"machhwso", XO (4, 108,1,0), XO_MASK, MULHW, 0, {RT, RA, RB}}, |
2518 | { "bcea", B(9,1,0), B_MASK, BOOKE64, { BO, BI, BDA } }, | 3632 | {"machhwso.", XO (4, 108,1,1), XO_MASK, MULHW, 0, {RT, RA, RB}}, |
2519 | { "bcela", B(9,1,1), B_MASK, BOOKE64, { BO, BI, BDA } }, | 3633 | {"nmachhwso", XO (4, 110,1,0), XO_MASK, MULHW, 0, {RT, RA, RB}}, |
2520 | 3634 | {"nmachhwso.", XO (4, 110,1,1), XO_MASK, MULHW, 0, {RT, RA, RB}}, | |
2521 | { "cmplwi", OPL(10,0), OPL_MASK, PPCCOM, { OBF, RA, UI } }, | 3635 | {"ps_merge11", XOPS(4,624,0), XOPS_MASK, PPCPS, 0, {FRT, FRA, FRB}}, |
2522 | { "cmpldi", OPL(10,1), OPL_MASK, PPC64, { OBF, RA, UI } }, | 3636 | {"ps_merge11.", XOPS(4,624,1), XOPS_MASK, PPCPS, 0, {FRT, FRA, FRB}}, |
2523 | { "cmpli", OP(10), OP_MASK, PPC, { BF, L, RA, UI } }, | 3637 | {"vsubuqm", VX (4,1280), VX_MASK, PPCVEC2, 0, {VD, VA, VB}}, |
2524 | { "cmpli", OP(10), OP_MASK, PWRCOM, { BF, RA, UI } }, | 3638 | {"evmheusiaaw", VX (4,1280), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2525 | 3639 | {"bcdtrunc.", VX (4,1281), VXPS_MASK, PPCVEC3, 0, {VD, VA, VB, PS}}, | |
2526 | { "cmpwi", OPL(11,0), OPL_MASK, PPCCOM, { OBF, RA, SI } }, | 3640 | {"evmhessiaaw", VX (4,1281), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2527 | { "cmpdi", OPL(11,1), OPL_MASK, PPC64, { OBF, RA, SI } }, | 3641 | {"vavgsb", VX (4,1282), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2528 | { "cmpi", OP(11), OP_MASK, PPC, { BF, L, RA, SI } }, | 3642 | {"evmhessfaaw", VX (4,1283), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2529 | { "cmpi", OP(11), OP_MASK, PWRCOM, { BF, RA, SI } }, | 3643 | {"evmhousiaaw", VX (4,1284), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2530 | 3644 | {"vnot", VX (4,1284), VX_MASK, PPCVEC, 0, {VD, VA, VBA}}, | |
2531 | { "addic", OP(12), OP_MASK, PPCCOM, { RT, RA, SI } }, | 3645 | {"vnor", VX (4,1284), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2532 | { "ai", OP(12), OP_MASK, PWRCOM, { RT, RA, SI } }, | 3646 | {"evmhossiaaw", VX (4,1285), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2533 | { "subic", OP(12), OP_MASK, PPCCOM, { RT, RA, NSI } }, | 3647 | {"udi4fcm.", APU(4, 643,0), APU_MASK, PPC405|PPC440, PPC476, {URT, URA, URB}}, |
2534 | 3648 | {"udi4fcm", APU(4, 643,1), APU_MASK, PPC405|PPC440, PPC476, {URT, URA, URB}}, | |
2535 | { "addic.", OP(13), OP_MASK, PPCCOM, { RT, RA, SI } }, | 3649 | {"vcmpnezb.", VXR(4, 263,1), VXR_MASK, PPCVEC3, 0, {VD, VA, VB}}, |
2536 | { "ai.", OP(13), OP_MASK, PWRCOM, { RT, RA, SI } }, | 3650 | {"evmhossfaaw", VX (4,1287), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2537 | { "subic.", OP(13), OP_MASK, PPCCOM, { RT, RA, NSI } }, | 3651 | {"evmheumiaaw", VX (4,1288), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2538 | 3652 | {"vcipher", VX (4,1288), VX_MASK, PPCVEC2, 0, {VD, VA, VB}}, | |
2539 | { "li", OP(14), DRA_MASK, PPCCOM, { RT, SI } }, | 3653 | {"vcipherlast", VX (4,1289), VX_MASK, PPCVEC2, 0, {VD, VA, VB}}, |
2540 | { "lil", OP(14), DRA_MASK, PWRCOM, { RT, SI } }, | 3654 | {"evmhesmiaaw", VX (4,1289), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2541 | { "addi", OP(14), OP_MASK, PPCCOM, { RT, RA0, SI } }, | 3655 | {"evmhesmfaaw", VX (4,1291), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2542 | { "cal", OP(14), OP_MASK, PWRCOM, { RT, D, RA0 } }, | 3656 | {"vgbbd", VX (4,1292), VXVA_MASK, PPCVEC2, 0, {VD, VB}}, |
2543 | { "subi", OP(14), OP_MASK, PPCCOM, { RT, RA0, NSI } }, | 3657 | {"evmhoumiaaw", VX (4,1292), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2544 | { "la", OP(14), OP_MASK, PPCCOM, { RT, D, RA0 } }, | 3658 | {"evmhosmiaaw", VX (4,1293), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2545 | 3659 | {"evmhosmfaaw", VX (4,1295), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, | |
2546 | { "lis", OP(15), DRA_MASK, PPCCOM, { RT, SISIGNOPT } }, | 3660 | {"macchwuo", XO (4, 140,1,0), XO_MASK, MULHW, 0, {RT, RA, RB}}, |
2547 | { "liu", OP(15), DRA_MASK, PWRCOM, { RT, SISIGNOPT } }, | 3661 | {"macchwuo.", XO (4, 140,1,1), XO_MASK, MULHW, 0, {RT, RA, RB}}, |
2548 | { "addis", OP(15), OP_MASK, PPCCOM, { RT,RA0,SISIGNOPT } }, | 3662 | {"evmhegumiaa", VX (4,1320), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2549 | { "cau", OP(15), OP_MASK, PWRCOM, { RT,RA0,SISIGNOPT } }, | 3663 | {"evmhegsmiaa", VX (4,1321), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2550 | { "subis", OP(15), OP_MASK, PPCCOM, { RT, RA0, NSI } }, | 3664 | {"evmhegsmfaa", VX (4,1323), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2551 | 3665 | {"evmhogumiaa", VX (4,1324), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, | |
2552 | { "bdnz-", BBO(16,BODNZ,0,0), BBOATBI_MASK, PPCCOM, { BDM } }, | 3666 | {"evmhogsmiaa", VX (4,1325), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2553 | { "bdnz+", BBO(16,BODNZ,0,0), BBOATBI_MASK, PPCCOM, { BDP } }, | 3667 | {"evmhogsmfaa", VX (4,1327), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2554 | { "bdnz", BBO(16,BODNZ,0,0), BBOATBI_MASK, PPCCOM, { BD } }, | 3668 | {"vsubcuq", VX (4,1344), VX_MASK, PPCVEC2, 0, {VD, VA, VB}}, |
2555 | { "bdn", BBO(16,BODNZ,0,0), BBOATBI_MASK, PWRCOM, { BD } }, | 3669 | {"evmwlusiaaw", VX (4,1344), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2556 | { "bdnzl-", BBO(16,BODNZ,0,1), BBOATBI_MASK, PPCCOM, { BDM } }, | 3670 | {"bcdutrunc.", VX (4,1345), VX_MASK, PPCVEC3, 0, {VD, VA, VB}}, |
2557 | { "bdnzl+", BBO(16,BODNZ,0,1), BBOATBI_MASK, PPCCOM, { BDP } }, | 3671 | {"evmwlssiaaw", VX (4,1345), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2558 | { "bdnzl", BBO(16,BODNZ,0,1), BBOATBI_MASK, PPCCOM, { BD } }, | 3672 | {"vavgsh", VX (4,1346), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2559 | { "bdnl", BBO(16,BODNZ,0,1), BBOATBI_MASK, PWRCOM, { BD } }, | 3673 | {"vorc", VX (4,1348), VX_MASK, PPCVEC2, 0, {VD, VA, VB}}, |
2560 | { "bdnza-", BBO(16,BODNZ,1,0), BBOATBI_MASK, PPCCOM, { BDMA } }, | 3674 | {"udi5fcm.", APU(4, 675,0), APU_MASK, PPC405|PPC440, PPC476, {URT, URA, URB}}, |
2561 | { "bdnza+", BBO(16,BODNZ,1,0), BBOATBI_MASK, PPCCOM, { BDPA } }, | 3675 | {"udi5fcm", APU(4, 675,1), APU_MASK, PPC405|PPC440, PPC476, {URT, URA, URB}}, |
2562 | { "bdnza", BBO(16,BODNZ,1,0), BBOATBI_MASK, PPCCOM, { BDA } }, | 3676 | {"vcmpnezh.", VXR(4, 327,1), VXR_MASK, PPCVEC3, 0, {VD, VA, VB}}, |
2563 | { "bdna", BBO(16,BODNZ,1,0), BBOATBI_MASK, PWRCOM, { BDA } }, | 3677 | {"vncipher", VX (4,1352), VX_MASK, PPCVEC2, 0, {VD, VA, VB}}, |
2564 | { "bdnzla-", BBO(16,BODNZ,1,1), BBOATBI_MASK, PPCCOM, { BDMA } }, | 3678 | {"evmwlumiaaw", VX (4,1352), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2565 | { "bdnzla+", BBO(16,BODNZ,1,1), BBOATBI_MASK, PPCCOM, { BDPA } }, | 3679 | {"vncipherlast",VX (4,1353), VX_MASK, PPCVEC2, 0, {VD, VA, VB}}, |
2566 | { "bdnzla", BBO(16,BODNZ,1,1), BBOATBI_MASK, PPCCOM, { BDA } }, | 3680 | {"evmwlsmiaaw", VX (4,1353), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2567 | { "bdnla", BBO(16,BODNZ,1,1), BBOATBI_MASK, PWRCOM, { BDA } }, | 3681 | {"vbpermq", VX (4,1356), VX_MASK, PPCVEC2, 0, {VD, VA, VB}}, |
2568 | { "bdz-", BBO(16,BODZ,0,0), BBOATBI_MASK, PPCCOM, { BDM } }, | 3682 | {"vpksdus", VX (4,1358), VX_MASK, PPCVEC2, 0, {VD, VA, VB}}, |
2569 | { "bdz+", BBO(16,BODZ,0,0), BBOATBI_MASK, PPCCOM, { BDP } }, | 3683 | {"evmwssfaa", VX (4,1363), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2570 | { "bdz", BBO(16,BODZ,0,0), BBOATBI_MASK, COM, { BD } }, | 3684 | {"macchwo", XO (4, 172,1,0), XO_MASK, MULHW, 0, {RT, RA, RB}}, |
2571 | { "bdzl-", BBO(16,BODZ,0,1), BBOATBI_MASK, PPCCOM, { BDM } }, | 3685 | {"evmwumiaa", VX (4,1368), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2572 | { "bdzl+", BBO(16,BODZ,0,1), BBOATBI_MASK, PPCCOM, { BDP } }, | 3686 | {"macchwo.", XO (4, 172,1,1), XO_MASK, MULHW, 0, {RT, RA, RB}}, |
2573 | { "bdzl", BBO(16,BODZ,0,1), BBOATBI_MASK, COM, { BD } }, | 3687 | {"evmwsmiaa", VX (4,1369), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2574 | { "bdza-", BBO(16,BODZ,1,0), BBOATBI_MASK, PPCCOM, { BDMA } }, | 3688 | {"evmwsmfaa", VX (4,1371), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2575 | { "bdza+", BBO(16,BODZ,1,0), BBOATBI_MASK, PPCCOM, { BDPA } }, | 3689 | {"nmacchwo", XO (4, 174,1,0), XO_MASK, MULHW, 0, {RT, RA, RB}}, |
2576 | { "bdza", BBO(16,BODZ,1,0), BBOATBI_MASK, COM, { BDA } }, | 3690 | {"nmacchwo.", XO (4, 174,1,1), XO_MASK, MULHW, 0, {RT, RA, RB}}, |
2577 | { "bdzla-", BBO(16,BODZ,1,1), BBOATBI_MASK, PPCCOM, { BDMA } }, | 3691 | {"evmheusianw", VX (4,1408), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2578 | { "bdzla+", BBO(16,BODZ,1,1), BBOATBI_MASK, PPCCOM, { BDPA } }, | 3692 | {"vsubcuw", VX (4,1408), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2579 | { "bdzla", BBO(16,BODZ,1,1), BBOATBI_MASK, COM, { BDA } }, | 3693 | {"evmhessianw", VX (4,1409), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2580 | { "blt-", BBOCB(16,BOT,CBLT,0,0), BBOATCB_MASK, PPCCOM, { CR, BDM } }, | 3694 | {"bcdctsq.", VXVA(4,1409,0), VXVA_MASK, PPCVEC3, 0, {VD, VB}}, |
2581 | { "blt+", BBOCB(16,BOT,CBLT,0,0), BBOATCB_MASK, PPCCOM, { CR, BDP } }, | 3695 | {"bcdcfsq.", VXVA(4,1409,2), VXVAPS_MASK, PPCVEC3, 0, {VD, VB, PS}}, |
2582 | { "blt", BBOCB(16,BOT,CBLT,0,0), BBOATCB_MASK, COM, { CR, BD } }, | 3696 | {"bcdctz.", VXVA(4,1409,4), VXVAPS_MASK, PPCVEC3, 0, {VD, VB, PS}}, |
2583 | { "bltl-", BBOCB(16,BOT,CBLT,0,1), BBOATCB_MASK, PPCCOM, { CR, BDM } }, | 3697 | {"bcdctn.", VXVA(4,1409,5), VXVA_MASK, PPCVEC3, 0, {VD, VB}}, |
2584 | { "bltl+", BBOCB(16,BOT,CBLT,0,1), BBOATCB_MASK, PPCCOM, { CR, BDP } }, | 3698 | {"bcdcfz.", VXVA(4,1409,6), VXVAPS_MASK, PPCVEC3, 0, {VD, VB, PS}}, |
2585 | { "bltl", BBOCB(16,BOT,CBLT,0,1), BBOATCB_MASK, COM, { CR, BD } }, | 3699 | {"bcdcfn.", VXVA(4,1409,7), VXVAPS_MASK, PPCVEC3, 0, {VD, VB, PS}}, |
2586 | { "blta-", BBOCB(16,BOT,CBLT,1,0), BBOATCB_MASK, PPCCOM, { CR, BDMA } }, | 3700 | {"bcdsetsgn.", VXVA(4,1409,31), VXVAPS_MASK, PPCVEC3, 0, {VD, VB, PS}}, |
2587 | { "blta+", BBOCB(16,BOT,CBLT,1,0), BBOATCB_MASK, PPCCOM, { CR, BDPA } }, | 3701 | {"vavgsw", VX (4,1410), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2588 | { "blta", BBOCB(16,BOT,CBLT,1,0), BBOATCB_MASK, COM, { CR, BDA } }, | 3702 | {"evmhessfanw", VX (4,1411), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2589 | { "bltla-", BBOCB(16,BOT,CBLT,1,1), BBOATCB_MASK, PPCCOM, { CR, BDMA } }, | 3703 | {"vnand", VX (4,1412), VX_MASK, PPCVEC2, 0, {VD, VA, VB}}, |
2590 | { "bltla+", BBOCB(16,BOT,CBLT,1,1), BBOATCB_MASK, PPCCOM, { CR, BDPA } }, | 3704 | {"evmhousianw", VX (4,1412), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2591 | { "bltla", BBOCB(16,BOT,CBLT,1,1), BBOATCB_MASK, COM, { CR, BDA } }, | 3705 | {"evmhossianw", VX (4,1413), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2592 | { "bgt-", BBOCB(16,BOT,CBGT,0,0), BBOATCB_MASK, PPCCOM, { CR, BDM } }, | 3706 | {"udi6fcm.", APU(4, 707,0), APU_MASK, PPC405|PPC440, PPC476, {URT, URA, URB}}, |
2593 | { "bgt+", BBOCB(16,BOT,CBGT,0,0), BBOATCB_MASK, PPCCOM, { CR, BDP } }, | 3707 | {"udi6fcm", APU(4, 707,1), APU_MASK, PPC405|PPC440, PPC476, {URT, URA, URB}}, |
2594 | { "bgt", BBOCB(16,BOT,CBGT,0,0), BBOATCB_MASK, COM, { CR, BD } }, | 3708 | {"vcmpnezw.", VXR(4, 391,1), VXR_MASK, PPCVEC3, 0, {VD, VA, VB}}, |
2595 | { "bgtl-", BBOCB(16,BOT,CBGT,0,1), BBOATCB_MASK, PPCCOM, { CR, BDM } }, | 3709 | {"evmhossfanw", VX (4,1415), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2596 | { "bgtl+", BBOCB(16,BOT,CBGT,0,1), BBOATCB_MASK, PPCCOM, { CR, BDP } }, | 3710 | {"evmheumianw", VX (4,1416), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2597 | { "bgtl", BBOCB(16,BOT,CBGT,0,1), BBOATCB_MASK, COM, { CR, BD } }, | 3711 | {"evmhesmianw", VX (4,1417), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2598 | { "bgta-", BBOCB(16,BOT,CBGT,1,0), BBOATCB_MASK, PPCCOM, { CR, BDMA } }, | 3712 | {"evmhesmfanw", VX (4,1419), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2599 | { "bgta+", BBOCB(16,BOT,CBGT,1,0), BBOATCB_MASK, PPCCOM, { CR, BDPA } }, | 3713 | {"evmhoumianw", VX (4,1420), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2600 | { "bgta", BBOCB(16,BOT,CBGT,1,0), BBOATCB_MASK, COM, { CR, BDA } }, | 3714 | {"evmhosmianw", VX (4,1421), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2601 | { "bgtla-", BBOCB(16,BOT,CBGT,1,1), BBOATCB_MASK, PPCCOM, { CR, BDMA } }, | 3715 | {"evmhosmfanw", VX (4,1423), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2602 | { "bgtla+", BBOCB(16,BOT,CBGT,1,1), BBOATCB_MASK, PPCCOM, { CR, BDPA } }, | 3716 | {"macchwsuo", XO (4, 204,1,0), XO_MASK, MULHW, 0, {RT, RA, RB}}, |
2603 | { "bgtla", BBOCB(16,BOT,CBGT,1,1), BBOATCB_MASK, COM, { CR, BDA } }, | 3717 | {"macchwsuo.", XO (4, 204,1,1), XO_MASK, MULHW, 0, {RT, RA, RB}}, |
2604 | { "beq-", BBOCB(16,BOT,CBEQ,0,0), BBOATCB_MASK, PPCCOM, { CR, BDM } }, | 3718 | {"evmhegumian", VX (4,1448), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2605 | { "beq+", BBOCB(16,BOT,CBEQ,0,0), BBOATCB_MASK, PPCCOM, { CR, BDP } }, | 3719 | {"evmhegsmian", VX (4,1449), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2606 | { "beq", BBOCB(16,BOT,CBEQ,0,0), BBOATCB_MASK, COM, { CR, BD } }, | 3720 | {"evmhegsmfan", VX (4,1451), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2607 | { "beql-", BBOCB(16,BOT,CBEQ,0,1), BBOATCB_MASK, PPCCOM, { CR, BDM } }, | 3721 | {"evmhogumian", VX (4,1452), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2608 | { "beql+", BBOCB(16,BOT,CBEQ,0,1), BBOATCB_MASK, PPCCOM, { CR, BDP } }, | 3722 | {"evmhogsmian", VX (4,1453), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2609 | { "beql", BBOCB(16,BOT,CBEQ,0,1), BBOATCB_MASK, COM, { CR, BD } }, | 3723 | {"evmhogsmfan", VX (4,1455), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2610 | { "beqa-", BBOCB(16,BOT,CBEQ,1,0), BBOATCB_MASK, PPCCOM, { CR, BDMA } }, | 3724 | {"evmwlusianw", VX (4,1472), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2611 | { "beqa+", BBOCB(16,BOT,CBEQ,1,0), BBOATCB_MASK, PPCCOM, { CR, BDPA } }, | 3725 | {"bcdsr.", VX (4,1473), VXPS_MASK, PPCVEC3, 0, {VD, VA, VB, PS}}, |
2612 | { "beqa", BBOCB(16,BOT,CBEQ,1,0), BBOATCB_MASK, COM, { CR, BDA } }, | 3726 | {"evmwlssianw", VX (4,1473), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2613 | { "beqla-", BBOCB(16,BOT,CBEQ,1,1), BBOATCB_MASK, PPCCOM, { CR, BDMA } }, | 3727 | {"vsld", VX (4,1476), VX_MASK, PPCVEC2, 0, {VD, VA, VB}}, |
2614 | { "beqla+", BBOCB(16,BOT,CBEQ,1,1), BBOATCB_MASK, PPCCOM, { CR, BDPA } }, | 3728 | {"vcmpgefp.", VXR(4, 454,1), VXR_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2615 | { "beqla", BBOCB(16,BOT,CBEQ,1,1), BBOATCB_MASK, COM, { CR, BDA } }, | 3729 | {"udi7fcm.", APU(4, 739,0), APU_MASK, PPC405|PPC440, PPC476, {URT, URA, URB}}, |
2616 | { "bso-", BBOCB(16,BOT,CBSO,0,0), BBOATCB_MASK, PPCCOM, { CR, BDM } }, | 3730 | {"udi7fcm", APU(4, 739,1), APU_MASK, PPC405|PPC440, PPC476, {URT, URA, URB}}, |
2617 | { "bso+", BBOCB(16,BOT,CBSO,0,0), BBOATCB_MASK, PPCCOM, { CR, BDP } }, | 3731 | {"vsbox", VX (4,1480), VXVB_MASK, PPCVEC2, 0, {VD, VA}}, |
2618 | { "bso", BBOCB(16,BOT,CBSO,0,0), BBOATCB_MASK, COM, { CR, BD } }, | 3732 | {"evmwlumianw", VX (4,1480), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2619 | { "bsol-", BBOCB(16,BOT,CBSO,0,1), BBOATCB_MASK, PPCCOM, { CR, BDM } }, | 3733 | {"evmwlsmianw", VX (4,1481), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2620 | { "bsol+", BBOCB(16,BOT,CBSO,0,1), BBOATCB_MASK, PPCCOM, { CR, BDP } }, | 3734 | {"vbpermd", VX (4,1484), VX_MASK, PPCVEC3, 0, {VD, VA, VB}}, |
2621 | { "bsol", BBOCB(16,BOT,CBSO,0,1), BBOATCB_MASK, COM, { CR, BD } }, | 3735 | {"vpksdss", VX (4,1486), VX_MASK, PPCVEC2, 0, {VD, VA, VB}}, |
2622 | { "bsoa-", BBOCB(16,BOT,CBSO,1,0), BBOATCB_MASK, PPCCOM, { CR, BDMA } }, | 3736 | {"evmwssfan", VX (4,1491), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2623 | { "bsoa+", BBOCB(16,BOT,CBSO,1,0), BBOATCB_MASK, PPCCOM, { CR, BDPA } }, | 3737 | {"macchwso", XO (4, 236,1,0), XO_MASK, MULHW, 0, {RT, RA, RB}}, |
2624 | { "bsoa", BBOCB(16,BOT,CBSO,1,0), BBOATCB_MASK, COM, { CR, BDA } }, | 3738 | {"evmwumian", VX (4,1496), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2625 | { "bsola-", BBOCB(16,BOT,CBSO,1,1), BBOATCB_MASK, PPCCOM, { CR, BDMA } }, | 3739 | {"macchwso.", XO (4, 236,1,1), XO_MASK, MULHW, 0, {RT, RA, RB}}, |
2626 | { "bsola+", BBOCB(16,BOT,CBSO,1,1), BBOATCB_MASK, PPCCOM, { CR, BDPA } }, | 3740 | {"evmwsmian", VX (4,1497), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2627 | { "bsola", BBOCB(16,BOT,CBSO,1,1), BBOATCB_MASK, COM, { CR, BDA } }, | 3741 | {"evmwsmfan", VX (4,1499), VX_MASK, PPCSPE, 0, {RS, RA, RB}}, |
2628 | { "bun-", BBOCB(16,BOT,CBSO,0,0), BBOATCB_MASK, PPCCOM, { CR, BDM } }, | 3742 | {"nmacchwso", XO (4, 238,1,0), XO_MASK, MULHW, 0, {RT, RA, RB}}, |
2629 | { "bun+", BBOCB(16,BOT,CBSO,0,0), BBOATCB_MASK, PPCCOM, { CR, BDP } }, | 3743 | {"nmacchwso.", XO (4, 238,1,1), XO_MASK, MULHW, 0, {RT, RA, RB}}, |
2630 | { "bun", BBOCB(16,BOT,CBSO,0,0), BBOATCB_MASK, PPCCOM, { CR, BD } }, | 3744 | {"vsububs", VX (4,1536), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2631 | { "bunl-", BBOCB(16,BOT,CBSO,0,1), BBOATCB_MASK, PPCCOM, { CR, BDM } }, | 3745 | {"vclzlsbb", VXVA(4,1538,0), VXVA_MASK, PPCVEC3, 0, {RT, VB}}, |
2632 | { "bunl+", BBOCB(16,BOT,CBSO,0,1), BBOATCB_MASK, PPCCOM, { CR, BDP } }, | 3746 | {"vctzlsbb", VXVA(4,1538,1), VXVA_MASK, PPCVEC3, 0, {RT, VB}}, |
2633 | { "bunl", BBOCB(16,BOT,CBSO,0,1), BBOATCB_MASK, PPCCOM, { CR, BD } }, | 3747 | {"vnegw", VXVA(4,1538,6), VXVA_MASK, PPCVEC3, 0, {VD, VB}}, |
2634 | { "buna-", BBOCB(16,BOT,CBSO,1,0), BBOATCB_MASK, PPCCOM, { CR, BDMA } }, | 3748 | {"vnegd", VXVA(4,1538,7), VXVA_MASK, PPCVEC3, 0, {VD, VB}}, |
2635 | { "buna+", BBOCB(16,BOT,CBSO,1,0), BBOATCB_MASK, PPCCOM, { CR, BDPA } }, | 3749 | {"vprtybw", VXVA(4,1538,8), VXVA_MASK, PPCVEC3, 0, {VD, VB}}, |
2636 | { "buna", BBOCB(16,BOT,CBSO,1,0), BBOATCB_MASK, PPCCOM, { CR, BDA } }, | 3750 | {"vprtybd", VXVA(4,1538,9), VXVA_MASK, PPCVEC3, 0, {VD, VB}}, |
2637 | { "bunla-", BBOCB(16,BOT,CBSO,1,1), BBOATCB_MASK, PPCCOM, { CR, BDMA } }, | 3751 | {"vprtybq", VXVA(4,1538,10), VXVA_MASK, PPCVEC3, 0, {VD, VB}}, |
2638 | { "bunla+", BBOCB(16,BOT,CBSO,1,1), BBOATCB_MASK, PPCCOM, { CR, BDPA } }, | 3752 | {"vextsb2w", VXVA(4,1538,16), VXVA_MASK, PPCVEC3, 0, {VD, VB}}, |
2639 | { "bunla", BBOCB(16,BOT,CBSO,1,1), BBOATCB_MASK, PPCCOM, { CR, BDA } }, | 3753 | {"vextsh2w", VXVA(4,1538,17), VXVA_MASK, PPCVEC3, 0, {VD, VB}}, |
2640 | { "bge-", BBOCB(16,BOF,CBLT,0,0), BBOATCB_MASK, PPCCOM, { CR, BDM } }, | 3754 | {"vextsb2d", VXVA(4,1538,24), VXVA_MASK, PPCVEC3, 0, {VD, VB}}, |
2641 | { "bge+", BBOCB(16,BOF,CBLT,0,0), BBOATCB_MASK, PPCCOM, { CR, BDP } }, | 3755 | {"vextsh2d", VXVA(4,1538,25), VXVA_MASK, PPCVEC3, 0, {VD, VB}}, |
2642 | { "bge", BBOCB(16,BOF,CBLT,0,0), BBOATCB_MASK, COM, { CR, BD } }, | 3756 | {"vextsw2d", VXVA(4,1538,26), VXVA_MASK, PPCVEC3, 0, {VD, VB}}, |
2643 | { "bgel-", BBOCB(16,BOF,CBLT,0,1), BBOATCB_MASK, PPCCOM, { CR, BDM } }, | 3757 | {"vctzb", VXVA(4,1538,28), VXVA_MASK, PPCVEC3, 0, {VD, VB}}, |
2644 | { "bgel+", BBOCB(16,BOF,CBLT,0,1), BBOATCB_MASK, PPCCOM, { CR, BDP } }, | 3758 | {"vctzh", VXVA(4,1538,29), VXVA_MASK, PPCVEC3, 0, {VD, VB}}, |
2645 | { "bgel", BBOCB(16,BOF,CBLT,0,1), BBOATCB_MASK, COM, { CR, BD } }, | 3759 | {"vctzw", VXVA(4,1538,30), VXVA_MASK, PPCVEC3, 0, {VD, VB}}, |
2646 | { "bgea-", BBOCB(16,BOF,CBLT,1,0), BBOATCB_MASK, PPCCOM, { CR, BDMA } }, | 3760 | {"vctzd", VXVA(4,1538,31), VXVA_MASK, PPCVEC3, 0, {VD, VB}}, |
2647 | { "bgea+", BBOCB(16,BOF,CBLT,1,0), BBOATCB_MASK, PPCCOM, { CR, BDPA } }, | 3761 | {"mfvscr", VX (4,1540), VXVAVB_MASK, PPCVEC, 0, {VD}}, |
2648 | { "bgea", BBOCB(16,BOF,CBLT,1,0), BBOATCB_MASK, COM, { CR, BDA } }, | 3762 | {"vcmpgtub.", VXR(4, 518,1), VXR_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2649 | { "bgela-", BBOCB(16,BOF,CBLT,1,1), BBOATCB_MASK, PPCCOM, { CR, BDMA } }, | 3763 | {"udi8fcm.", APU(4, 771,0), APU_MASK, PPC440, PPC476, {URT, URA, URB}}, |
2650 | { "bgela+", BBOCB(16,BOF,CBLT,1,1), BBOATCB_MASK, PPCCOM, { CR, BDPA } }, | 3764 | {"udi8fcm", APU(4, 771,1), APU_MASK, PPC440, PPC476, {URT, URA, URB}}, |
2651 | { "bgela", BBOCB(16,BOF,CBLT,1,1), BBOATCB_MASK, COM, { CR, BDA } }, | 3765 | {"vsum4ubs", VX (4,1544), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2652 | { "bnl-", BBOCB(16,BOF,CBLT,0,0), BBOATCB_MASK, PPCCOM, { CR, BDM } }, | 3766 | {"vextublx", VX (4,1549), VX_MASK, PPCVEC3, 0, {RT, RA, VB}}, |
2653 | { "bnl+", BBOCB(16,BOF,CBLT,0,0), BBOATCB_MASK, PPCCOM, { CR, BDP } }, | 3767 | {"vsubuhs", VX (4,1600), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2654 | { "bnl", BBOCB(16,BOF,CBLT,0,0), BBOATCB_MASK, COM, { CR, BD } }, | 3768 | {"mtvscr", VX (4,1604), VXVDVA_MASK, PPCVEC, 0, {VB}}, |
2655 | { "bnll-", BBOCB(16,BOF,CBLT,0,1), BBOATCB_MASK, PPCCOM, { CR, BDM } }, | 3769 | {"vcmpgtuh.", VXR(4, 582,1), VXR_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2656 | { "bnll+", BBOCB(16,BOF,CBLT,0,1), BBOATCB_MASK, PPCCOM, { CR, BDP } }, | 3770 | {"vsum4shs", VX (4,1608), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2657 | { "bnll", BBOCB(16,BOF,CBLT,0,1), BBOATCB_MASK, COM, { CR, BD } }, | 3771 | {"udi9fcm.", APU(4, 804,0), APU_MASK, PPC440, PPC476, {URT, URA, URB}}, |
2658 | { "bnla-", BBOCB(16,BOF,CBLT,1,0), BBOATCB_MASK, PPCCOM, { CR, BDMA } }, | 3772 | {"udi9fcm", APU(4, 804,1), APU_MASK, PPC440, PPC476, {URT, URA, URB}}, |
2659 | { "bnla+", BBOCB(16,BOF,CBLT,1,0), BBOATCB_MASK, PPCCOM, { CR, BDPA } }, | 3773 | {"vextuhlx", VX (4,1613), VX_MASK, PPCVEC3, 0, {RT, RA, VB}}, |
2660 | { "bnla", BBOCB(16,BOF,CBLT,1,0), BBOATCB_MASK, COM, { CR, BDA } }, | 3774 | {"vupkhsw", VX (4,1614), VXVA_MASK, PPCVEC2, 0, {VD, VB}}, |
2661 | { "bnlla-", BBOCB(16,BOF,CBLT,1,1), BBOATCB_MASK, PPCCOM, { CR, BDMA } }, | 3775 | {"vsubuws", VX (4,1664), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2662 | { "bnlla+", BBOCB(16,BOF,CBLT,1,1), BBOATCB_MASK, PPCCOM, { CR, BDPA } }, | 3776 | {"vshasigmaw", VX (4,1666), VX_MASK, PPCVEC2, 0, {VD, VA, ST, SIX}}, |
2663 | { "bnlla", BBOCB(16,BOF,CBLT,1,1), BBOATCB_MASK, COM, { CR, BDA } }, | 3777 | {"veqv", VX (4,1668), VX_MASK, PPCVEC2, 0, {VD, VA, VB}}, |
2664 | { "ble-", BBOCB(16,BOF,CBGT,0,0), BBOATCB_MASK, PPCCOM, { CR, BDM } }, | 3778 | {"vcmpgtuw.", VXR(4, 646,1), VXR_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2665 | { "ble+", BBOCB(16,BOF,CBGT,0,0), BBOATCB_MASK, PPCCOM, { CR, BDP } }, | 3779 | {"udi10fcm.", APU(4, 835,0), APU_MASK, PPC440, PPC476, {URT, URA, URB}}, |
2666 | { "ble", BBOCB(16,BOF,CBGT,0,0), BBOATCB_MASK, COM, { CR, BD } }, | 3780 | {"udi10fcm", APU(4, 835,1), APU_MASK, PPC440, PPC476, {URT, URA, URB}}, |
2667 | { "blel-", BBOCB(16,BOF,CBGT,0,1), BBOATCB_MASK, PPCCOM, { CR, BDM } }, | 3781 | {"vsum2sws", VX (4,1672), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2668 | { "blel+", BBOCB(16,BOF,CBGT,0,1), BBOATCB_MASK, PPCCOM, { CR, BDP } }, | 3782 | {"vmrgow", VX (4,1676), VX_MASK, PPCVEC2, 0, {VD, VA, VB}}, |
2669 | { "blel", BBOCB(16,BOF,CBGT,0,1), BBOATCB_MASK, COM, { CR, BD } }, | 3783 | {"vextuwlx", VX (4,1677), VX_MASK, PPCVEC3, 0, {RT, RA, VB}}, |
2670 | { "blea-", BBOCB(16,BOF,CBGT,1,0), BBOATCB_MASK, PPCCOM, { CR, BDMA } }, | 3784 | {"vshasigmad", VX (4,1730), VX_MASK, PPCVEC2, 0, {VD, VA, ST, SIX}}, |
2671 | { "blea+", BBOCB(16,BOF,CBGT,1,0), BBOATCB_MASK, PPCCOM, { CR, BDPA } }, | 3785 | {"vsrd", VX (4,1732), VX_MASK, PPCVEC2, 0, {VD, VA, VB}}, |
2672 | { "blea", BBOCB(16,BOF,CBGT,1,0), BBOATCB_MASK, COM, { CR, BDA } }, | 3786 | {"vcmpgtfp.", VXR(4, 710,1), VXR_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2673 | { "blela-", BBOCB(16,BOF,CBGT,1,1), BBOATCB_MASK, PPCCOM, { CR, BDMA } }, | 3787 | {"udi11fcm.", APU(4, 867,0), APU_MASK, PPC440, PPC476, {URT, URA, URB}}, |
2674 | { "blela+", BBOCB(16,BOF,CBGT,1,1), BBOATCB_MASK, PPCCOM, { CR, BDPA } }, | 3788 | {"vcmpgtud.", VXR(4, 711,1), VXR_MASK, PPCVEC2, 0, {VD, VA, VB}}, |
2675 | { "blela", BBOCB(16,BOF,CBGT,1,1), BBOATCB_MASK, COM, { CR, BDA } }, | 3789 | {"udi11fcm", APU(4, 867,1), APU_MASK, PPC440, PPC476, {URT, URA, URB}}, |
2676 | { "bng-", BBOCB(16,BOF,CBGT,0,0), BBOATCB_MASK, PPCCOM, { CR, BDM } }, | 3790 | {"vupklsw", VX (4,1742), VXVA_MASK, PPCVEC2, 0, {VD, VB}}, |
2677 | { "bng+", BBOCB(16,BOF,CBGT,0,0), BBOATCB_MASK, PPCCOM, { CR, BDP } }, | 3791 | {"vsubsbs", VX (4,1792), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2678 | { "bng", BBOCB(16,BOF,CBGT,0,0), BBOATCB_MASK, COM, { CR, BD } }, | 3792 | {"vclzb", VX (4,1794), VXVA_MASK, PPCVEC2, 0, {VD, VB}}, |
2679 | { "bngl-", BBOCB(16,BOF,CBGT,0,1), BBOATCB_MASK, PPCCOM, { CR, BDM } }, | 3793 | {"vpopcntb", VX (4,1795), VXVA_MASK, PPCVEC2, 0, {VD, VB}}, |
2680 | { "bngl+", BBOCB(16,BOF,CBGT,0,1), BBOATCB_MASK, PPCCOM, { CR, BDP } }, | 3794 | {"vsrv", VX (4,1796), VX_MASK, PPCVEC3, 0, {VD, VA, VB}}, |
2681 | { "bngl", BBOCB(16,BOF,CBGT,0,1), BBOATCB_MASK, COM, { CR, BD } }, | 3795 | {"vcmpgtsb.", VXR(4, 774,1), VXR_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2682 | { "bnga-", BBOCB(16,BOF,CBGT,1,0), BBOATCB_MASK, PPCCOM, { CR, BDMA } }, | 3796 | {"udi12fcm.", APU(4, 899,0), APU_MASK, PPC440, PPC476, {URT, URA, URB}}, |
2683 | { "bnga+", BBOCB(16,BOF,CBGT,1,0), BBOATCB_MASK, PPCCOM, { CR, BDPA } }, | 3797 | {"udi12fcm", APU(4, 899,1), APU_MASK, PPC440, PPC476, {URT, URA, URB}}, |
2684 | { "bnga", BBOCB(16,BOF,CBGT,1,0), BBOATCB_MASK, COM, { CR, BDA } }, | 3798 | {"vsum4sbs", VX (4,1800), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2685 | { "bngla-", BBOCB(16,BOF,CBGT,1,1), BBOATCB_MASK, PPCCOM, { CR, BDMA } }, | 3799 | {"vextubrx", VX (4,1805), VX_MASK, PPCVEC3, 0, {RT, RA, VB}}, |
2686 | { "bngla+", BBOCB(16,BOF,CBGT,1,1), BBOATCB_MASK, PPCCOM, { CR, BDPA } }, | 3800 | {"maclhwuo", XO (4, 396,1,0), XO_MASK, MULHW, 0, {RT, RA, RB}}, |
2687 | { "bngla", BBOCB(16,BOF,CBGT,1,1), BBOATCB_MASK, COM, { CR, BDA } }, | 3801 | {"maclhwuo.", XO (4, 396,1,1), XO_MASK, MULHW, 0, {RT, RA, RB}}, |
2688 | { "bne-", BBOCB(16,BOF,CBEQ,0,0), BBOATCB_MASK, PPCCOM, { CR, BDM } }, | 3802 | {"vsubshs", VX (4,1856), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2689 | { "bne+", BBOCB(16,BOF,CBEQ,0,0), BBOATCB_MASK, PPCCOM, { CR, BDP } }, | 3803 | {"vclzh", VX (4,1858), VXVA_MASK, PPCVEC2, 0, {VD, VB}}, |
2690 | { "bne", BBOCB(16,BOF,CBEQ,0,0), BBOATCB_MASK, COM, { CR, BD } }, | 3804 | {"vpopcnth", VX (4,1859), VXVA_MASK, PPCVEC2, 0, {VD, VB}}, |
2691 | { "bnel-", BBOCB(16,BOF,CBEQ,0,1), BBOATCB_MASK, PPCCOM, { CR, BDM } }, | 3805 | {"vslv", VX (4,1860), VX_MASK, PPCVEC3, 0, {VD, VA, VB}}, |
2692 | { "bnel+", BBOCB(16,BOF,CBEQ,0,1), BBOATCB_MASK, PPCCOM, { CR, BDP } }, | 3806 | {"vcmpgtsh.", VXR(4, 838,1), VXR_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2693 | { "bnel", BBOCB(16,BOF,CBEQ,0,1), BBOATCB_MASK, COM, { CR, BD } }, | 3807 | {"vextuhrx", VX (4,1869), VX_MASK, PPCVEC3, 0, {RT, RA, VB}}, |
2694 | { "bnea-", BBOCB(16,BOF,CBEQ,1,0), BBOATCB_MASK, PPCCOM, { CR, BDMA } }, | 3808 | {"udi13fcm.", APU(4, 931,0), APU_MASK, PPC440, PPC476, {URT, URA, URB}}, |
2695 | { "bnea+", BBOCB(16,BOF,CBEQ,1,0), BBOATCB_MASK, PPCCOM, { CR, BDPA } }, | 3809 | {"udi13fcm", APU(4, 931,1), APU_MASK, PPC440, PPC476, {URT, URA, URB}}, |
2696 | { "bnea", BBOCB(16,BOF,CBEQ,1,0), BBOATCB_MASK, COM, { CR, BDA } }, | 3810 | {"maclhwo", XO (4, 428,1,0), XO_MASK, MULHW, 0, {RT, RA, RB}}, |
2697 | { "bnela-", BBOCB(16,BOF,CBEQ,1,1), BBOATCB_MASK, PPCCOM, { CR, BDMA } }, | 3811 | {"maclhwo.", XO (4, 428,1,1), XO_MASK, MULHW, 0, {RT, RA, RB}}, |
2698 | { "bnela+", BBOCB(16,BOF,CBEQ,1,1), BBOATCB_MASK, PPCCOM, { CR, BDPA } }, | 3812 | {"nmaclhwo", XO (4, 430,1,0), XO_MASK, MULHW, 0, {RT, RA, RB}}, |
2699 | { "bnela", BBOCB(16,BOF,CBEQ,1,1), BBOATCB_MASK, COM, { CR, BDA } }, | 3813 | {"nmaclhwo.", XO (4, 430,1,1), XO_MASK, MULHW, 0, {RT, RA, RB}}, |
2700 | { "bns-", BBOCB(16,BOF,CBSO,0,0), BBOATCB_MASK, PPCCOM, { CR, BDM } }, | 3814 | {"vsubsws", VX (4,1920), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2701 | { "bns+", BBOCB(16,BOF,CBSO,0,0), BBOATCB_MASK, PPCCOM, { CR, BDP } }, | 3815 | {"vclzw", VX (4,1922), VXVA_MASK, PPCVEC2, 0, {VD, VB}}, |
2702 | { "bns", BBOCB(16,BOF,CBSO,0,0), BBOATCB_MASK, COM, { CR, BD } }, | 3816 | {"vpopcntw", VX (4,1923), VXVA_MASK, PPCVEC2, 0, {VD, VB}}, |
2703 | { "bnsl-", BBOCB(16,BOF,CBSO,0,1), BBOATCB_MASK, PPCCOM, { CR, BDM } }, | 3817 | {"vcmpgtsw.", VXR(4, 902,1), VXR_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2704 | { "bnsl+", BBOCB(16,BOF,CBSO,0,1), BBOATCB_MASK, PPCCOM, { CR, BDP } }, | 3818 | {"udi14fcm.", APU(4, 963,0), APU_MASK, PPC440, PPC476, {URT, URA, URB}}, |
2705 | { "bnsl", BBOCB(16,BOF,CBSO,0,1), BBOATCB_MASK, COM, { CR, BD } }, | 3819 | {"udi14fcm", APU(4, 963,1), APU_MASK, PPC440, PPC476, {URT, URA, URB}}, |
2706 | { "bnsa-", BBOCB(16,BOF,CBSO,1,0), BBOATCB_MASK, PPCCOM, { CR, BDMA } }, | 3820 | {"vsumsws", VX (4,1928), VX_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2707 | { "bnsa+", BBOCB(16,BOF,CBSO,1,0), BBOATCB_MASK, PPCCOM, { CR, BDPA } }, | 3821 | {"vmrgew", VX (4,1932), VX_MASK, PPCVEC2, 0, {VD, VA, VB}}, |
2708 | { "bnsa", BBOCB(16,BOF,CBSO,1,0), BBOATCB_MASK, COM, { CR, BDA } }, | 3822 | {"vextuwrx", VX (4,1933), VX_MASK, PPCVEC3, 0, {RT, RA, VB}}, |
2709 | { "bnsla-", BBOCB(16,BOF,CBSO,1,1), BBOATCB_MASK, PPCCOM, { CR, BDMA } }, | 3823 | {"maclhwsuo", XO (4, 460,1,0), XO_MASK, MULHW, 0, {RT, RA, RB}}, |
2710 | { "bnsla+", BBOCB(16,BOF,CBSO,1,1), BBOATCB_MASK, PPCCOM, { CR, BDPA } }, | 3824 | {"maclhwsuo.", XO (4, 460,1,1), XO_MASK, MULHW, 0, {RT, RA, RB}}, |
2711 | { "bnsla", BBOCB(16,BOF,CBSO,1,1), BBOATCB_MASK, COM, { CR, BDA } }, | 3825 | {"vclzd", VX (4,1986), VXVA_MASK, PPCVEC2, 0, {VD, VB}}, |
2712 | { "bnu-", BBOCB(16,BOF,CBSO,0,0), BBOATCB_MASK, PPCCOM, { CR, BDM } }, | 3826 | {"vpopcntd", VX (4,1987), VXVA_MASK, PPCVEC2, 0, {VD, VB}}, |
2713 | { "bnu+", BBOCB(16,BOF,CBSO,0,0), BBOATCB_MASK, PPCCOM, { CR, BDP } }, | 3827 | {"vcmpbfp.", VXR(4, 966,1), VXR_MASK, PPCVEC, 0, {VD, VA, VB}}, |
2714 | { "bnu", BBOCB(16,BOF,CBSO,0,0), BBOATCB_MASK, PPCCOM, { CR, BD } }, | 3828 | {"udi15fcm.", APU(4, 995,0), APU_MASK, PPC440, PPC476, {URT, URA, URB}}, |
2715 | { "bnul-", BBOCB(16,BOF,CBSO,0,1), BBOATCB_MASK, PPCCOM, { CR, BDM } }, | 3829 | {"vcmpgtsd.", VXR(4, 967,1), VXR_MASK, PPCVEC2, 0, {VD, VA, VB}}, |
2716 | { "bnul+", BBOCB(16,BOF,CBSO,0,1), BBOATCB_MASK, PPCCOM, { CR, BDP } }, | 3830 | {"udi15fcm", APU(4, 995,1), APU_MASK, PPC440, PPC476, {URT, URA, URB}}, |
2717 | { "bnul", BBOCB(16,BOF,CBSO,0,1), BBOATCB_MASK, PPCCOM, { CR, BD } }, | 3831 | {"maclhwso", XO (4, 492,1,0), XO_MASK, MULHW, 0, {RT, RA, RB}}, |
2718 | { "bnua-", BBOCB(16,BOF,CBSO,1,0), BBOATCB_MASK, PPCCOM, { CR, BDMA } }, | 3832 | {"maclhwso.", XO (4, 492,1,1), XO_MASK, MULHW, 0, {RT, RA, RB}}, |
2719 | { "bnua+", BBOCB(16,BOF,CBSO,1,0), BBOATCB_MASK, PPCCOM, { CR, BDPA } }, | 3833 | {"nmaclhwso", XO (4, 494,1,0), XO_MASK, MULHW, 0, {RT, RA, RB}}, |
2720 | { "bnua", BBOCB(16,BOF,CBSO,1,0), BBOATCB_MASK, PPCCOM, { CR, BDA } }, | 3834 | {"nmaclhwso.", XO (4, 494,1,1), XO_MASK, MULHW, 0, {RT, RA, RB}}, |
2721 | { "bnula-", BBOCB(16,BOF,CBSO,1,1), BBOATCB_MASK, PPCCOM, { CR, BDMA } }, | 3835 | {"dcbz_l", X (4,1014), XRT_MASK, PPCPS, 0, {RA, RB}}, |
2722 | { "bnula+", BBOCB(16,BOF,CBSO,1,1), BBOATCB_MASK, PPCCOM, { CR, BDPA } }, | 3836 | |
2723 | { "bnula", BBOCB(16,BOF,CBSO,1,1), BBOATCB_MASK, PPCCOM, { CR, BDA } }, | 3837 | {"mulli", OP(7), OP_MASK, PPCCOM, PPCVLE, {RT, RA, SI}}, |
2724 | { "bdnzt-", BBO(16,BODNZT,0,0), BBOY_MASK, NOPOWER4, { BI, BDM } }, | 3838 | {"muli", OP(7), OP_MASK, PWRCOM, PPCVLE, {RT, RA, SI}}, |
2725 | { "bdnzt+", BBO(16,BODNZT,0,0), BBOY_MASK, NOPOWER4, { BI, BDP } }, | 3839 | |
2726 | { "bdnzt", BBO(16,BODNZT,0,0), BBOY_MASK, PPCCOM, { BI, BD } }, | 3840 | {"subfic", OP(8), OP_MASK, PPCCOM, PPCVLE, {RT, RA, SI}}, |
2727 | { "bdnztl-", BBO(16,BODNZT,0,1), BBOY_MASK, NOPOWER4, { BI, BDM } }, | 3841 | {"sfi", OP(8), OP_MASK, PWRCOM, PPCVLE, {RT, RA, SI}}, |
2728 | { "bdnztl+", BBO(16,BODNZT,0,1), BBOY_MASK, NOPOWER4, { BI, BDP } }, | 3842 | |
2729 | { "bdnztl", BBO(16,BODNZT,0,1), BBOY_MASK, PPCCOM, { BI, BD } }, | 3843 | {"dozi", OP(9), OP_MASK, M601, PPCVLE, {RT, RA, SI}}, |
2730 | { "bdnzta-", BBO(16,BODNZT,1,0), BBOY_MASK, NOPOWER4, { BI, BDMA } }, | 3844 | |
2731 | { "bdnzta+", BBO(16,BODNZT,1,0), BBOY_MASK, NOPOWER4, { BI, BDPA } }, | 3845 | {"cmplwi", OPL(10,0), OPL_MASK, PPCCOM, PPCVLE, {OBF, RA, UISIGNOPT}}, |
2732 | { "bdnzta", BBO(16,BODNZT,1,0), BBOY_MASK, PPCCOM, { BI, BDA } }, | 3846 | {"cmpldi", OPL(10,1), OPL_MASK, PPC64, PPCVLE, {OBF, RA, UISIGNOPT}}, |
2733 | { "bdnztla-",BBO(16,BODNZT,1,1), BBOY_MASK, NOPOWER4, { BI, BDMA } }, | 3847 | {"cmpli", OP(10), OP_MASK, PPC, PPCVLE, {BF, L32OPT, RA, UISIGNOPT}}, |
2734 | { "bdnztla+",BBO(16,BODNZT,1,1), BBOY_MASK, NOPOWER4, { BI, BDPA } }, | 3848 | {"cmpli", OP(10), OP_MASK, PWRCOM, PPC|PPCVLE, {BF, RA, UISIGNOPT}}, |
2735 | { "bdnztla", BBO(16,BODNZT,1,1), BBOY_MASK, PPCCOM, { BI, BDA } }, | 3849 | |
2736 | { "bdnzf-", BBO(16,BODNZF,0,0), BBOY_MASK, NOPOWER4, { BI, BDM } }, | 3850 | {"cmpwi", OPL(11,0), OPL_MASK, PPCCOM, PPCVLE, {OBF, RA, SI}}, |
2737 | { "bdnzf+", BBO(16,BODNZF,0,0), BBOY_MASK, NOPOWER4, { BI, BDP } }, | 3851 | {"cmpdi", OPL(11,1), OPL_MASK, PPC64, PPCVLE, {OBF, RA, SI}}, |
2738 | { "bdnzf", BBO(16,BODNZF,0,0), BBOY_MASK, PPCCOM, { BI, BD } }, | 3852 | {"cmpi", OP(11), OP_MASK, PPC, PPCVLE, {BF, L32OPT, RA, SI}}, |
2739 | { "bdnzfl-", BBO(16,BODNZF,0,1), BBOY_MASK, NOPOWER4, { BI, BDM } }, | 3853 | {"cmpi", OP(11), OP_MASK, PWRCOM, PPC|PPCVLE, {BF, RA, SI}}, |
2740 | { "bdnzfl+", BBO(16,BODNZF,0,1), BBOY_MASK, NOPOWER4, { BI, BDP } }, | 3854 | |
2741 | { "bdnzfl", BBO(16,BODNZF,0,1), BBOY_MASK, PPCCOM, { BI, BD } }, | 3855 | {"addic", OP(12), OP_MASK, PPCCOM, PPCVLE, {RT, RA, SI}}, |
2742 | { "bdnzfa-", BBO(16,BODNZF,1,0), BBOY_MASK, NOPOWER4, { BI, BDMA } }, | 3856 | {"ai", OP(12), OP_MASK, PWRCOM, PPCVLE, {RT, RA, SI}}, |
2743 | { "bdnzfa+", BBO(16,BODNZF,1,0), BBOY_MASK, NOPOWER4, { BI, BDPA } }, | 3857 | {"subic", OP(12), OP_MASK, PPCCOM, PPCVLE, {RT, RA, NSI}}, |
2744 | { "bdnzfa", BBO(16,BODNZF,1,0), BBOY_MASK, PPCCOM, { BI, BDA } }, | 3858 | |
2745 | { "bdnzfla-",BBO(16,BODNZF,1,1), BBOY_MASK, NOPOWER4, { BI, BDMA } }, | 3859 | {"addic.", OP(13), OP_MASK, PPCCOM, PPCVLE, {RT, RA, SI}}, |
2746 | { "bdnzfla+",BBO(16,BODNZF,1,1), BBOY_MASK, NOPOWER4, { BI, BDPA } }, | 3860 | {"ai.", OP(13), OP_MASK, PWRCOM, PPCVLE, {RT, RA, SI}}, |
2747 | { "bdnzfla", BBO(16,BODNZF,1,1), BBOY_MASK, PPCCOM, { BI, BDA } }, | 3861 | {"subic.", OP(13), OP_MASK, PPCCOM, PPCVLE, {RT, RA, NSI}}, |
2748 | { "bt-", BBO(16,BOT,0,0), BBOAT_MASK, PPCCOM, { BI, BDM } }, | 3862 | |
2749 | { "bt+", BBO(16,BOT,0,0), BBOAT_MASK, PPCCOM, { BI, BDP } }, | 3863 | {"li", OP(14), DRA_MASK, PPCCOM, PPCVLE, {RT, SI}}, |
2750 | { "bt", BBO(16,BOT,0,0), BBOAT_MASK, PPCCOM, { BI, BD } }, | 3864 | {"lil", OP(14), DRA_MASK, PWRCOM, PPCVLE, {RT, SI}}, |
2751 | { "bbt", BBO(16,BOT,0,0), BBOAT_MASK, PWRCOM, { BI, BD } }, | 3865 | {"addi", OP(14), OP_MASK, PPCCOM, PPCVLE, {RT, RA0, SI}}, |
2752 | { "btl-", BBO(16,BOT,0,1), BBOAT_MASK, PPCCOM, { BI, BDM } }, | 3866 | {"cal", OP(14), OP_MASK, PWRCOM, PPCVLE, {RT, D, RA0}}, |
2753 | { "btl+", BBO(16,BOT,0,1), BBOAT_MASK, PPCCOM, { BI, BDP } }, | 3867 | {"subi", OP(14), OP_MASK, PPCCOM, PPCVLE, {RT, RA0, NSI}}, |
2754 | { "btl", BBO(16,BOT,0,1), BBOAT_MASK, PPCCOM, { BI, BD } }, | 3868 | {"la", OP(14), OP_MASK, PPCCOM, PPCVLE, {RT, D, RA0}}, |
2755 | { "bbtl", BBO(16,BOT,0,1), BBOAT_MASK, PWRCOM, { BI, BD } }, | 3869 | |
2756 | { "bta-", BBO(16,BOT,1,0), BBOAT_MASK, PPCCOM, { BI, BDMA } }, | 3870 | {"lis", OP(15), DRA_MASK, PPCCOM, PPCVLE, {RT, SISIGNOPT}}, |
2757 | { "bta+", BBO(16,BOT,1,0), BBOAT_MASK, PPCCOM, { BI, BDPA } }, | 3871 | {"liu", OP(15), DRA_MASK, PWRCOM, PPCVLE, {RT, SISIGNOPT}}, |
2758 | { "bta", BBO(16,BOT,1,0), BBOAT_MASK, PPCCOM, { BI, BDA } }, | 3872 | {"addis", OP(15), OP_MASK, PPCCOM, PPCVLE, {RT, RA0, SISIGNOPT}}, |
2759 | { "bbta", BBO(16,BOT,1,0), BBOAT_MASK, PWRCOM, { BI, BDA } }, | 3873 | {"cau", OP(15), OP_MASK, PWRCOM, PPCVLE, {RT, RA0, SISIGNOPT}}, |
2760 | { "btla-", BBO(16,BOT,1,1), BBOAT_MASK, PPCCOM, { BI, BDMA } }, | 3874 | {"subis", OP(15), OP_MASK, PPCCOM, PPCVLE, {RT, RA0, NSISIGNOPT}}, |
2761 | { "btla+", BBO(16,BOT,1,1), BBOAT_MASK, PPCCOM, { BI, BDPA } }, | 3875 | |
2762 | { "btla", BBO(16,BOT,1,1), BBOAT_MASK, PPCCOM, { BI, BDA } }, | 3876 | {"bdnz-", BBO(16,BODNZ,0,0), BBOATBI_MASK, PPCCOM, PPCVLE, {BDM}}, |
2763 | { "bbtla", BBO(16,BOT,1,1), BBOAT_MASK, PWRCOM, { BI, BDA } }, | 3877 | {"bdnz+", BBO(16,BODNZ,0,0), BBOATBI_MASK, PPCCOM, PPCVLE, {BDP}}, |
2764 | { "bf-", BBO(16,BOF,0,0), BBOAT_MASK, PPCCOM, { BI, BDM } }, | 3878 | {"bdnz", BBO(16,BODNZ,0,0), BBOATBI_MASK, PPCCOM, PPCVLE, {BD}}, |
2765 | { "bf+", BBO(16,BOF,0,0), BBOAT_MASK, PPCCOM, { BI, BDP } }, | 3879 | {"bdn", BBO(16,BODNZ,0,0), BBOATBI_MASK, PWRCOM, PPCVLE, {BD}}, |
2766 | { "bf", BBO(16,BOF,0,0), BBOAT_MASK, PPCCOM, { BI, BD } }, | 3880 | {"bdnzl-", BBO(16,BODNZ,0,1), BBOATBI_MASK, PPCCOM, PPCVLE, {BDM}}, |
2767 | { "bbf", BBO(16,BOF,0,0), BBOAT_MASK, PWRCOM, { BI, BD } }, | 3881 | {"bdnzl+", BBO(16,BODNZ,0,1), BBOATBI_MASK, PPCCOM, PPCVLE, {BDP}}, |
2768 | { "bfl-", BBO(16,BOF,0,1), BBOAT_MASK, PPCCOM, { BI, BDM } }, | 3882 | {"bdnzl", BBO(16,BODNZ,0,1), BBOATBI_MASK, PPCCOM, PPCVLE, {BD}}, |
2769 | { "bfl+", BBO(16,BOF,0,1), BBOAT_MASK, PPCCOM, { BI, BDP } }, | 3883 | {"bdnl", BBO(16,BODNZ,0,1), BBOATBI_MASK, PWRCOM, PPCVLE, {BD}}, |
2770 | { "bfl", BBO(16,BOF,0,1), BBOAT_MASK, PPCCOM, { BI, BD } }, | 3884 | {"bdnza-", BBO(16,BODNZ,1,0), BBOATBI_MASK, PPCCOM, PPCVLE, {BDMA}}, |
2771 | { "bbfl", BBO(16,BOF,0,1), BBOAT_MASK, PWRCOM, { BI, BD } }, | 3885 | {"bdnza+", BBO(16,BODNZ,1,0), BBOATBI_MASK, PPCCOM, PPCVLE, {BDPA}}, |
2772 | { "bfa-", BBO(16,BOF,1,0), BBOAT_MASK, PPCCOM, { BI, BDMA } }, | 3886 | {"bdnza", BBO(16,BODNZ,1,0), BBOATBI_MASK, PPCCOM, PPCVLE, {BDA}}, |
2773 | { "bfa+", BBO(16,BOF,1,0), BBOAT_MASK, PPCCOM, { BI, BDPA } }, | 3887 | {"bdna", BBO(16,BODNZ,1,0), BBOATBI_MASK, PWRCOM, PPCVLE, {BDA}}, |
2774 | { "bfa", BBO(16,BOF,1,0), BBOAT_MASK, PPCCOM, { BI, BDA } }, | 3888 | {"bdnzla-", BBO(16,BODNZ,1,1), BBOATBI_MASK, PPCCOM, PPCVLE, {BDMA}}, |
2775 | { "bbfa", BBO(16,BOF,1,0), BBOAT_MASK, PWRCOM, { BI, BDA } }, | 3889 | {"bdnzla+", BBO(16,BODNZ,1,1), BBOATBI_MASK, PPCCOM, PPCVLE, {BDPA}}, |
2776 | { "bfla-", BBO(16,BOF,1,1), BBOAT_MASK, PPCCOM, { BI, BDMA } }, | 3890 | {"bdnzla", BBO(16,BODNZ,1,1), BBOATBI_MASK, PPCCOM, PPCVLE, {BDA}}, |
2777 | { "bfla+", BBO(16,BOF,1,1), BBOAT_MASK, PPCCOM, { BI, BDPA } }, | 3891 | {"bdnla", BBO(16,BODNZ,1,1), BBOATBI_MASK, PWRCOM, PPCVLE, {BDA}}, |
2778 | { "bfla", BBO(16,BOF,1,1), BBOAT_MASK, PPCCOM, { BI, BDA } }, | 3892 | {"bdz-", BBO(16,BODZ,0,0), BBOATBI_MASK, PPCCOM, PPCVLE, {BDM}}, |
2779 | { "bbfla", BBO(16,BOF,1,1), BBOAT_MASK, PWRCOM, { BI, BDA } }, | 3893 | {"bdz+", BBO(16,BODZ,0,0), BBOATBI_MASK, PPCCOM, PPCVLE, {BDP}}, |
2780 | { "bdzt-", BBO(16,BODZT,0,0), BBOY_MASK, NOPOWER4, { BI, BDM } }, | 3894 | {"bdz", BBO(16,BODZ,0,0), BBOATBI_MASK, COM, PPCVLE, {BD}}, |
2781 | { "bdzt+", BBO(16,BODZT,0,0), BBOY_MASK, NOPOWER4, { BI, BDP } }, | 3895 | {"bdzl-", BBO(16,BODZ,0,1), BBOATBI_MASK, PPCCOM, PPCVLE, {BDM}}, |
2782 | { "bdzt", BBO(16,BODZT,0,0), BBOY_MASK, PPCCOM, { BI, BD } }, | 3896 | {"bdzl+", BBO(16,BODZ,0,1), BBOATBI_MASK, PPCCOM, PPCVLE, {BDP}}, |
2783 | { "bdztl-", BBO(16,BODZT,0,1), BBOY_MASK, NOPOWER4, { BI, BDM } }, | 3897 | {"bdzl", BBO(16,BODZ,0,1), BBOATBI_MASK, COM, PPCVLE, {BD}}, |
2784 | { "bdztl+", BBO(16,BODZT,0,1), BBOY_MASK, NOPOWER4, { BI, BDP } }, | 3898 | {"bdza-", BBO(16,BODZ,1,0), BBOATBI_MASK, PPCCOM, PPCVLE, {BDMA}}, |
2785 | { "bdztl", BBO(16,BODZT,0,1), BBOY_MASK, PPCCOM, { BI, BD } }, | 3899 | {"bdza+", BBO(16,BODZ,1,0), BBOATBI_MASK, PPCCOM, PPCVLE, {BDPA}}, |
2786 | { "bdzta-", BBO(16,BODZT,1,0), BBOY_MASK, NOPOWER4, { BI, BDMA } }, | 3900 | {"bdza", BBO(16,BODZ,1,0), BBOATBI_MASK, COM, PPCVLE, {BDA}}, |
2787 | { "bdzta+", BBO(16,BODZT,1,0), BBOY_MASK, NOPOWER4, { BI, BDPA } }, | 3901 | {"bdzla-", BBO(16,BODZ,1,1), BBOATBI_MASK, PPCCOM, PPCVLE, {BDMA}}, |
2788 | { "bdzta", BBO(16,BODZT,1,0), BBOY_MASK, PPCCOM, { BI, BDA } }, | 3902 | {"bdzla+", BBO(16,BODZ,1,1), BBOATBI_MASK, PPCCOM, PPCVLE, {BDPA}}, |
2789 | { "bdztla-", BBO(16,BODZT,1,1), BBOY_MASK, NOPOWER4, { BI, BDMA } }, | 3903 | {"bdzla", BBO(16,BODZ,1,1), BBOATBI_MASK, COM, PPCVLE, {BDA}}, |
2790 | { "bdztla+", BBO(16,BODZT,1,1), BBOY_MASK, NOPOWER4, { BI, BDPA } }, | 3904 | |
2791 | { "bdztla", BBO(16,BODZT,1,1), BBOY_MASK, PPCCOM, { BI, BDA } }, | 3905 | {"bge-", BBOCB(16,BOF,CBLT,0,0), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDM}}, |
2792 | { "bdzf-", BBO(16,BODZF,0,0), BBOY_MASK, NOPOWER4, { BI, BDM } }, | 3906 | {"bge+", BBOCB(16,BOF,CBLT,0,0), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDP}}, |
2793 | { "bdzf+", BBO(16,BODZF,0,0), BBOY_MASK, NOPOWER4, { BI, BDP } }, | 3907 | {"bge", BBOCB(16,BOF,CBLT,0,0), BBOATCB_MASK, COM, PPCVLE, {CR, BD}}, |
2794 | { "bdzf", BBO(16,BODZF,0,0), BBOY_MASK, PPCCOM, { BI, BD } }, | 3908 | {"bnl-", BBOCB(16,BOF,CBLT,0,0), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDM}}, |
2795 | { "bdzfl-", BBO(16,BODZF,0,1), BBOY_MASK, NOPOWER4, { BI, BDM } }, | 3909 | {"bnl+", BBOCB(16,BOF,CBLT,0,0), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDP}}, |
2796 | { "bdzfl+", BBO(16,BODZF,0,1), BBOY_MASK, NOPOWER4, { BI, BDP } }, | 3910 | {"bnl", BBOCB(16,BOF,CBLT,0,0), BBOATCB_MASK, COM, PPCVLE, {CR, BD}}, |
2797 | { "bdzfl", BBO(16,BODZF,0,1), BBOY_MASK, PPCCOM, { BI, BD } }, | 3911 | {"bgel-", BBOCB(16,BOF,CBLT,0,1), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDM}}, |
2798 | { "bdzfa-", BBO(16,BODZF,1,0), BBOY_MASK, NOPOWER4, { BI, BDMA } }, | 3912 | {"bgel+", BBOCB(16,BOF,CBLT,0,1), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDP}}, |
2799 | { "bdzfa+", BBO(16,BODZF,1,0), BBOY_MASK, NOPOWER4, { BI, BDPA } }, | 3913 | {"bgel", BBOCB(16,BOF,CBLT,0,1), BBOATCB_MASK, COM, PPCVLE, {CR, BD}}, |
2800 | { "bdzfa", BBO(16,BODZF,1,0), BBOY_MASK, PPCCOM, { BI, BDA } }, | 3914 | {"bnll-", BBOCB(16,BOF,CBLT,0,1), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDM}}, |
2801 | { "bdzfla-", BBO(16,BODZF,1,1), BBOY_MASK, NOPOWER4, { BI, BDMA } }, | 3915 | {"bnll+", BBOCB(16,BOF,CBLT,0,1), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDP}}, |
2802 | { "bdzfla+", BBO(16,BODZF,1,1), BBOY_MASK, NOPOWER4, { BI, BDPA } }, | 3916 | {"bnll", BBOCB(16,BOF,CBLT,0,1), BBOATCB_MASK, COM, PPCVLE, {CR, BD}}, |
2803 | { "bdzfla", BBO(16,BODZF,1,1), BBOY_MASK, PPCCOM, { BI, BDA } }, | 3917 | {"bgea-", BBOCB(16,BOF,CBLT,1,0), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDMA}}, |
2804 | { "bc-", B(16,0,0), B_MASK, PPCCOM, { BOE, BI, BDM } }, | 3918 | {"bgea+", BBOCB(16,BOF,CBLT,1,0), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDPA}}, |
2805 | { "bc+", B(16,0,0), B_MASK, PPCCOM, { BOE, BI, BDP } }, | 3919 | {"bgea", BBOCB(16,BOF,CBLT,1,0), BBOATCB_MASK, COM, PPCVLE, {CR, BDA}}, |
2806 | { "bc", B(16,0,0), B_MASK, COM, { BO, BI, BD } }, | 3920 | {"bnla-", BBOCB(16,BOF,CBLT,1,0), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDMA}}, |
2807 | { "bcl-", B(16,0,1), B_MASK, PPCCOM, { BOE, BI, BDM } }, | 3921 | {"bnla+", BBOCB(16,BOF,CBLT,1,0), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDPA}}, |
2808 | { "bcl+", B(16,0,1), B_MASK, PPCCOM, { BOE, BI, BDP } }, | 3922 | {"bnla", BBOCB(16,BOF,CBLT,1,0), BBOATCB_MASK, COM, PPCVLE, {CR, BDA}}, |
2809 | { "bcl", B(16,0,1), B_MASK, COM, { BO, BI, BD } }, | 3923 | {"bgela-", BBOCB(16,BOF,CBLT,1,1), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDMA}}, |
2810 | { "bca-", B(16,1,0), B_MASK, PPCCOM, { BOE, BI, BDMA } }, | 3924 | {"bgela+", BBOCB(16,BOF,CBLT,1,1), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDPA}}, |
2811 | { "bca+", B(16,1,0), B_MASK, PPCCOM, { BOE, BI, BDPA } }, | 3925 | {"bgela", BBOCB(16,BOF,CBLT,1,1), BBOATCB_MASK, COM, PPCVLE, {CR, BDA}}, |
2812 | { "bca", B(16,1,0), B_MASK, COM, { BO, BI, BDA } }, | 3926 | {"bnlla-", BBOCB(16,BOF,CBLT,1,1), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDMA}}, |
2813 | { "bcla-", B(16,1,1), B_MASK, PPCCOM, { BOE, BI, BDMA } }, | 3927 | {"bnlla+", BBOCB(16,BOF,CBLT,1,1), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDPA}}, |
2814 | { "bcla+", B(16,1,1), B_MASK, PPCCOM, { BOE, BI, BDPA } }, | 3928 | {"bnlla", BBOCB(16,BOF,CBLT,1,1), BBOATCB_MASK, COM, PPCVLE, {CR, BDA}}, |
2815 | { "bcla", B(16,1,1), B_MASK, COM, { BO, BI, BDA } }, | 3929 | {"ble-", BBOCB(16,BOF,CBGT,0,0), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDM}}, |
2816 | 3930 | {"ble+", BBOCB(16,BOF,CBGT,0,0), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDP}}, | |
2817 | { "sc", SC(17,1,0), SC_MASK, PPC, { LEV } }, | 3931 | {"ble", BBOCB(16,BOF,CBGT,0,0), BBOATCB_MASK, COM, PPCVLE, {CR, BD}}, |
2818 | { "svc", SC(17,0,0), SC_MASK, POWER, { SVC_LEV, FL1, FL2 } }, | 3932 | {"bng-", BBOCB(16,BOF,CBGT,0,0), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDM}}, |
2819 | { "svcl", SC(17,0,1), SC_MASK, POWER, { SVC_LEV, FL1, FL2 } }, | 3933 | {"bng+", BBOCB(16,BOF,CBGT,0,0), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDP}}, |
2820 | { "svca", SC(17,1,0), SC_MASK, PWRCOM, { SV } }, | 3934 | {"bng", BBOCB(16,BOF,CBGT,0,0), BBOATCB_MASK, COM, PPCVLE, {CR, BD}}, |
2821 | { "svcla", SC(17,1,1), SC_MASK, POWER, { SV } }, | 3935 | {"blel-", BBOCB(16,BOF,CBGT,0,1), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDM}}, |
2822 | 3936 | {"blel+", BBOCB(16,BOF,CBGT,0,1), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDP}}, | |
2823 | { "b", B(18,0,0), B_MASK, COM, { LI } }, | 3937 | {"blel", BBOCB(16,BOF,CBGT,0,1), BBOATCB_MASK, COM, PPCVLE, {CR, BD}}, |
2824 | { "bl", B(18,0,1), B_MASK, COM, { LI } }, | 3938 | {"bngl-", BBOCB(16,BOF,CBGT,0,1), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDM}}, |
2825 | { "ba", B(18,1,0), B_MASK, COM, { LIA } }, | 3939 | {"bngl+", BBOCB(16,BOF,CBGT,0,1), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDP}}, |
2826 | { "bla", B(18,1,1), B_MASK, COM, { LIA } }, | 3940 | {"bngl", BBOCB(16,BOF,CBGT,0,1), BBOATCB_MASK, COM, PPCVLE, {CR, BD}}, |
2827 | 3941 | {"blea-", BBOCB(16,BOF,CBGT,1,0), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDMA}}, | |
2828 | { "mcrf", XL(19,0), XLBB_MASK|(3 << 21)|(3 << 16), COM, { BF, BFA } }, | 3942 | {"blea+", BBOCB(16,BOF,CBGT,1,0), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDPA}}, |
2829 | 3943 | {"blea", BBOCB(16,BOF,CBGT,1,0), BBOATCB_MASK, COM, PPCVLE, {CR, BDA}}, | |
2830 | { "blr", XLO(19,BOU,16,0), XLBOBIBB_MASK, PPCCOM, { 0 } }, | 3944 | {"bnga-", BBOCB(16,BOF,CBGT,1,0), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDMA}}, |
2831 | { "br", XLO(19,BOU,16,0), XLBOBIBB_MASK, PWRCOM, { 0 } }, | 3945 | {"bnga+", BBOCB(16,BOF,CBGT,1,0), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDPA}}, |
2832 | { "blrl", XLO(19,BOU,16,1), XLBOBIBB_MASK, PPCCOM, { 0 } }, | 3946 | {"bnga", BBOCB(16,BOF,CBGT,1,0), BBOATCB_MASK, COM, PPCVLE, {CR, BDA}}, |
2833 | { "brl", XLO(19,BOU,16,1), XLBOBIBB_MASK, PWRCOM, { 0 } }, | 3947 | {"blela-", BBOCB(16,BOF,CBGT,1,1), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDMA}}, |
2834 | { "bdnzlr", XLO(19,BODNZ,16,0), XLBOBIBB_MASK, PPCCOM, { 0 } }, | 3948 | {"blela+", BBOCB(16,BOF,CBGT,1,1), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDPA}}, |
2835 | { "bdnzlr-", XLO(19,BODNZ,16,0), XLBOBIBB_MASK, NOPOWER4, { 0 } }, | 3949 | {"blela", BBOCB(16,BOF,CBGT,1,1), BBOATCB_MASK, COM, PPCVLE, {CR, BDA}}, |
2836 | { "bdnzlr-", XLO(19,BODNZM4,16,0), XLBOBIBB_MASK, POWER4, { 0 } }, | 3950 | {"bngla-", BBOCB(16,BOF,CBGT,1,1), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDMA}}, |
2837 | { "bdnzlr+", XLO(19,BODNZP,16,0), XLBOBIBB_MASK, NOPOWER4, { 0 } }, | 3951 | {"bngla+", BBOCB(16,BOF,CBGT,1,1), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDPA}}, |
2838 | { "bdnzlr+", XLO(19,BODNZP4,16,0), XLBOBIBB_MASK, POWER4, { 0 } }, | 3952 | {"bngla", BBOCB(16,BOF,CBGT,1,1), BBOATCB_MASK, COM, PPCVLE, {CR, BDA}}, |
2839 | { "bdnzlrl", XLO(19,BODNZ,16,1), XLBOBIBB_MASK, PPCCOM, { 0 } }, | 3953 | {"bne-", BBOCB(16,BOF,CBEQ,0,0), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDM}}, |
2840 | { "bdnzlrl-",XLO(19,BODNZ,16,1), XLBOBIBB_MASK, NOPOWER4, { 0 } }, | 3954 | {"bne+", BBOCB(16,BOF,CBEQ,0,0), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDP}}, |
2841 | { "bdnzlrl-",XLO(19,BODNZM4,16,1), XLBOBIBB_MASK, POWER4, { 0 } }, | 3955 | {"bne", BBOCB(16,BOF,CBEQ,0,0), BBOATCB_MASK, COM, PPCVLE, {CR, BD}}, |
2842 | { "bdnzlrl+",XLO(19,BODNZP,16,1), XLBOBIBB_MASK, NOPOWER4, { 0 } }, | 3956 | {"bnel-", BBOCB(16,BOF,CBEQ,0,1), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDM}}, |
2843 | { "bdnzlrl+",XLO(19,BODNZP4,16,1), XLBOBIBB_MASK, POWER4, { 0 } }, | 3957 | {"bnel+", BBOCB(16,BOF,CBEQ,0,1), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDP}}, |
2844 | { "bdzlr", XLO(19,BODZ,16,0), XLBOBIBB_MASK, PPCCOM, { 0 } }, | 3958 | {"bnel", BBOCB(16,BOF,CBEQ,0,1), BBOATCB_MASK, COM, PPCVLE, {CR, BD}}, |
2845 | { "bdzlr-", XLO(19,BODZ,16,0), XLBOBIBB_MASK, NOPOWER4, { 0 } }, | 3959 | {"bnea-", BBOCB(16,BOF,CBEQ,1,0), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDMA}}, |
2846 | { "bdzlr-", XLO(19,BODZM4,16,0), XLBOBIBB_MASK, POWER4, { 0 } }, | 3960 | {"bnea+", BBOCB(16,BOF,CBEQ,1,0), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDPA}}, |
2847 | { "bdzlr+", XLO(19,BODZP,16,0), XLBOBIBB_MASK, NOPOWER4, { 0 } }, | 3961 | {"bnea", BBOCB(16,BOF,CBEQ,1,0), BBOATCB_MASK, COM, PPCVLE, {CR, BDA}}, |
2848 | { "bdzlr+", XLO(19,BODZP4,16,0), XLBOBIBB_MASK, POWER4, { 0 } }, | 3962 | {"bnela-", BBOCB(16,BOF,CBEQ,1,1), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDMA}}, |
2849 | { "bdzlrl", XLO(19,BODZ,16,1), XLBOBIBB_MASK, PPCCOM, { 0 } }, | 3963 | {"bnela+", BBOCB(16,BOF,CBEQ,1,1), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDPA}}, |
2850 | { "bdzlrl-", XLO(19,BODZ,16,1), XLBOBIBB_MASK, NOPOWER4, { 0 } }, | 3964 | {"bnela", BBOCB(16,BOF,CBEQ,1,1), BBOATCB_MASK, COM, PPCVLE, {CR, BDA}}, |
2851 | { "bdzlrl-", XLO(19,BODZM4,16,1), XLBOBIBB_MASK, POWER4, { 0 } }, | 3965 | {"bns-", BBOCB(16,BOF,CBSO,0,0), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDM}}, |
2852 | { "bdzlrl+", XLO(19,BODZP,16,1), XLBOBIBB_MASK, NOPOWER4, { 0 } }, | 3966 | {"bns+", BBOCB(16,BOF,CBSO,0,0), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDP}}, |
2853 | { "bdzlrl+", XLO(19,BODZP4,16,1), XLBOBIBB_MASK, POWER4, { 0 } }, | 3967 | {"bns", BBOCB(16,BOF,CBSO,0,0), BBOATCB_MASK, COM, PPCVLE, {CR, BD}}, |
2854 | { "bltlr", XLOCB(19,BOT,CBLT,16,0), XLBOCBBB_MASK, PPCCOM, { CR } }, | 3968 | {"bnu-", BBOCB(16,BOF,CBSO,0,0), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDM}}, |
2855 | { "bltlr-", XLOCB(19,BOT,CBLT,16,0), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 3969 | {"bnu+", BBOCB(16,BOF,CBSO,0,0), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDP}}, |
2856 | { "bltlr-", XLOCB(19,BOTM4,CBLT,16,0), XLBOCBBB_MASK, POWER4, { CR } }, | 3970 | {"bnu", BBOCB(16,BOF,CBSO,0,0), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BD}}, |
2857 | { "bltlr+", XLOCB(19,BOTP,CBLT,16,0), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 3971 | {"bnsl-", BBOCB(16,BOF,CBSO,0,1), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDM}}, |
2858 | { "bltlr+", XLOCB(19,BOTP4,CBLT,16,0), XLBOCBBB_MASK, POWER4, { CR } }, | 3972 | {"bnsl+", BBOCB(16,BOF,CBSO,0,1), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDP}}, |
2859 | { "bltr", XLOCB(19,BOT,CBLT,16,0), XLBOCBBB_MASK, PWRCOM, { CR } }, | 3973 | {"bnsl", BBOCB(16,BOF,CBSO,0,1), BBOATCB_MASK, COM, PPCVLE, {CR, BD}}, |
2860 | { "bltlrl", XLOCB(19,BOT,CBLT,16,1), XLBOCBBB_MASK, PPCCOM, { CR } }, | 3974 | {"bnul-", BBOCB(16,BOF,CBSO,0,1), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDM}}, |
2861 | { "bltlrl-", XLOCB(19,BOT,CBLT,16,1), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 3975 | {"bnul+", BBOCB(16,BOF,CBSO,0,1), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDP}}, |
2862 | { "bltlrl-", XLOCB(19,BOTM4,CBLT,16,1), XLBOCBBB_MASK, POWER4, { CR } }, | 3976 | {"bnul", BBOCB(16,BOF,CBSO,0,1), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BD}}, |
2863 | { "bltlrl+", XLOCB(19,BOTP,CBLT,16,1), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 3977 | {"bnsa-", BBOCB(16,BOF,CBSO,1,0), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDMA}}, |
2864 | { "bltlrl+", XLOCB(19,BOTP4,CBLT,16,1), XLBOCBBB_MASK, POWER4, { CR } }, | 3978 | {"bnsa+", BBOCB(16,BOF,CBSO,1,0), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDPA}}, |
2865 | { "bltrl", XLOCB(19,BOT,CBLT,16,1), XLBOCBBB_MASK, PWRCOM, { CR } }, | 3979 | {"bnsa", BBOCB(16,BOF,CBSO,1,0), BBOATCB_MASK, COM, PPCVLE, {CR, BDA}}, |
2866 | { "bgtlr", XLOCB(19,BOT,CBGT,16,0), XLBOCBBB_MASK, PPCCOM, { CR } }, | 3980 | {"bnua-", BBOCB(16,BOF,CBSO,1,0), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDMA}}, |
2867 | { "bgtlr-", XLOCB(19,BOT,CBGT,16,0), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 3981 | {"bnua+", BBOCB(16,BOF,CBSO,1,0), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDPA}}, |
2868 | { "bgtlr-", XLOCB(19,BOTM4,CBGT,16,0), XLBOCBBB_MASK, POWER4, { CR } }, | 3982 | {"bnua", BBOCB(16,BOF,CBSO,1,0), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDA}}, |
2869 | { "bgtlr+", XLOCB(19,BOTP,CBGT,16,0), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 3983 | {"bnsla-", BBOCB(16,BOF,CBSO,1,1), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDMA}}, |
2870 | { "bgtlr+", XLOCB(19,BOTP4,CBGT,16,0), XLBOCBBB_MASK, POWER4, { CR } }, | 3984 | {"bnsla+", BBOCB(16,BOF,CBSO,1,1), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDPA}}, |
2871 | { "bgtr", XLOCB(19,BOT,CBGT,16,0), XLBOCBBB_MASK, PWRCOM, { CR } }, | 3985 | {"bnsla", BBOCB(16,BOF,CBSO,1,1), BBOATCB_MASK, COM, PPCVLE, {CR, BDA}}, |
2872 | { "bgtlrl", XLOCB(19,BOT,CBGT,16,1), XLBOCBBB_MASK, PPCCOM, { CR } }, | 3986 | {"bnula-", BBOCB(16,BOF,CBSO,1,1), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDMA}}, |
2873 | { "bgtlrl-", XLOCB(19,BOT,CBGT,16,1), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 3987 | {"bnula+", BBOCB(16,BOF,CBSO,1,1), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDPA}}, |
2874 | { "bgtlrl-", XLOCB(19,BOTM4,CBGT,16,1), XLBOCBBB_MASK, POWER4, { CR } }, | 3988 | {"bnula", BBOCB(16,BOF,CBSO,1,1), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDA}}, |
2875 | { "bgtlrl+", XLOCB(19,BOTP,CBGT,16,1), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 3989 | |
2876 | { "bgtlrl+", XLOCB(19,BOTP4,CBGT,16,1), XLBOCBBB_MASK, POWER4, { CR } }, | 3990 | {"blt-", BBOCB(16,BOT,CBLT,0,0), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDM}}, |
2877 | { "bgtrl", XLOCB(19,BOT,CBGT,16,1), XLBOCBBB_MASK, PWRCOM, { CR } }, | 3991 | {"blt+", BBOCB(16,BOT,CBLT,0,0), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDP}}, |
2878 | { "beqlr", XLOCB(19,BOT,CBEQ,16,0), XLBOCBBB_MASK, PPCCOM, { CR } }, | 3992 | {"blt", BBOCB(16,BOT,CBLT,0,0), BBOATCB_MASK, COM, PPCVLE, {CR, BD}}, |
2879 | { "beqlr-", XLOCB(19,BOT,CBEQ,16,0), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 3993 | {"bltl-", BBOCB(16,BOT,CBLT,0,1), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDM}}, |
2880 | { "beqlr-", XLOCB(19,BOTM4,CBEQ,16,0), XLBOCBBB_MASK, POWER4, { CR } }, | 3994 | {"bltl+", BBOCB(16,BOT,CBLT,0,1), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDP}}, |
2881 | { "beqlr+", XLOCB(19,BOTP,CBEQ,16,0), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 3995 | {"bltl", BBOCB(16,BOT,CBLT,0,1), BBOATCB_MASK, COM, PPCVLE, {CR, BD}}, |
2882 | { "beqlr+", XLOCB(19,BOTP4,CBEQ,16,0), XLBOCBBB_MASK, POWER4, { CR } }, | 3996 | {"blta-", BBOCB(16,BOT,CBLT,1,0), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDMA}}, |
2883 | { "beqr", XLOCB(19,BOT,CBEQ,16,0), XLBOCBBB_MASK, PWRCOM, { CR } }, | 3997 | {"blta+", BBOCB(16,BOT,CBLT,1,0), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDPA}}, |
2884 | { "beqlrl", XLOCB(19,BOT,CBEQ,16,1), XLBOCBBB_MASK, PPCCOM, { CR } }, | 3998 | {"blta", BBOCB(16,BOT,CBLT,1,0), BBOATCB_MASK, COM, PPCVLE, {CR, BDA}}, |
2885 | { "beqlrl-", XLOCB(19,BOT,CBEQ,16,1), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 3999 | {"bltla-", BBOCB(16,BOT,CBLT,1,1), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDMA}}, |
2886 | { "beqlrl-", XLOCB(19,BOTM4,CBEQ,16,1), XLBOCBBB_MASK, POWER4, { CR } }, | 4000 | {"bltla+", BBOCB(16,BOT,CBLT,1,1), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDPA}}, |
2887 | { "beqlrl+", XLOCB(19,BOTP,CBEQ,16,1), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4001 | {"bltla", BBOCB(16,BOT,CBLT,1,1), BBOATCB_MASK, COM, PPCVLE, {CR, BDA}}, |
2888 | { "beqlrl+", XLOCB(19,BOTP4,CBEQ,16,1), XLBOCBBB_MASK, POWER4, { CR } }, | 4002 | {"bgt-", BBOCB(16,BOT,CBGT,0,0), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDM}}, |
2889 | { "beqrl", XLOCB(19,BOT,CBEQ,16,1), XLBOCBBB_MASK, PWRCOM, { CR } }, | 4003 | {"bgt+", BBOCB(16,BOT,CBGT,0,0), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDP}}, |
2890 | { "bsolr", XLOCB(19,BOT,CBSO,16,0), XLBOCBBB_MASK, PPCCOM, { CR } }, | 4004 | {"bgt", BBOCB(16,BOT,CBGT,0,0), BBOATCB_MASK, COM, PPCVLE, {CR, BD}}, |
2891 | { "bsolr-", XLOCB(19,BOT,CBSO,16,0), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4005 | {"bgtl-", BBOCB(16,BOT,CBGT,0,1), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDM}}, |
2892 | { "bsolr-", XLOCB(19,BOTM4,CBSO,16,0), XLBOCBBB_MASK, POWER4, { CR } }, | 4006 | {"bgtl+", BBOCB(16,BOT,CBGT,0,1), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDP}}, |
2893 | { "bsolr+", XLOCB(19,BOTP,CBSO,16,0), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4007 | {"bgtl", BBOCB(16,BOT,CBGT,0,1), BBOATCB_MASK, COM, PPCVLE, {CR, BD}}, |
2894 | { "bsolr+", XLOCB(19,BOTP4,CBSO,16,0), XLBOCBBB_MASK, POWER4, { CR } }, | 4008 | {"bgta-", BBOCB(16,BOT,CBGT,1,0), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDMA}}, |
2895 | { "bsor", XLOCB(19,BOT,CBSO,16,0), XLBOCBBB_MASK, PWRCOM, { CR } }, | 4009 | {"bgta+", BBOCB(16,BOT,CBGT,1,0), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDPA}}, |
2896 | { "bsolrl", XLOCB(19,BOT,CBSO,16,1), XLBOCBBB_MASK, PPCCOM, { CR } }, | 4010 | {"bgta", BBOCB(16,BOT,CBGT,1,0), BBOATCB_MASK, COM, PPCVLE, {CR, BDA}}, |
2897 | { "bsolrl-", XLOCB(19,BOT,CBSO,16,1), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4011 | {"bgtla-", BBOCB(16,BOT,CBGT,1,1), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDMA}}, |
2898 | { "bsolrl-", XLOCB(19,BOTM4,CBSO,16,1), XLBOCBBB_MASK, POWER4, { CR } }, | 4012 | {"bgtla+", BBOCB(16,BOT,CBGT,1,1), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDPA}}, |
2899 | { "bsolrl+", XLOCB(19,BOTP,CBSO,16,1), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4013 | {"bgtla", BBOCB(16,BOT,CBGT,1,1), BBOATCB_MASK, COM, PPCVLE, {CR, BDA}}, |
2900 | { "bsolrl+", XLOCB(19,BOTP4,CBSO,16,1), XLBOCBBB_MASK, POWER4, { CR } }, | 4014 | {"beq-", BBOCB(16,BOT,CBEQ,0,0), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDM}}, |
2901 | { "bsorl", XLOCB(19,BOT,CBSO,16,1), XLBOCBBB_MASK, PWRCOM, { CR } }, | 4015 | {"beq+", BBOCB(16,BOT,CBEQ,0,0), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDP}}, |
2902 | { "bunlr", XLOCB(19,BOT,CBSO,16,0), XLBOCBBB_MASK, PPCCOM, { CR } }, | 4016 | {"beq", BBOCB(16,BOT,CBEQ,0,0), BBOATCB_MASK, COM, PPCVLE, {CR, BD}}, |
2903 | { "bunlr-", XLOCB(19,BOT,CBSO,16,0), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4017 | {"beql-", BBOCB(16,BOT,CBEQ,0,1), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDM}}, |
2904 | { "bunlr-", XLOCB(19,BOTM4,CBSO,16,0), XLBOCBBB_MASK, POWER4, { CR } }, | 4018 | {"beql+", BBOCB(16,BOT,CBEQ,0,1), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDP}}, |
2905 | { "bunlr+", XLOCB(19,BOTP,CBSO,16,0), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4019 | {"beql", BBOCB(16,BOT,CBEQ,0,1), BBOATCB_MASK, COM, PPCVLE, {CR, BD}}, |
2906 | { "bunlr+", XLOCB(19,BOTP4,CBSO,16,0), XLBOCBBB_MASK, POWER4, { CR } }, | 4020 | {"beqa-", BBOCB(16,BOT,CBEQ,1,0), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDMA}}, |
2907 | { "bunlrl", XLOCB(19,BOT,CBSO,16,1), XLBOCBBB_MASK, PPCCOM, { CR } }, | 4021 | {"beqa+", BBOCB(16,BOT,CBEQ,1,0), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDPA}}, |
2908 | { "bunlrl-", XLOCB(19,BOT,CBSO,16,1), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4022 | {"beqa", BBOCB(16,BOT,CBEQ,1,0), BBOATCB_MASK, COM, PPCVLE, {CR, BDA}}, |
2909 | { "bunlrl-", XLOCB(19,BOTM4,CBSO,16,1), XLBOCBBB_MASK, POWER4, { CR } }, | 4023 | {"beqla-", BBOCB(16,BOT,CBEQ,1,1), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDMA}}, |
2910 | { "bunlrl+", XLOCB(19,BOTP,CBSO,16,1), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4024 | {"beqla+", BBOCB(16,BOT,CBEQ,1,1), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDPA}}, |
2911 | { "bunlrl+", XLOCB(19,BOTP4,CBSO,16,1), XLBOCBBB_MASK, POWER4, { CR } }, | 4025 | {"beqla", BBOCB(16,BOT,CBEQ,1,1), BBOATCB_MASK, COM, PPCVLE, {CR, BDA}}, |
2912 | { "bgelr", XLOCB(19,BOF,CBLT,16,0), XLBOCBBB_MASK, PPCCOM, { CR } }, | 4026 | {"bso-", BBOCB(16,BOT,CBSO,0,0), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDM}}, |
2913 | { "bgelr-", XLOCB(19,BOF,CBLT,16,0), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4027 | {"bso+", BBOCB(16,BOT,CBSO,0,0), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDP}}, |
2914 | { "bgelr-", XLOCB(19,BOFM4,CBLT,16,0), XLBOCBBB_MASK, POWER4, { CR } }, | 4028 | {"bso", BBOCB(16,BOT,CBSO,0,0), BBOATCB_MASK, COM, PPCVLE, {CR, BD}}, |
2915 | { "bgelr+", XLOCB(19,BOFP,CBLT,16,0), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4029 | {"bun-", BBOCB(16,BOT,CBSO,0,0), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDM}}, |
2916 | { "bgelr+", XLOCB(19,BOFP4,CBLT,16,0), XLBOCBBB_MASK, POWER4, { CR } }, | 4030 | {"bun+", BBOCB(16,BOT,CBSO,0,0), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDP}}, |
2917 | { "bger", XLOCB(19,BOF,CBLT,16,0), XLBOCBBB_MASK, PWRCOM, { CR } }, | 4031 | {"bun", BBOCB(16,BOT,CBSO,0,0), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BD}}, |
2918 | { "bgelrl", XLOCB(19,BOF,CBLT,16,1), XLBOCBBB_MASK, PPCCOM, { CR } }, | 4032 | {"bsol-", BBOCB(16,BOT,CBSO,0,1), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDM}}, |
2919 | { "bgelrl-", XLOCB(19,BOF,CBLT,16,1), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4033 | {"bsol+", BBOCB(16,BOT,CBSO,0,1), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDP}}, |
2920 | { "bgelrl-", XLOCB(19,BOFM4,CBLT,16,1), XLBOCBBB_MASK, POWER4, { CR } }, | 4034 | {"bsol", BBOCB(16,BOT,CBSO,0,1), BBOATCB_MASK, COM, PPCVLE, {CR, BD}}, |
2921 | { "bgelrl+", XLOCB(19,BOFP,CBLT,16,1), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4035 | {"bunl-", BBOCB(16,BOT,CBSO,0,1), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDM}}, |
2922 | { "bgelrl+", XLOCB(19,BOFP4,CBLT,16,1), XLBOCBBB_MASK, POWER4, { CR } }, | 4036 | {"bunl+", BBOCB(16,BOT,CBSO,0,1), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDP}}, |
2923 | { "bgerl", XLOCB(19,BOF,CBLT,16,1), XLBOCBBB_MASK, PWRCOM, { CR } }, | 4037 | {"bunl", BBOCB(16,BOT,CBSO,0,1), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BD}}, |
2924 | { "bnllr", XLOCB(19,BOF,CBLT,16,0), XLBOCBBB_MASK, PPCCOM, { CR } }, | 4038 | {"bsoa-", BBOCB(16,BOT,CBSO,1,0), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDMA}}, |
2925 | { "bnllr-", XLOCB(19,BOF,CBLT,16,0), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4039 | {"bsoa+", BBOCB(16,BOT,CBSO,1,0), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDPA}}, |
2926 | { "bnllr-", XLOCB(19,BOFM4,CBLT,16,0), XLBOCBBB_MASK, POWER4, { CR } }, | 4040 | {"bsoa", BBOCB(16,BOT,CBSO,1,0), BBOATCB_MASK, COM, PPCVLE, {CR, BDA}}, |
2927 | { "bnllr+", XLOCB(19,BOFP,CBLT,16,0), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4041 | {"buna-", BBOCB(16,BOT,CBSO,1,0), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDMA}}, |
2928 | { "bnllr+", XLOCB(19,BOFP4,CBLT,16,0), XLBOCBBB_MASK, POWER4, { CR } }, | 4042 | {"buna+", BBOCB(16,BOT,CBSO,1,0), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDPA}}, |
2929 | { "bnlr", XLOCB(19,BOF,CBLT,16,0), XLBOCBBB_MASK, PWRCOM, { CR } }, | 4043 | {"buna", BBOCB(16,BOT,CBSO,1,0), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDA}}, |
2930 | { "bnllrl", XLOCB(19,BOF,CBLT,16,1), XLBOCBBB_MASK, PPCCOM, { CR } }, | 4044 | {"bsola-", BBOCB(16,BOT,CBSO,1,1), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDMA}}, |
2931 | { "bnllrl-", XLOCB(19,BOF,CBLT,16,1), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4045 | {"bsola+", BBOCB(16,BOT,CBSO,1,1), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDPA}}, |
2932 | { "bnllrl-", XLOCB(19,BOFM4,CBLT,16,1), XLBOCBBB_MASK, POWER4, { CR } }, | 4046 | {"bsola", BBOCB(16,BOT,CBSO,1,1), BBOATCB_MASK, COM, PPCVLE, {CR, BDA}}, |
2933 | { "bnllrl+", XLOCB(19,BOFP,CBLT,16,1), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4047 | {"bunla-", BBOCB(16,BOT,CBSO,1,1), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDMA}}, |
2934 | { "bnllrl+", XLOCB(19,BOFP4,CBLT,16,1), XLBOCBBB_MASK, POWER4, { CR } }, | 4048 | {"bunla+", BBOCB(16,BOT,CBSO,1,1), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDPA}}, |
2935 | { "bnlrl", XLOCB(19,BOF,CBLT,16,1), XLBOCBBB_MASK, PWRCOM, { CR } }, | 4049 | {"bunla", BBOCB(16,BOT,CBSO,1,1), BBOATCB_MASK, PPCCOM, PPCVLE, {CR, BDA}}, |
2936 | { "blelr", XLOCB(19,BOF,CBGT,16,0), XLBOCBBB_MASK, PPCCOM, { CR } }, | 4050 | |
2937 | { "blelr-", XLOCB(19,BOF,CBGT,16,0), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4051 | {"bdnzf-", BBO(16,BODNZF,0,0), BBOY_MASK, PPCCOM, ISA_V2|PPCVLE, {BI, BDM}}, |
2938 | { "blelr-", XLOCB(19,BOFM4,CBGT,16,0), XLBOCBBB_MASK, POWER4, { CR } }, | 4052 | {"bdnzf+", BBO(16,BODNZF,0,0), BBOY_MASK, PPCCOM, ISA_V2|PPCVLE, {BI, BDP}}, |
2939 | { "blelr+", XLOCB(19,BOFP,CBGT,16,0), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4053 | {"bdnzf", BBO(16,BODNZF,0,0), BBOY_MASK, PPCCOM, PPCVLE, {BI, BD}}, |
2940 | { "blelr+", XLOCB(19,BOFP4,CBGT,16,0), XLBOCBBB_MASK, POWER4, { CR } }, | 4054 | {"bdnzfl-", BBO(16,BODNZF,0,1), BBOY_MASK, PPCCOM, ISA_V2|PPCVLE, {BI, BDM}}, |
2941 | { "bler", XLOCB(19,BOF,CBGT,16,0), XLBOCBBB_MASK, PWRCOM, { CR } }, | 4055 | {"bdnzfl+", BBO(16,BODNZF,0,1), BBOY_MASK, PPCCOM, ISA_V2|PPCVLE, {BI, BDP}}, |
2942 | { "blelrl", XLOCB(19,BOF,CBGT,16,1), XLBOCBBB_MASK, PPCCOM, { CR } }, | 4056 | {"bdnzfl", BBO(16,BODNZF,0,1), BBOY_MASK, PPCCOM, PPCVLE, {BI, BD}}, |
2943 | { "blelrl-", XLOCB(19,BOF,CBGT,16,1), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4057 | {"bdnzfa-", BBO(16,BODNZF,1,0), BBOY_MASK, PPCCOM, ISA_V2|PPCVLE, {BI, BDMA}}, |
2944 | { "blelrl-", XLOCB(19,BOFM4,CBGT,16,1), XLBOCBBB_MASK, POWER4, { CR } }, | 4058 | {"bdnzfa+", BBO(16,BODNZF,1,0), BBOY_MASK, PPCCOM, ISA_V2|PPCVLE, {BI, BDPA}}, |
2945 | { "blelrl+", XLOCB(19,BOFP,CBGT,16,1), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4059 | {"bdnzfa", BBO(16,BODNZF,1,0), BBOY_MASK, PPCCOM, PPCVLE, {BI, BDA}}, |
2946 | { "blelrl+", XLOCB(19,BOFP4,CBGT,16,1), XLBOCBBB_MASK, POWER4, { CR } }, | 4060 | {"bdnzfla-", BBO(16,BODNZF,1,1), BBOY_MASK, PPCCOM, ISA_V2|PPCVLE, {BI, BDMA}}, |
2947 | { "blerl", XLOCB(19,BOF,CBGT,16,1), XLBOCBBB_MASK, PWRCOM, { CR } }, | 4061 | {"bdnzfla+", BBO(16,BODNZF,1,1), BBOY_MASK, PPCCOM, ISA_V2|PPCVLE, {BI, BDPA}}, |
2948 | { "bnglr", XLOCB(19,BOF,CBGT,16,0), XLBOCBBB_MASK, PPCCOM, { CR } }, | 4062 | {"bdnzfla", BBO(16,BODNZF,1,1), BBOY_MASK, PPCCOM, PPCVLE, {BI, BDA}}, |
2949 | { "bnglr-", XLOCB(19,BOF,CBGT,16,0), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4063 | {"bdzf-", BBO(16,BODZF,0,0), BBOY_MASK, PPCCOM, ISA_V2|PPCVLE, {BI, BDM}}, |
2950 | { "bnglr-", XLOCB(19,BOFM4,CBGT,16,0), XLBOCBBB_MASK, POWER4, { CR } }, | 4064 | {"bdzf+", BBO(16,BODZF,0,0), BBOY_MASK, PPCCOM, ISA_V2|PPCVLE, {BI, BDP}}, |
2951 | { "bnglr+", XLOCB(19,BOFP,CBGT,16,0), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4065 | {"bdzf", BBO(16,BODZF,0,0), BBOY_MASK, PPCCOM, PPCVLE, {BI, BD}}, |
2952 | { "bnglr+", XLOCB(19,BOFP4,CBGT,16,0), XLBOCBBB_MASK, POWER4, { CR } }, | 4066 | {"bdzfl-", BBO(16,BODZF,0,1), BBOY_MASK, PPCCOM, ISA_V2|PPCVLE, {BI, BDM}}, |
2953 | { "bngr", XLOCB(19,BOF,CBGT,16,0), XLBOCBBB_MASK, PWRCOM, { CR } }, | 4067 | {"bdzfl+", BBO(16,BODZF,0,1), BBOY_MASK, PPCCOM, ISA_V2|PPCVLE, {BI, BDP}}, |
2954 | { "bnglrl", XLOCB(19,BOF,CBGT,16,1), XLBOCBBB_MASK, PPCCOM, { CR } }, | 4068 | {"bdzfl", BBO(16,BODZF,0,1), BBOY_MASK, PPCCOM, PPCVLE, {BI, BD}}, |
2955 | { "bnglrl-", XLOCB(19,BOF,CBGT,16,1), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4069 | {"bdzfa-", BBO(16,BODZF,1,0), BBOY_MASK, PPCCOM, ISA_V2|PPCVLE, {BI, BDMA}}, |
2956 | { "bnglrl-", XLOCB(19,BOFM4,CBGT,16,1), XLBOCBBB_MASK, POWER4, { CR } }, | 4070 | {"bdzfa+", BBO(16,BODZF,1,0), BBOY_MASK, PPCCOM, ISA_V2|PPCVLE, {BI, BDPA}}, |
2957 | { "bnglrl+", XLOCB(19,BOFP,CBGT,16,1), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4071 | {"bdzfa", BBO(16,BODZF,1,0), BBOY_MASK, PPCCOM, PPCVLE, {BI, BDA}}, |
2958 | { "bnglrl+", XLOCB(19,BOFP4,CBGT,16,1), XLBOCBBB_MASK, POWER4, { CR } }, | 4072 | {"bdzfla-", BBO(16,BODZF,1,1), BBOY_MASK, PPCCOM, ISA_V2|PPCVLE, {BI, BDMA}}, |
2959 | { "bngrl", XLOCB(19,BOF,CBGT,16,1), XLBOCBBB_MASK, PWRCOM, { CR } }, | 4073 | {"bdzfla+", BBO(16,BODZF,1,1), BBOY_MASK, PPCCOM, ISA_V2|PPCVLE, {BI, BDPA}}, |
2960 | { "bnelr", XLOCB(19,BOF,CBEQ,16,0), XLBOCBBB_MASK, PPCCOM, { CR } }, | 4074 | {"bdzfla", BBO(16,BODZF,1,1), BBOY_MASK, PPCCOM, PPCVLE, {BI, BDA}}, |
2961 | { "bnelr-", XLOCB(19,BOF,CBEQ,16,0), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4075 | |
2962 | { "bnelr-", XLOCB(19,BOFM4,CBEQ,16,0), XLBOCBBB_MASK, POWER4, { CR } }, | 4076 | {"bf-", BBO(16,BOF,0,0), BBOAT_MASK, PPCCOM, PPCVLE, {BI, BDM}}, |
2963 | { "bnelr+", XLOCB(19,BOFP,CBEQ,16,0), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4077 | {"bf+", BBO(16,BOF,0,0), BBOAT_MASK, PPCCOM, PPCVLE, {BI, BDP}}, |
2964 | { "bnelr+", XLOCB(19,BOFP4,CBEQ,16,0), XLBOCBBB_MASK, POWER4, { CR } }, | 4078 | {"bf", BBO(16,BOF,0,0), BBOAT_MASK, PPCCOM, PPCVLE, {BI, BD}}, |
2965 | { "bner", XLOCB(19,BOF,CBEQ,16,0), XLBOCBBB_MASK, PWRCOM, { CR } }, | 4079 | {"bbf", BBO(16,BOF,0,0), BBOAT_MASK, PWRCOM, PPCVLE, {BI, BD}}, |
2966 | { "bnelrl", XLOCB(19,BOF,CBEQ,16,1), XLBOCBBB_MASK, PPCCOM, { CR } }, | 4080 | {"bfl-", BBO(16,BOF,0,1), BBOAT_MASK, PPCCOM, PPCVLE, {BI, BDM}}, |
2967 | { "bnelrl-", XLOCB(19,BOF,CBEQ,16,1), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4081 | {"bfl+", BBO(16,BOF,0,1), BBOAT_MASK, PPCCOM, PPCVLE, {BI, BDP}}, |
2968 | { "bnelrl-", XLOCB(19,BOFM4,CBEQ,16,1), XLBOCBBB_MASK, POWER4, { CR } }, | 4082 | {"bfl", BBO(16,BOF,0,1), BBOAT_MASK, PPCCOM, PPCVLE, {BI, BD}}, |
2969 | { "bnelrl+", XLOCB(19,BOFP,CBEQ,16,1), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4083 | {"bbfl", BBO(16,BOF,0,1), BBOAT_MASK, PWRCOM, PPCVLE, {BI, BD}}, |
2970 | { "bnelrl+", XLOCB(19,BOFP4,CBEQ,16,1), XLBOCBBB_MASK, POWER4, { CR } }, | 4084 | {"bfa-", BBO(16,BOF,1,0), BBOAT_MASK, PPCCOM, PPCVLE, {BI, BDMA}}, |
2971 | { "bnerl", XLOCB(19,BOF,CBEQ,16,1), XLBOCBBB_MASK, PWRCOM, { CR } }, | 4085 | {"bfa+", BBO(16,BOF,1,0), BBOAT_MASK, PPCCOM, PPCVLE, {BI, BDPA}}, |
2972 | { "bnslr", XLOCB(19,BOF,CBSO,16,0), XLBOCBBB_MASK, PPCCOM, { CR } }, | 4086 | {"bfa", BBO(16,BOF,1,0), BBOAT_MASK, PPCCOM, PPCVLE, {BI, BDA}}, |
2973 | { "bnslr-", XLOCB(19,BOF,CBSO,16,0), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4087 | {"bbfa", BBO(16,BOF,1,0), BBOAT_MASK, PWRCOM, PPCVLE, {BI, BDA}}, |
2974 | { "bnslr-", XLOCB(19,BOFM4,CBSO,16,0), XLBOCBBB_MASK, POWER4, { CR } }, | 4088 | {"bfla-", BBO(16,BOF,1,1), BBOAT_MASK, PPCCOM, PPCVLE, {BI, BDMA}}, |
2975 | { "bnslr+", XLOCB(19,BOFP,CBSO,16,0), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4089 | {"bfla+", BBO(16,BOF,1,1), BBOAT_MASK, PPCCOM, PPCVLE, {BI, BDPA}}, |
2976 | { "bnslr+", XLOCB(19,BOFP4,CBSO,16,0), XLBOCBBB_MASK, POWER4, { CR } }, | 4090 | {"bfla", BBO(16,BOF,1,1), BBOAT_MASK, PPCCOM, PPCVLE, {BI, BDA}}, |
2977 | { "bnsr", XLOCB(19,BOF,CBSO,16,0), XLBOCBBB_MASK, PWRCOM, { CR } }, | 4091 | {"bbfla", BBO(16,BOF,1,1), BBOAT_MASK, PWRCOM, PPCVLE, {BI, BDA}}, |
2978 | { "bnslrl", XLOCB(19,BOF,CBSO,16,1), XLBOCBBB_MASK, PPCCOM, { CR } }, | 4092 | |
2979 | { "bnslrl-", XLOCB(19,BOF,CBSO,16,1), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4093 | {"bdnzt-", BBO(16,BODNZT,0,0), BBOY_MASK, PPCCOM, ISA_V2|PPCVLE, {BI, BDM}}, |
2980 | { "bnslrl-", XLOCB(19,BOFM4,CBSO,16,1), XLBOCBBB_MASK, POWER4, { CR } }, | 4094 | {"bdnzt+", BBO(16,BODNZT,0,0), BBOY_MASK, PPCCOM, ISA_V2|PPCVLE, {BI, BDP}}, |
2981 | { "bnslrl+", XLOCB(19,BOFP,CBSO,16,1), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4095 | {"bdnzt", BBO(16,BODNZT,0,0), BBOY_MASK, PPCCOM, PPCVLE, {BI, BD}}, |
2982 | { "bnslrl+", XLOCB(19,BOFP4,CBSO,16,1), XLBOCBBB_MASK, POWER4, { CR } }, | 4096 | {"bdnztl-", BBO(16,BODNZT,0,1), BBOY_MASK, PPCCOM, ISA_V2|PPCVLE, {BI, BDM}}, |
2983 | { "bnsrl", XLOCB(19,BOF,CBSO,16,1), XLBOCBBB_MASK, PWRCOM, { CR } }, | 4097 | {"bdnztl+", BBO(16,BODNZT,0,1), BBOY_MASK, PPCCOM, ISA_V2|PPCVLE, {BI, BDP}}, |
2984 | { "bnulr", XLOCB(19,BOF,CBSO,16,0), XLBOCBBB_MASK, PPCCOM, { CR } }, | 4098 | {"bdnztl", BBO(16,BODNZT,0,1), BBOY_MASK, PPCCOM, PPCVLE, {BI, BD}}, |
2985 | { "bnulr-", XLOCB(19,BOF,CBSO,16,0), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4099 | {"bdnzta-", BBO(16,BODNZT,1,0), BBOY_MASK, PPCCOM, ISA_V2|PPCVLE, {BI, BDMA}}, |
2986 | { "bnulr-", XLOCB(19,BOFM4,CBSO,16,0), XLBOCBBB_MASK, POWER4, { CR } }, | 4100 | {"bdnzta+", BBO(16,BODNZT,1,0), BBOY_MASK, PPCCOM, ISA_V2|PPCVLE, {BI, BDPA}}, |
2987 | { "bnulr+", XLOCB(19,BOFP,CBSO,16,0), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4101 | {"bdnzta", BBO(16,BODNZT,1,0), BBOY_MASK, PPCCOM, PPCVLE, {BI, BDA}}, |
2988 | { "bnulr+", XLOCB(19,BOFP4,CBSO,16,0), XLBOCBBB_MASK, POWER4, { CR } }, | 4102 | {"bdnztla-", BBO(16,BODNZT,1,1), BBOY_MASK, PPCCOM, ISA_V2|PPCVLE, {BI, BDMA}}, |
2989 | { "bnulrl", XLOCB(19,BOF,CBSO,16,1), XLBOCBBB_MASK, PPCCOM, { CR } }, | 4103 | {"bdnztla+", BBO(16,BODNZT,1,1), BBOY_MASK, PPCCOM, ISA_V2|PPCVLE, {BI, BDPA}}, |
2990 | { "bnulrl-", XLOCB(19,BOF,CBSO,16,1), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4104 | {"bdnztla", BBO(16,BODNZT,1,1), BBOY_MASK, PPCCOM, PPCVLE, {BI, BDA}}, |
2991 | { "bnulrl-", XLOCB(19,BOFM4,CBSO,16,1), XLBOCBBB_MASK, POWER4, { CR } }, | 4105 | {"bdzt-", BBO(16,BODZT,0,0), BBOY_MASK, PPCCOM, ISA_V2|PPCVLE, {BI, BDM}}, |
2992 | { "bnulrl+", XLOCB(19,BOFP,CBSO,16,1), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4106 | {"bdzt+", BBO(16,BODZT,0,0), BBOY_MASK, PPCCOM, ISA_V2|PPCVLE, {BI, BDP}}, |
2993 | { "bnulrl+", XLOCB(19,BOFP4,CBSO,16,1), XLBOCBBB_MASK, POWER4, { CR } }, | 4107 | {"bdzt", BBO(16,BODZT,0,0), BBOY_MASK, PPCCOM, PPCVLE, {BI, BD}}, |
2994 | { "btlr", XLO(19,BOT,16,0), XLBOBB_MASK, PPCCOM, { BI } }, | 4108 | {"bdztl-", BBO(16,BODZT,0,1), BBOY_MASK, PPCCOM, ISA_V2|PPCVLE, {BI, BDM}}, |
2995 | { "btlr-", XLO(19,BOT,16,0), XLBOBB_MASK, NOPOWER4, { BI } }, | 4109 | {"bdztl+", BBO(16,BODZT,0,1), BBOY_MASK, PPCCOM, ISA_V2|PPCVLE, {BI, BDP}}, |
2996 | { "btlr-", XLO(19,BOTM4,16,0), XLBOBB_MASK, POWER4, { BI } }, | 4110 | {"bdztl", BBO(16,BODZT,0,1), BBOY_MASK, PPCCOM, PPCVLE, {BI, BD}}, |
2997 | { "btlr+", XLO(19,BOTP,16,0), XLBOBB_MASK, NOPOWER4, { BI } }, | 4111 | {"bdzta-", BBO(16,BODZT,1,0), BBOY_MASK, PPCCOM, ISA_V2|PPCVLE, {BI, BDMA}}, |
2998 | { "btlr+", XLO(19,BOTP4,16,0), XLBOBB_MASK, POWER4, { BI } }, | 4112 | {"bdzta+", BBO(16,BODZT,1,0), BBOY_MASK, PPCCOM, ISA_V2|PPCVLE, {BI, BDPA}}, |
2999 | { "bbtr", XLO(19,BOT,16,0), XLBOBB_MASK, PWRCOM, { BI } }, | 4113 | {"bdzta", BBO(16,BODZT,1,0), BBOY_MASK, PPCCOM, PPCVLE, {BI, BDA}}, |
3000 | { "btlrl", XLO(19,BOT,16,1), XLBOBB_MASK, PPCCOM, { BI } }, | 4114 | {"bdztla-", BBO(16,BODZT,1,1), BBOY_MASK, PPCCOM, ISA_V2|PPCVLE, {BI, BDMA}}, |
3001 | { "btlrl-", XLO(19,BOT,16,1), XLBOBB_MASK, NOPOWER4, { BI } }, | 4115 | {"bdztla+", BBO(16,BODZT,1,1), BBOY_MASK, PPCCOM, ISA_V2|PPCVLE, {BI, BDPA}}, |
3002 | { "btlrl-", XLO(19,BOTM4,16,1), XLBOBB_MASK, POWER4, { BI } }, | 4116 | {"bdztla", BBO(16,BODZT,1,1), BBOY_MASK, PPCCOM, PPCVLE, {BI, BDA}}, |
3003 | { "btlrl+", XLO(19,BOTP,16,1), XLBOBB_MASK, NOPOWER4, { BI } }, | 4117 | |
3004 | { "btlrl+", XLO(19,BOTP4,16,1), XLBOBB_MASK, POWER4, { BI } }, | 4118 | {"bt-", BBO(16,BOT,0,0), BBOAT_MASK, PPCCOM, PPCVLE, {BI, BDM}}, |
3005 | { "bbtrl", XLO(19,BOT,16,1), XLBOBB_MASK, PWRCOM, { BI } }, | 4119 | {"bt+", BBO(16,BOT,0,0), BBOAT_MASK, PPCCOM, PPCVLE, {BI, BDP}}, |
3006 | { "bflr", XLO(19,BOF,16,0), XLBOBB_MASK, PPCCOM, { BI } }, | 4120 | {"bt", BBO(16,BOT,0,0), BBOAT_MASK, PPCCOM, PPCVLE, {BI, BD}}, |
3007 | { "bflr-", XLO(19,BOF,16,0), XLBOBB_MASK, NOPOWER4, { BI } }, | 4121 | {"bbt", BBO(16,BOT,0,0), BBOAT_MASK, PWRCOM, PPCVLE, {BI, BD}}, |
3008 | { "bflr-", XLO(19,BOFM4,16,0), XLBOBB_MASK, POWER4, { BI } }, | 4122 | {"btl-", BBO(16,BOT,0,1), BBOAT_MASK, PPCCOM, PPCVLE, {BI, BDM}}, |
3009 | { "bflr+", XLO(19,BOFP,16,0), XLBOBB_MASK, NOPOWER4, { BI } }, | 4123 | {"btl+", BBO(16,BOT,0,1), BBOAT_MASK, PPCCOM, PPCVLE, {BI, BDP}}, |
3010 | { "bflr+", XLO(19,BOFP4,16,0), XLBOBB_MASK, POWER4, { BI } }, | 4124 | {"btl", BBO(16,BOT,0,1), BBOAT_MASK, PPCCOM, PPCVLE, {BI, BD}}, |
3011 | { "bbfr", XLO(19,BOF,16,0), XLBOBB_MASK, PWRCOM, { BI } }, | 4125 | {"bbtl", BBO(16,BOT,0,1), BBOAT_MASK, PWRCOM, PPCVLE, {BI, BD}}, |
3012 | { "bflrl", XLO(19,BOF,16,1), XLBOBB_MASK, PPCCOM, { BI } }, | 4126 | {"bta-", BBO(16,BOT,1,0), BBOAT_MASK, PPCCOM, PPCVLE, {BI, BDMA}}, |
3013 | { "bflrl-", XLO(19,BOF,16,1), XLBOBB_MASK, NOPOWER4, { BI } }, | 4127 | {"bta+", BBO(16,BOT,1,0), BBOAT_MASK, PPCCOM, PPCVLE, {BI, BDPA}}, |
3014 | { "bflrl-", XLO(19,BOFM4,16,1), XLBOBB_MASK, POWER4, { BI } }, | 4128 | {"bta", BBO(16,BOT,1,0), BBOAT_MASK, PPCCOM, PPCVLE, {BI, BDA}}, |
3015 | { "bflrl+", XLO(19,BOFP,16,1), XLBOBB_MASK, NOPOWER4, { BI } }, | 4129 | {"bbta", BBO(16,BOT,1,0), BBOAT_MASK, PWRCOM, PPCVLE, {BI, BDA}}, |
3016 | { "bflrl+", XLO(19,BOFP4,16,1), XLBOBB_MASK, POWER4, { BI } }, | 4130 | {"btla-", BBO(16,BOT,1,1), BBOAT_MASK, PPCCOM, PPCVLE, {BI, BDMA}}, |
3017 | { "bbfrl", XLO(19,BOF,16,1), XLBOBB_MASK, PWRCOM, { BI } }, | 4131 | {"btla+", BBO(16,BOT,1,1), BBOAT_MASK, PPCCOM, PPCVLE, {BI, BDPA}}, |
3018 | { "bdnztlr", XLO(19,BODNZT,16,0), XLBOBB_MASK, PPCCOM, { BI } }, | 4132 | {"btla", BBO(16,BOT,1,1), BBOAT_MASK, PPCCOM, PPCVLE, {BI, BDA}}, |
3019 | { "bdnztlr-",XLO(19,BODNZT,16,0), XLBOBB_MASK, NOPOWER4, { BI } }, | 4133 | {"bbtla", BBO(16,BOT,1,1), BBOAT_MASK, PWRCOM, PPCVLE, {BI, BDA}}, |
3020 | { "bdnztlr+",XLO(19,BODNZTP,16,0), XLBOBB_MASK, NOPOWER4, { BI } }, | 4134 | |
3021 | { "bdnztlrl",XLO(19,BODNZT,16,1), XLBOBB_MASK, PPCCOM, { BI } }, | 4135 | {"bc-", B(16,0,0), B_MASK, PPCCOM, PPCVLE, {BOE, BI, BDM}}, |
3022 | { "bdnztlrl-",XLO(19,BODNZT,16,1), XLBOBB_MASK, NOPOWER4, { BI } }, | 4136 | {"bc+", B(16,0,0), B_MASK, PPCCOM, PPCVLE, {BOE, BI, BDP}}, |
3023 | { "bdnztlrl+",XLO(19,BODNZTP,16,1), XLBOBB_MASK, NOPOWER4, { BI } }, | 4137 | {"bc", B(16,0,0), B_MASK, COM, PPCVLE, {BO, BI, BD}}, |
3024 | { "bdnzflr", XLO(19,BODNZF,16,0), XLBOBB_MASK, PPCCOM, { BI } }, | 4138 | {"bcl-", B(16,0,1), B_MASK, PPCCOM, PPCVLE, {BOE, BI, BDM}}, |
3025 | { "bdnzflr-",XLO(19,BODNZF,16,0), XLBOBB_MASK, NOPOWER4, { BI } }, | 4139 | {"bcl+", B(16,0,1), B_MASK, PPCCOM, PPCVLE, {BOE, BI, BDP}}, |
3026 | { "bdnzflr+",XLO(19,BODNZFP,16,0), XLBOBB_MASK, NOPOWER4, { BI } }, | 4140 | {"bcl", B(16,0,1), B_MASK, COM, PPCVLE, {BO, BI, BD}}, |
3027 | { "bdnzflrl",XLO(19,BODNZF,16,1), XLBOBB_MASK, PPCCOM, { BI } }, | 4141 | {"bca-", B(16,1,0), B_MASK, PPCCOM, PPCVLE, {BOE, BI, BDMA}}, |
3028 | { "bdnzflrl-",XLO(19,BODNZF,16,1), XLBOBB_MASK, NOPOWER4, { BI } }, | 4142 | {"bca+", B(16,1,0), B_MASK, PPCCOM, PPCVLE, {BOE, BI, BDPA}}, |
3029 | { "bdnzflrl+",XLO(19,BODNZFP,16,1), XLBOBB_MASK, NOPOWER4, { BI } }, | 4143 | {"bca", B(16,1,0), B_MASK, COM, PPCVLE, {BO, BI, BDA}}, |
3030 | { "bdztlr", XLO(19,BODZT,16,0), XLBOBB_MASK, PPCCOM, { BI } }, | 4144 | {"bcla-", B(16,1,1), B_MASK, PPCCOM, PPCVLE, {BOE, BI, BDMA}}, |
3031 | { "bdztlr-", XLO(19,BODZT,16,0), XLBOBB_MASK, NOPOWER4, { BI } }, | 4145 | {"bcla+", B(16,1,1), B_MASK, PPCCOM, PPCVLE, {BOE, BI, BDPA}}, |
3032 | { "bdztlr+", XLO(19,BODZTP,16,0), XLBOBB_MASK, NOPOWER4, { BI } }, | 4146 | {"bcla", B(16,1,1), B_MASK, COM, PPCVLE, {BO, BI, BDA}}, |
3033 | { "bdztlrl", XLO(19,BODZT,16,1), XLBOBB_MASK, PPCCOM, { BI } }, | 4147 | |
3034 | { "bdztlrl-",XLO(19,BODZT,16,1), XLBOBB_MASK, NOPOWER4, { BI } }, | 4148 | {"svc", SC(17,0,0), SC_MASK, POWER, PPCVLE, {SVC_LEV, FL1, FL2}}, |
3035 | { "bdztlrl+",XLO(19,BODZTP,16,1), XLBOBB_MASK, NOPOWER4, { BI } }, | 4149 | {"svcl", SC(17,0,1), SC_MASK, POWER, PPCVLE, {SVC_LEV, FL1, FL2}}, |
3036 | { "bdzflr", XLO(19,BODZF,16,0), XLBOBB_MASK, PPCCOM, { BI } }, | 4150 | {"sc", SC(17,1,0), SC_MASK, PPC, PPCVLE, {LEV}}, |
3037 | { "bdzflr-", XLO(19,BODZF,16,0), XLBOBB_MASK, NOPOWER4, { BI } }, | 4151 | {"svca", SC(17,1,0), SC_MASK, PWRCOM, PPCVLE, {SV}}, |
3038 | { "bdzflr+", XLO(19,BODZFP,16,0), XLBOBB_MASK, NOPOWER4, { BI } }, | 4152 | {"svcla", SC(17,1,1), SC_MASK, POWER, PPCVLE, {SV}}, |
3039 | { "bdzflrl", XLO(19,BODZF,16,1), XLBOBB_MASK, PPCCOM, { BI } }, | 4153 | |
3040 | { "bdzflrl-",XLO(19,BODZF,16,1), XLBOBB_MASK, NOPOWER4, { BI } }, | 4154 | {"b", B(18,0,0), B_MASK, COM, PPCVLE, {LI}}, |
3041 | { "bdzflrl+",XLO(19,BODZFP,16,1), XLBOBB_MASK, NOPOWER4, { BI } }, | 4155 | {"bl", B(18,0,1), B_MASK, COM, PPCVLE, {LI}}, |
3042 | { "bclr+", XLYLK(19,16,1,0), XLYBB_MASK, PPCCOM, { BOE, BI } }, | 4156 | {"ba", B(18,1,0), B_MASK, COM, PPCVLE, {LIA}}, |
3043 | { "bclrl+", XLYLK(19,16,1,1), XLYBB_MASK, PPCCOM, { BOE, BI } }, | 4157 | {"bla", B(18,1,1), B_MASK, COM, PPCVLE, {LIA}}, |
3044 | { "bclr-", XLYLK(19,16,0,0), XLYBB_MASK, PPCCOM, { BOE, BI } }, | 4158 | |
3045 | { "bclrl-", XLYLK(19,16,0,1), XLYBB_MASK, PPCCOM, { BOE, BI } }, | 4159 | {"mcrf", XL(19,0), XLBB_MASK|(3<<21)|(3<<16), COM, PPCVLE, {BF, BFA}}, |
3046 | { "bclr", XLLK(19,16,0), XLBH_MASK, PPCCOM, { BO, BI, BH } }, | 4160 | |
3047 | { "bclrl", XLLK(19,16,1), XLBH_MASK, PPCCOM, { BO, BI, BH } }, | 4161 | {"addpcis", DX(19,2), DX_MASK, POWER9, PPCVLE, {RT, DXD}}, |
3048 | { "bcr", XLLK(19,16,0), XLBB_MASK, PWRCOM, { BO, BI } }, | 4162 | {"subpcis", DX(19,2), DX_MASK, POWER9, PPCVLE, {RT, NDXD}}, |
3049 | { "bcrl", XLLK(19,16,1), XLBB_MASK, PWRCOM, { BO, BI } }, | 4163 | |
3050 | { "bclre", XLLK(19,17,0), XLBB_MASK, BOOKE64, { BO, BI } }, | 4164 | {"bdnzlr", XLO(19,BODNZ,16,0), XLBOBIBB_MASK, PPCCOM, PPCVLE, {0}}, |
3051 | { "bclrel", XLLK(19,17,1), XLBB_MASK, BOOKE64, { BO, BI } }, | 4165 | {"bdnzlr-", XLO(19,BODNZ,16,0), XLBOBIBB_MASK, PPCCOM, ISA_V2|PPCVLE, {0}}, |
3052 | 4166 | {"bdnzlrl", XLO(19,BODNZ,16,1), XLBOBIBB_MASK, PPCCOM, PPCVLE, {0}}, | |
3053 | { "rfid", XL(19,18), 0xffffffff, PPC64, { 0 } }, | 4167 | {"bdnzlrl-", XLO(19,BODNZ,16,1), XLBOBIBB_MASK, PPCCOM, ISA_V2|PPCVLE, {0}}, |
3054 | 4168 | {"bdnzlr+", XLO(19,BODNZP,16,0), XLBOBIBB_MASK, PPCCOM, ISA_V2|PPCVLE, {0}}, | |
3055 | { "crnot", XL(19,33), XL_MASK, PPCCOM, { BT, BA, BBA } }, | 4169 | {"bdnzlrl+", XLO(19,BODNZP,16,1), XLBOBIBB_MASK, PPCCOM, ISA_V2|PPCVLE, {0}}, |
3056 | { "crnor", XL(19,33), XL_MASK, COM, { BT, BA, BB } }, | 4170 | {"bdzlr", XLO(19,BODZ,16,0), XLBOBIBB_MASK, PPCCOM, PPCVLE, {0}}, |
3057 | { "rfmci", X(19,38), 0xffffffff, PPCRFMCI, { 0 } }, | 4171 | {"bdzlr-", XLO(19,BODZ,16,0), XLBOBIBB_MASK, PPCCOM, ISA_V2|PPCVLE, {0}}, |
3058 | 4172 | {"bdzlrl", XLO(19,BODZ,16,1), XLBOBIBB_MASK, PPCCOM, PPCVLE, {0}}, | |
3059 | { "rfi", XL(19,50), 0xffffffff, COM, { 0 } }, | 4173 | {"bdzlrl-", XLO(19,BODZ,16,1), XLBOBIBB_MASK, PPCCOM, ISA_V2|PPCVLE, {0}}, |
3060 | { "rfci", XL(19,51), 0xffffffff, PPC403 | BOOKE, { 0 } }, | 4174 | {"bdzlr+", XLO(19,BODZP,16,0), XLBOBIBB_MASK, PPCCOM, ISA_V2|PPCVLE, {0}}, |
3061 | 4175 | {"bdzlrl+", XLO(19,BODZP,16,1), XLBOBIBB_MASK, PPCCOM, ISA_V2|PPCVLE, {0}}, | |
3062 | { "rfsvc", XL(19,82), 0xffffffff, POWER, { 0 } }, | 4176 | {"blr", XLO(19,BOU,16,0), XLBOBIBB_MASK, PPCCOM, PPCVLE, {0}}, |
3063 | 4177 | {"br", XLO(19,BOU,16,0), XLBOBIBB_MASK, PWRCOM, PPCVLE, {0}}, | |
3064 | { "crandc", XL(19,129), XL_MASK, COM, { BT, BA, BB } }, | 4178 | {"blrl", XLO(19,BOU,16,1), XLBOBIBB_MASK, PPCCOM, PPCVLE, {0}}, |
3065 | 4179 | {"brl", XLO(19,BOU,16,1), XLBOBIBB_MASK, PWRCOM, PPCVLE, {0}}, | |
3066 | { "isync", XL(19,150), 0xffffffff, PPCCOM, { 0 } }, | 4180 | {"bdnzlr-", XLO(19,BODNZM4,16,0), XLBOBIBB_MASK, ISA_V2, PPCVLE, {0}}, |
3067 | { "ics", XL(19,150), 0xffffffff, PWRCOM, { 0 } }, | 4181 | {"bdnzlrl-", XLO(19,BODNZM4,16,1), XLBOBIBB_MASK, ISA_V2, PPCVLE, {0}}, |
3068 | 4182 | {"bdnzlr+", XLO(19,BODNZP4,16,0), XLBOBIBB_MASK, ISA_V2, PPCVLE, {0}}, | |
3069 | { "crclr", XL(19,193), XL_MASK, PPCCOM, { BT, BAT, BBA } }, | 4183 | {"bdnzlrl+", XLO(19,BODNZP4,16,1), XLBOBIBB_MASK, ISA_V2, PPCVLE, {0}}, |
3070 | { "crxor", XL(19,193), XL_MASK, COM, { BT, BA, BB } }, | 4184 | {"bdzlr-", XLO(19,BODZM4,16,0), XLBOBIBB_MASK, ISA_V2, PPCVLE, {0}}, |
3071 | 4185 | {"bdzlrl-", XLO(19,BODZM4,16,1), XLBOBIBB_MASK, ISA_V2, PPCVLE, {0}}, | |
3072 | { "crnand", XL(19,225), XL_MASK, COM, { BT, BA, BB } }, | 4186 | {"bdzlr+", XLO(19,BODZP4,16,0), XLBOBIBB_MASK, ISA_V2, PPCVLE, {0}}, |
3073 | 4187 | {"bdzlrl+", XLO(19,BODZP4,16,1), XLBOBIBB_MASK, ISA_V2, PPCVLE, {0}}, | |
3074 | { "crand", XL(19,257), XL_MASK, COM, { BT, BA, BB } }, | 4188 | |
3075 | 4189 | {"bgelr", XLOCB(19,BOF,CBLT,16,0), XLBOCBBB_MASK, PPCCOM, PPCVLE, {CR}}, | |
3076 | { "hrfid", XL(19,274), 0xffffffff, POWER5 | CELL, { 0 } }, | 4190 | {"bgelr-", XLOCB(19,BOF,CBLT,16,0), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3077 | 4191 | {"bger", XLOCB(19,BOF,CBLT,16,0), XLBOCBBB_MASK, PWRCOM, PPCVLE, {CR}}, | |
3078 | { "crset", XL(19,289), XL_MASK, PPCCOM, { BT, BAT, BBA } }, | 4192 | {"bnllr", XLOCB(19,BOF,CBLT,16,0), XLBOCBBB_MASK, PPCCOM, PPCVLE, {CR}}, |
3079 | { "creqv", XL(19,289), XL_MASK, COM, { BT, BA, BB } }, | 4193 | {"bnllr-", XLOCB(19,BOF,CBLT,16,0), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3080 | 4194 | {"bnlr", XLOCB(19,BOF,CBLT,16,0), XLBOCBBB_MASK, PWRCOM, PPCVLE, {CR}}, | |
3081 | { "doze", XL(19,402), 0xffffffff, POWER6, { 0 } }, | 4195 | {"bgelrl", XLOCB(19,BOF,CBLT,16,1), XLBOCBBB_MASK, PPCCOM, PPCVLE, {CR}}, |
3082 | 4196 | {"bgelrl-", XLOCB(19,BOF,CBLT,16,1), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, | |
3083 | { "crorc", XL(19,417), XL_MASK, COM, { BT, BA, BB } }, | 4197 | {"bgerl", XLOCB(19,BOF,CBLT,16,1), XLBOCBBB_MASK, PWRCOM, PPCVLE, {CR}}, |
3084 | 4198 | {"bnllrl", XLOCB(19,BOF,CBLT,16,1), XLBOCBBB_MASK, PPCCOM, PPCVLE, {CR}}, | |
3085 | { "nap", XL(19,434), 0xffffffff, POWER6, { 0 } }, | 4199 | {"bnllrl-", XLOCB(19,BOF,CBLT,16,1), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3086 | 4200 | {"bnlrl", XLOCB(19,BOF,CBLT,16,1), XLBOCBBB_MASK, PWRCOM, PPCVLE, {CR}}, | |
3087 | { "crmove", XL(19,449), XL_MASK, PPCCOM, { BT, BA, BBA } }, | 4201 | {"blelr", XLOCB(19,BOF,CBGT,16,0), XLBOCBBB_MASK, PPCCOM, PPCVLE, {CR}}, |
3088 | { "cror", XL(19,449), XL_MASK, COM, { BT, BA, BB } }, | 4202 | {"blelr-", XLOCB(19,BOF,CBGT,16,0), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3089 | 4203 | {"bler", XLOCB(19,BOF,CBGT,16,0), XLBOCBBB_MASK, PWRCOM, PPCVLE, {CR}}, | |
3090 | { "sleep", XL(19,466), 0xffffffff, POWER6, { 0 } }, | 4204 | {"bnglr", XLOCB(19,BOF,CBGT,16,0), XLBOCBBB_MASK, PPCCOM, PPCVLE, {CR}}, |
3091 | { "rvwinkle", XL(19,498), 0xffffffff, POWER6, { 0 } }, | 4205 | {"bnglr-", XLOCB(19,BOF,CBGT,16,0), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3092 | 4206 | {"bngr", XLOCB(19,BOF,CBGT,16,0), XLBOCBBB_MASK, PWRCOM, PPCVLE, {CR}}, | |
3093 | { "bctr", XLO(19,BOU,528,0), XLBOBIBB_MASK, COM, { 0 } }, | 4207 | {"blelrl", XLOCB(19,BOF,CBGT,16,1), XLBOCBBB_MASK, PPCCOM, PPCVLE, {CR}}, |
3094 | { "bctrl", XLO(19,BOU,528,1), XLBOBIBB_MASK, COM, { 0 } }, | 4208 | {"blelrl-", XLOCB(19,BOF,CBGT,16,1), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3095 | { "bltctr", XLOCB(19,BOT,CBLT,528,0), XLBOCBBB_MASK, PPCCOM, { CR } }, | 4209 | {"blerl", XLOCB(19,BOF,CBGT,16,1), XLBOCBBB_MASK, PWRCOM, PPCVLE, {CR}}, |
3096 | { "bltctr-", XLOCB(19,BOT,CBLT,528,0), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4210 | {"bnglrl", XLOCB(19,BOF,CBGT,16,1), XLBOCBBB_MASK, PPCCOM, PPCVLE, {CR}}, |
3097 | { "bltctr-", XLOCB(19,BOTM4,CBLT,528,0), XLBOCBBB_MASK, POWER4, { CR } }, | 4211 | {"bnglrl-", XLOCB(19,BOF,CBGT,16,1), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3098 | { "bltctr+", XLOCB(19,BOTP,CBLT,528,0), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4212 | {"bngrl", XLOCB(19,BOF,CBGT,16,1), XLBOCBBB_MASK, PWRCOM, PPCVLE, {CR}}, |
3099 | { "bltctr+", XLOCB(19,BOTP4,CBLT,528,0), XLBOCBBB_MASK, POWER4, { CR } }, | 4213 | {"bnelr", XLOCB(19,BOF,CBEQ,16,0), XLBOCBBB_MASK, PPCCOM, PPCVLE, {CR}}, |
3100 | { "bltctrl", XLOCB(19,BOT,CBLT,528,1), XLBOCBBB_MASK, PPCCOM, { CR } }, | 4214 | {"bnelr-", XLOCB(19,BOF,CBEQ,16,0), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3101 | { "bltctrl-",XLOCB(19,BOT,CBLT,528,1), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4215 | {"bner", XLOCB(19,BOF,CBEQ,16,0), XLBOCBBB_MASK, PWRCOM, PPCVLE, {CR}}, |
3102 | { "bltctrl-",XLOCB(19,BOTM4,CBLT,528,1), XLBOCBBB_MASK, POWER4, { CR } }, | 4216 | {"bnelrl", XLOCB(19,BOF,CBEQ,16,1), XLBOCBBB_MASK, PPCCOM, PPCVLE, {CR}}, |
3103 | { "bltctrl+",XLOCB(19,BOTP,CBLT,528,1), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4217 | {"bnelrl-", XLOCB(19,BOF,CBEQ,16,1), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3104 | { "bltctrl+",XLOCB(19,BOTP4,CBLT,528,1), XLBOCBBB_MASK, POWER4, { CR } }, | 4218 | {"bnerl", XLOCB(19,BOF,CBEQ,16,1), XLBOCBBB_MASK, PWRCOM, PPCVLE, {CR}}, |
3105 | { "bgtctr", XLOCB(19,BOT,CBGT,528,0), XLBOCBBB_MASK, PPCCOM, { CR } }, | 4219 | {"bnslr", XLOCB(19,BOF,CBSO,16,0), XLBOCBBB_MASK, PPCCOM, PPCVLE, {CR}}, |
3106 | { "bgtctr-", XLOCB(19,BOT,CBGT,528,0), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4220 | {"bnslr-", XLOCB(19,BOF,CBSO,16,0), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3107 | { "bgtctr-", XLOCB(19,BOTM4,CBGT,528,0), XLBOCBBB_MASK, POWER4, { CR } }, | 4221 | {"bnsr", XLOCB(19,BOF,CBSO,16,0), XLBOCBBB_MASK, PWRCOM, PPCVLE, {CR}}, |
3108 | { "bgtctr+", XLOCB(19,BOTP,CBGT,528,0), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4222 | {"bnulr", XLOCB(19,BOF,CBSO,16,0), XLBOCBBB_MASK, PPCCOM, PPCVLE, {CR}}, |
3109 | { "bgtctr+", XLOCB(19,BOTP4,CBGT,528,0), XLBOCBBB_MASK, POWER4, { CR } }, | 4223 | {"bnulr-", XLOCB(19,BOF,CBSO,16,0), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3110 | { "bgtctrl", XLOCB(19,BOT,CBGT,528,1), XLBOCBBB_MASK, PPCCOM, { CR } }, | 4224 | {"bnslrl", XLOCB(19,BOF,CBSO,16,1), XLBOCBBB_MASK, PPCCOM, PPCVLE, {CR}}, |
3111 | { "bgtctrl-",XLOCB(19,BOT,CBGT,528,1), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4225 | {"bnslrl-", XLOCB(19,BOF,CBSO,16,1), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3112 | { "bgtctrl-",XLOCB(19,BOTM4,CBGT,528,1), XLBOCBBB_MASK, POWER4, { CR } }, | 4226 | {"bnsrl", XLOCB(19,BOF,CBSO,16,1), XLBOCBBB_MASK, PWRCOM, PPCVLE, {CR}}, |
3113 | { "bgtctrl+",XLOCB(19,BOTP,CBGT,528,1), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4227 | {"bnulrl", XLOCB(19,BOF,CBSO,16,1), XLBOCBBB_MASK, PPCCOM, PPCVLE, {CR}}, |
3114 | { "bgtctrl+",XLOCB(19,BOTP4,CBGT,528,1), XLBOCBBB_MASK, POWER4, { CR } }, | 4228 | {"bnulrl-", XLOCB(19,BOF,CBSO,16,1), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3115 | { "beqctr", XLOCB(19,BOT,CBEQ,528,0), XLBOCBBB_MASK, PPCCOM, { CR } }, | 4229 | {"bgelr+", XLOCB(19,BOFP,CBLT,16,0), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3116 | { "beqctr-", XLOCB(19,BOT,CBEQ,528,0), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4230 | {"bnllr+", XLOCB(19,BOFP,CBLT,16,0), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3117 | { "beqctr-", XLOCB(19,BOTM4,CBEQ,528,0), XLBOCBBB_MASK, POWER4, { CR } }, | 4231 | {"bgelrl+", XLOCB(19,BOFP,CBLT,16,1), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3118 | { "beqctr+", XLOCB(19,BOTP,CBEQ,528,0), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4232 | {"bnllrl+", XLOCB(19,BOFP,CBLT,16,1), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3119 | { "beqctr+", XLOCB(19,BOTP4,CBEQ,528,0), XLBOCBBB_MASK, POWER4, { CR } }, | 4233 | {"blelr+", XLOCB(19,BOFP,CBGT,16,0), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3120 | { "beqctrl", XLOCB(19,BOT,CBEQ,528,1), XLBOCBBB_MASK, PPCCOM, { CR } }, | 4234 | {"bnglr+", XLOCB(19,BOFP,CBGT,16,0), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3121 | { "beqctrl-",XLOCB(19,BOT,CBEQ,528,1), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4235 | {"blelrl+", XLOCB(19,BOFP,CBGT,16,1), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3122 | { "beqctrl-",XLOCB(19,BOTM4,CBEQ,528,1), XLBOCBBB_MASK, POWER4, { CR } }, | 4236 | {"bnglrl+", XLOCB(19,BOFP,CBGT,16,1), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3123 | { "beqctrl+",XLOCB(19,BOTP,CBEQ,528,1), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4237 | {"bnelr+", XLOCB(19,BOFP,CBEQ,16,0), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3124 | { "beqctrl+",XLOCB(19,BOTP4,CBEQ,528,1), XLBOCBBB_MASK, POWER4, { CR } }, | 4238 | {"bnelrl+", XLOCB(19,BOFP,CBEQ,16,1), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3125 | { "bsoctr", XLOCB(19,BOT,CBSO,528,0), XLBOCBBB_MASK, PPCCOM, { CR } }, | 4239 | {"bnslr+", XLOCB(19,BOFP,CBSO,16,0), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3126 | { "bsoctr-", XLOCB(19,BOT,CBSO,528,0), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4240 | {"bnulr+", XLOCB(19,BOFP,CBSO,16,0), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3127 | { "bsoctr-", XLOCB(19,BOTM4,CBSO,528,0), XLBOCBBB_MASK, POWER4, { CR } }, | 4241 | {"bnslrl+", XLOCB(19,BOFP,CBSO,16,1), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3128 | { "bsoctr+", XLOCB(19,BOTP,CBSO,528,0), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4242 | {"bnulrl+", XLOCB(19,BOFP,CBSO,16,1), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3129 | { "bsoctr+", XLOCB(19,BOTP4,CBSO,528,0), XLBOCBBB_MASK, POWER4, { CR } }, | 4243 | {"bgelr-", XLOCB(19,BOFM4,CBLT,16,0), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3130 | { "bsoctrl", XLOCB(19,BOT,CBSO,528,1), XLBOCBBB_MASK, PPCCOM, { CR } }, | 4244 | {"bnllr-", XLOCB(19,BOFM4,CBLT,16,0), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3131 | { "bsoctrl-",XLOCB(19,BOT,CBSO,528,1), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4245 | {"bgelrl-", XLOCB(19,BOFM4,CBLT,16,1), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3132 | { "bsoctrl-",XLOCB(19,BOTM4,CBSO,528,1), XLBOCBBB_MASK, POWER4, { CR } }, | 4246 | {"bnllrl-", XLOCB(19,BOFM4,CBLT,16,1), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3133 | { "bsoctrl+",XLOCB(19,BOTP,CBSO,528,1), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4247 | {"blelr-", XLOCB(19,BOFM4,CBGT,16,0), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3134 | { "bsoctrl+",XLOCB(19,BOTP4,CBSO,528,1), XLBOCBBB_MASK, POWER4, { CR } }, | 4248 | {"bnglr-", XLOCB(19,BOFM4,CBGT,16,0), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3135 | { "bunctr", XLOCB(19,BOT,CBSO,528,0), XLBOCBBB_MASK, PPCCOM, { CR } }, | 4249 | {"blelrl-", XLOCB(19,BOFM4,CBGT,16,1), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3136 | { "bunctr-", XLOCB(19,BOT,CBSO,528,0), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4250 | {"bnglrl-", XLOCB(19,BOFM4,CBGT,16,1), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3137 | { "bunctr-", XLOCB(19,BOTM4,CBSO,528,0), XLBOCBBB_MASK, POWER4, { CR } }, | 4251 | {"bnelr-", XLOCB(19,BOFM4,CBEQ,16,0), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3138 | { "bunctr+", XLOCB(19,BOTP,CBSO,528,0), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4252 | {"bnelrl-", XLOCB(19,BOFM4,CBEQ,16,1), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3139 | { "bunctr+", XLOCB(19,BOTP4,CBSO,528,0), XLBOCBBB_MASK, POWER4, { CR } }, | 4253 | {"bnslr-", XLOCB(19,BOFM4,CBSO,16,0), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3140 | { "bunctrl", XLOCB(19,BOT,CBSO,528,1), XLBOCBBB_MASK, PPCCOM, { CR } }, | 4254 | {"bnulr-", XLOCB(19,BOFM4,CBSO,16,0), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3141 | { "bunctrl-",XLOCB(19,BOT,CBSO,528,1), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4255 | {"bnslrl-", XLOCB(19,BOFM4,CBSO,16,1), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3142 | { "bunctrl-",XLOCB(19,BOTM4,CBSO,528,1), XLBOCBBB_MASK, POWER4, { CR } }, | 4256 | {"bnulrl-", XLOCB(19,BOFM4,CBSO,16,1), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3143 | { "bunctrl+",XLOCB(19,BOTP,CBSO,528,1), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4257 | {"bgelr+", XLOCB(19,BOFP4,CBLT,16,0), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3144 | { "bunctrl+",XLOCB(19,BOTP4,CBSO,528,1), XLBOCBBB_MASK, POWER4, { CR } }, | 4258 | {"bnllr+", XLOCB(19,BOFP4,CBLT,16,0), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3145 | { "bgectr", XLOCB(19,BOF,CBLT,528,0), XLBOCBBB_MASK, PPCCOM, { CR } }, | 4259 | {"bgelrl+", XLOCB(19,BOFP4,CBLT,16,1), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3146 | { "bgectr-", XLOCB(19,BOF,CBLT,528,0), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4260 | {"bnllrl+", XLOCB(19,BOFP4,CBLT,16,1), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3147 | { "bgectr-", XLOCB(19,BOFM4,CBLT,528,0), XLBOCBBB_MASK, POWER4, { CR } }, | 4261 | {"blelr+", XLOCB(19,BOFP4,CBGT,16,0), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3148 | { "bgectr+", XLOCB(19,BOFP,CBLT,528,0), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4262 | {"bnglr+", XLOCB(19,BOFP4,CBGT,16,0), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3149 | { "bgectr+", XLOCB(19,BOFP4,CBLT,528,0), XLBOCBBB_MASK, POWER4, { CR } }, | 4263 | {"blelrl+", XLOCB(19,BOFP4,CBGT,16,1), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3150 | { "bgectrl", XLOCB(19,BOF,CBLT,528,1), XLBOCBBB_MASK, PPCCOM, { CR } }, | 4264 | {"bnglrl+", XLOCB(19,BOFP4,CBGT,16,1), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3151 | { "bgectrl-",XLOCB(19,BOF,CBLT,528,1), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4265 | {"bnelr+", XLOCB(19,BOFP4,CBEQ,16,0), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3152 | { "bgectrl-",XLOCB(19,BOFM4,CBLT,528,1), XLBOCBBB_MASK, POWER4, { CR } }, | 4266 | {"bnelrl+", XLOCB(19,BOFP4,CBEQ,16,1), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3153 | { "bgectrl+",XLOCB(19,BOFP,CBLT,528,1), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4267 | {"bnslr+", XLOCB(19,BOFP4,CBSO,16,0), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3154 | { "bgectrl+",XLOCB(19,BOFP4,CBLT,528,1), XLBOCBBB_MASK, POWER4, { CR } }, | 4268 | {"bnulr+", XLOCB(19,BOFP4,CBSO,16,0), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3155 | { "bnlctr", XLOCB(19,BOF,CBLT,528,0), XLBOCBBB_MASK, PPCCOM, { CR } }, | 4269 | {"bnslrl+", XLOCB(19,BOFP4,CBSO,16,1), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3156 | { "bnlctr-", XLOCB(19,BOF,CBLT,528,0), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4270 | {"bnulrl+", XLOCB(19,BOFP4,CBSO,16,1), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3157 | { "bnlctr-", XLOCB(19,BOFM4,CBLT,528,0), XLBOCBBB_MASK, POWER4, { CR } }, | 4271 | {"bltlr", XLOCB(19,BOT,CBLT,16,0), XLBOCBBB_MASK, PPCCOM, PPCVLE, {CR}}, |
3158 | { "bnlctr+", XLOCB(19,BOFP,CBLT,528,0), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4272 | {"bltlr-", XLOCB(19,BOT,CBLT,16,0), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3159 | { "bnlctr+", XLOCB(19,BOFP4,CBLT,528,0), XLBOCBBB_MASK, POWER4, { CR } }, | 4273 | {"bltr", XLOCB(19,BOT,CBLT,16,0), XLBOCBBB_MASK, PWRCOM, PPCVLE, {CR}}, |
3160 | { "bnlctrl", XLOCB(19,BOF,CBLT,528,1), XLBOCBBB_MASK, PPCCOM, { CR } }, | 4274 | {"bltlrl", XLOCB(19,BOT,CBLT,16,1), XLBOCBBB_MASK, PPCCOM, PPCVLE, {CR}}, |
3161 | { "bnlctrl-",XLOCB(19,BOF,CBLT,528,1), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4275 | {"bltlrl-", XLOCB(19,BOT,CBLT,16,1), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3162 | { "bnlctrl-",XLOCB(19,BOFM4,CBLT,528,1), XLBOCBBB_MASK, POWER4, { CR } }, | 4276 | {"bltrl", XLOCB(19,BOT,CBLT,16,1), XLBOCBBB_MASK, PWRCOM, PPCVLE, {CR}}, |
3163 | { "bnlctrl+",XLOCB(19,BOFP,CBLT,528,1), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4277 | {"bgtlr", XLOCB(19,BOT,CBGT,16,0), XLBOCBBB_MASK, PPCCOM, PPCVLE, {CR}}, |
3164 | { "bnlctrl+",XLOCB(19,BOFP4,CBLT,528,1), XLBOCBBB_MASK, POWER4, { CR } }, | 4278 | {"bgtlr-", XLOCB(19,BOT,CBGT,16,0), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3165 | { "blectr", XLOCB(19,BOF,CBGT,528,0), XLBOCBBB_MASK, PPCCOM, { CR } }, | 4279 | {"bgtr", XLOCB(19,BOT,CBGT,16,0), XLBOCBBB_MASK, PWRCOM, PPCVLE, {CR}}, |
3166 | { "blectr-", XLOCB(19,BOF,CBGT,528,0), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4280 | {"bgtlrl", XLOCB(19,BOT,CBGT,16,1), XLBOCBBB_MASK, PPCCOM, PPCVLE, {CR}}, |
3167 | { "blectr-", XLOCB(19,BOFM4,CBGT,528,0), XLBOCBBB_MASK, POWER4, { CR } }, | 4281 | {"bgtlrl-", XLOCB(19,BOT,CBGT,16,1), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3168 | { "blectr+", XLOCB(19,BOFP,CBGT,528,0), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4282 | {"bgtrl", XLOCB(19,BOT,CBGT,16,1), XLBOCBBB_MASK, PWRCOM, PPCVLE, {CR}}, |
3169 | { "blectr+", XLOCB(19,BOFP4,CBGT,528,0), XLBOCBBB_MASK, POWER4, { CR } }, | 4283 | {"beqlr", XLOCB(19,BOT,CBEQ,16,0), XLBOCBBB_MASK, PPCCOM, PPCVLE, {CR}}, |
3170 | { "blectrl", XLOCB(19,BOF,CBGT,528,1), XLBOCBBB_MASK, PPCCOM, { CR } }, | 4284 | {"beqlr-", XLOCB(19,BOT,CBEQ,16,0), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3171 | { "blectrl-",XLOCB(19,BOF,CBGT,528,1), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4285 | {"beqr", XLOCB(19,BOT,CBEQ,16,0), XLBOCBBB_MASK, PWRCOM, PPCVLE, {CR}}, |
3172 | { "blectrl-",XLOCB(19,BOFM4,CBGT,528,1), XLBOCBBB_MASK, POWER4, { CR } }, | 4286 | {"beqlrl", XLOCB(19,BOT,CBEQ,16,1), XLBOCBBB_MASK, PPCCOM, PPCVLE, {CR}}, |
3173 | { "blectrl+",XLOCB(19,BOFP,CBGT,528,1), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4287 | {"beqlrl-", XLOCB(19,BOT,CBEQ,16,1), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3174 | { "blectrl+",XLOCB(19,BOFP4,CBGT,528,1), XLBOCBBB_MASK, POWER4, { CR } }, | 4288 | {"beqrl", XLOCB(19,BOT,CBEQ,16,1), XLBOCBBB_MASK, PWRCOM, PPCVLE, {CR}}, |
3175 | { "bngctr", XLOCB(19,BOF,CBGT,528,0), XLBOCBBB_MASK, PPCCOM, { CR } }, | 4289 | {"bsolr", XLOCB(19,BOT,CBSO,16,0), XLBOCBBB_MASK, PPCCOM, PPCVLE, {CR}}, |
3176 | { "bngctr-", XLOCB(19,BOF,CBGT,528,0), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4290 | {"bsolr-", XLOCB(19,BOT,CBSO,16,0), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3177 | { "bngctr-", XLOCB(19,BOFM4,CBGT,528,0), XLBOCBBB_MASK, POWER4, { CR } }, | 4291 | {"bsor", XLOCB(19,BOT,CBSO,16,0), XLBOCBBB_MASK, PWRCOM, PPCVLE, {CR}}, |
3178 | { "bngctr+", XLOCB(19,BOFP,CBGT,528,0), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4292 | {"bunlr", XLOCB(19,BOT,CBSO,16,0), XLBOCBBB_MASK, PPCCOM, PPCVLE, {CR}}, |
3179 | { "bngctr+", XLOCB(19,BOFP4,CBGT,528,0), XLBOCBBB_MASK, POWER4, { CR } }, | 4293 | {"bunlr-", XLOCB(19,BOT,CBSO,16,0), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3180 | { "bngctrl", XLOCB(19,BOF,CBGT,528,1), XLBOCBBB_MASK, PPCCOM, { CR } }, | 4294 | {"bsolrl", XLOCB(19,BOT,CBSO,16,1), XLBOCBBB_MASK, PPCCOM, PPCVLE, {CR}}, |
3181 | { "bngctrl-",XLOCB(19,BOF,CBGT,528,1), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4295 | {"bsolrl-", XLOCB(19,BOT,CBSO,16,1), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3182 | { "bngctrl-",XLOCB(19,BOFM4,CBGT,528,1), XLBOCBBB_MASK, POWER4, { CR } }, | 4296 | {"bsorl", XLOCB(19,BOT,CBSO,16,1), XLBOCBBB_MASK, PWRCOM, PPCVLE, {CR}}, |
3183 | { "bngctrl+",XLOCB(19,BOFP,CBGT,528,1), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4297 | {"bunlrl", XLOCB(19,BOT,CBSO,16,1), XLBOCBBB_MASK, PPCCOM, PPCVLE, {CR}}, |
3184 | { "bngctrl+",XLOCB(19,BOFP4,CBGT,528,1), XLBOCBBB_MASK, POWER4, { CR } }, | 4298 | {"bunlrl-", XLOCB(19,BOT,CBSO,16,1), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3185 | { "bnectr", XLOCB(19,BOF,CBEQ,528,0), XLBOCBBB_MASK, PPCCOM, { CR } }, | 4299 | {"bltlr+", XLOCB(19,BOTP,CBLT,16,0), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3186 | { "bnectr-", XLOCB(19,BOF,CBEQ,528,0), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4300 | {"bltlrl+", XLOCB(19,BOTP,CBLT,16,1), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3187 | { "bnectr-", XLOCB(19,BOFM4,CBEQ,528,0), XLBOCBBB_MASK, POWER4, { CR } }, | 4301 | {"bgtlr+", XLOCB(19,BOTP,CBGT,16,0), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3188 | { "bnectr+", XLOCB(19,BOFP,CBEQ,528,0), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4302 | {"bgtlrl+", XLOCB(19,BOTP,CBGT,16,1), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3189 | { "bnectr+", XLOCB(19,BOFP4,CBEQ,528,0), XLBOCBBB_MASK, POWER4, { CR } }, | 4303 | {"beqlr+", XLOCB(19,BOTP,CBEQ,16,0), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3190 | { "bnectrl", XLOCB(19,BOF,CBEQ,528,1), XLBOCBBB_MASK, PPCCOM, { CR } }, | 4304 | {"beqlrl+", XLOCB(19,BOTP,CBEQ,16,1), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3191 | { "bnectrl-",XLOCB(19,BOF,CBEQ,528,1), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4305 | {"bsolr+", XLOCB(19,BOTP,CBSO,16,0), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3192 | { "bnectrl-",XLOCB(19,BOFM4,CBEQ,528,1), XLBOCBBB_MASK, POWER4, { CR } }, | 4306 | {"bunlr+", XLOCB(19,BOTP,CBSO,16,0), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3193 | { "bnectrl+",XLOCB(19,BOFP,CBEQ,528,1), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4307 | {"bsolrl+", XLOCB(19,BOTP,CBSO,16,1), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3194 | { "bnectrl+",XLOCB(19,BOFP4,CBEQ,528,1), XLBOCBBB_MASK, POWER4, { CR } }, | 4308 | {"bunlrl+", XLOCB(19,BOTP,CBSO,16,1), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3195 | { "bnsctr", XLOCB(19,BOF,CBSO,528,0), XLBOCBBB_MASK, PPCCOM, { CR } }, | 4309 | {"bltlr-", XLOCB(19,BOTM4,CBLT,16,0), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3196 | { "bnsctr-", XLOCB(19,BOF,CBSO,528,0), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4310 | {"bltlrl-", XLOCB(19,BOTM4,CBLT,16,1), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3197 | { "bnsctr-", XLOCB(19,BOFM4,CBSO,528,0), XLBOCBBB_MASK, POWER4, { CR } }, | 4311 | {"bgtlr-", XLOCB(19,BOTM4,CBGT,16,0), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3198 | { "bnsctr+", XLOCB(19,BOFP,CBSO,528,0), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4312 | {"bgtlrl-", XLOCB(19,BOTM4,CBGT,16,1), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3199 | { "bnsctr+", XLOCB(19,BOFP4,CBSO,528,0), XLBOCBBB_MASK, POWER4, { CR } }, | 4313 | {"beqlr-", XLOCB(19,BOTM4,CBEQ,16,0), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3200 | { "bnsctrl", XLOCB(19,BOF,CBSO,528,1), XLBOCBBB_MASK, PPCCOM, { CR } }, | 4314 | {"beqlrl-", XLOCB(19,BOTM4,CBEQ,16,1), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3201 | { "bnsctrl-",XLOCB(19,BOF,CBSO,528,1), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4315 | {"bsolr-", XLOCB(19,BOTM4,CBSO,16,0), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3202 | { "bnsctrl-",XLOCB(19,BOFM4,CBSO,528,1), XLBOCBBB_MASK, POWER4, { CR } }, | 4316 | {"bunlr-", XLOCB(19,BOTM4,CBSO,16,0), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3203 | { "bnsctrl+",XLOCB(19,BOFP,CBSO,528,1), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4317 | {"bsolrl-", XLOCB(19,BOTM4,CBSO,16,1), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3204 | { "bnsctrl+",XLOCB(19,BOFP4,CBSO,528,1), XLBOCBBB_MASK, POWER4, { CR } }, | 4318 | {"bunlrl-", XLOCB(19,BOTM4,CBSO,16,1), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3205 | { "bnuctr", XLOCB(19,BOF,CBSO,528,0), XLBOCBBB_MASK, PPCCOM, { CR } }, | 4319 | {"bltlr+", XLOCB(19,BOTP4,CBLT,16,0), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3206 | { "bnuctr-", XLOCB(19,BOF,CBSO,528,0), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4320 | {"bltlrl+", XLOCB(19,BOTP4,CBLT,16,1), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3207 | { "bnuctr-", XLOCB(19,BOFM4,CBSO,528,0), XLBOCBBB_MASK, POWER4, { CR } }, | 4321 | {"bgtlr+", XLOCB(19,BOTP4,CBGT,16,0), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3208 | { "bnuctr+", XLOCB(19,BOFP,CBSO,528,0), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4322 | {"bgtlrl+", XLOCB(19,BOTP4,CBGT,16,1), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3209 | { "bnuctr+", XLOCB(19,BOFP4,CBSO,528,0), XLBOCBBB_MASK, POWER4, { CR } }, | 4323 | {"beqlr+", XLOCB(19,BOTP4,CBEQ,16,0), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3210 | { "bnuctrl", XLOCB(19,BOF,CBSO,528,1), XLBOCBBB_MASK, PPCCOM, { CR } }, | 4324 | {"beqlrl+", XLOCB(19,BOTP4,CBEQ,16,1), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3211 | { "bnuctrl-",XLOCB(19,BOF,CBSO,528,1), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4325 | {"bsolr+", XLOCB(19,BOTP4,CBSO,16,0), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3212 | { "bnuctrl-",XLOCB(19,BOFM4,CBSO,528,1), XLBOCBBB_MASK, POWER4, { CR } }, | 4326 | {"bunlr+", XLOCB(19,BOTP4,CBSO,16,0), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3213 | { "bnuctrl+",XLOCB(19,BOFP,CBSO,528,1), XLBOCBBB_MASK, NOPOWER4, { CR } }, | 4327 | {"bsolrl+", XLOCB(19,BOTP4,CBSO,16,1), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3214 | { "bnuctrl+",XLOCB(19,BOFP4,CBSO,528,1), XLBOCBBB_MASK, POWER4, { CR } }, | 4328 | {"bunlrl+", XLOCB(19,BOTP4,CBSO,16,1), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3215 | { "btctr", XLO(19,BOT,528,0), XLBOBB_MASK, PPCCOM, { BI } }, | 4329 | |
3216 | { "btctr-", XLO(19,BOT,528,0), XLBOBB_MASK, NOPOWER4, { BI } }, | 4330 | {"bdnzflr", XLO(19,BODNZF,16,0), XLBOBB_MASK, PPCCOM, PPCVLE, {BI}}, |
3217 | { "btctr-", XLO(19,BOTM4,528,0), XLBOBB_MASK, POWER4, { BI } }, | 4331 | {"bdnzflr-", XLO(19,BODNZF,16,0), XLBOBB_MASK, PPCCOM, ISA_V2|PPCVLE, {BI}}, |
3218 | { "btctr+", XLO(19,BOTP,528,0), XLBOBB_MASK, NOPOWER4, { BI } }, | 4332 | {"bdnzflrl", XLO(19,BODNZF,16,1), XLBOBB_MASK, PPCCOM, PPCVLE, {BI}}, |
3219 | { "btctr+", XLO(19,BOTP4,528,0), XLBOBB_MASK, POWER4, { BI } }, | 4333 | {"bdnzflrl-",XLO(19,BODNZF,16,1), XLBOBB_MASK, PPCCOM, ISA_V2|PPCVLE, {BI}}, |
3220 | { "btctrl", XLO(19,BOT,528,1), XLBOBB_MASK, PPCCOM, { BI } }, | 4334 | {"bdnzflr+", XLO(19,BODNZFP,16,0), XLBOBB_MASK, PPCCOM, ISA_V2|PPCVLE, {BI}}, |
3221 | { "btctrl-", XLO(19,BOT,528,1), XLBOBB_MASK, NOPOWER4, { BI } }, | 4335 | {"bdnzflrl+",XLO(19,BODNZFP,16,1), XLBOBB_MASK, PPCCOM, ISA_V2|PPCVLE, {BI}}, |
3222 | { "btctrl-", XLO(19,BOTM4,528,1), XLBOBB_MASK, POWER4, { BI } }, | 4336 | {"bdzflr", XLO(19,BODZF,16,0), XLBOBB_MASK, PPCCOM, PPCVLE, {BI}}, |
3223 | { "btctrl+", XLO(19,BOTP,528,1), XLBOBB_MASK, NOPOWER4, { BI } }, | 4337 | {"bdzflr-", XLO(19,BODZF,16,0), XLBOBB_MASK, PPCCOM, ISA_V2|PPCVLE, {BI}}, |
3224 | { "btctrl+", XLO(19,BOTP4,528,1), XLBOBB_MASK, POWER4, { BI } }, | 4338 | {"bdzflrl", XLO(19,BODZF,16,1), XLBOBB_MASK, PPCCOM, PPCVLE, {BI}}, |
3225 | { "bfctr", XLO(19,BOF,528,0), XLBOBB_MASK, PPCCOM, { BI } }, | 4339 | {"bdzflrl-", XLO(19,BODZF,16,1), XLBOBB_MASK, PPCCOM, ISA_V2|PPCVLE, {BI}}, |
3226 | { "bfctr-", XLO(19,BOF,528,0), XLBOBB_MASK, NOPOWER4, { BI } }, | 4340 | {"bdzflr+", XLO(19,BODZFP,16,0), XLBOBB_MASK, PPCCOM, ISA_V2|PPCVLE, {BI}}, |
3227 | { "bfctr-", XLO(19,BOFM4,528,0), XLBOBB_MASK, POWER4, { BI } }, | 4341 | {"bdzflrl+", XLO(19,BODZFP,16,1), XLBOBB_MASK, PPCCOM, ISA_V2|PPCVLE, {BI}}, |
3228 | { "bfctr+", XLO(19,BOFP,528,0), XLBOBB_MASK, NOPOWER4, { BI } }, | 4342 | {"bflr", XLO(19,BOF,16,0), XLBOBB_MASK, PPCCOM, PPCVLE, {BI}}, |
3229 | { "bfctr+", XLO(19,BOFP4,528,0), XLBOBB_MASK, POWER4, { BI } }, | 4343 | {"bflr-", XLO(19,BOF,16,0), XLBOBB_MASK, PPCCOM, ISA_V2|PPCVLE, {BI}}, |
3230 | { "bfctrl", XLO(19,BOF,528,1), XLBOBB_MASK, PPCCOM, { BI } }, | 4344 | {"bbfr", XLO(19,BOF,16,0), XLBOBB_MASK, PWRCOM, PPCVLE, {BI}}, |
3231 | { "bfctrl-", XLO(19,BOF,528,1), XLBOBB_MASK, NOPOWER4, { BI } }, | 4345 | {"bflrl", XLO(19,BOF,16,1), XLBOBB_MASK, PPCCOM, PPCVLE, {BI}}, |
3232 | { "bfctrl-", XLO(19,BOFM4,528,1), XLBOBB_MASK, POWER4, { BI } }, | 4346 | {"bflrl-", XLO(19,BOF,16,1), XLBOBB_MASK, PPCCOM, ISA_V2|PPCVLE, {BI}}, |
3233 | { "bfctrl+", XLO(19,BOFP,528,1), XLBOBB_MASK, NOPOWER4, { BI } }, | 4347 | {"bbfrl", XLO(19,BOF,16,1), XLBOBB_MASK, PWRCOM, PPCVLE, {BI}}, |
3234 | { "bfctrl+", XLO(19,BOFP4,528,1), XLBOBB_MASK, POWER4, { BI } }, | 4348 | {"bflr+", XLO(19,BOFP,16,0), XLBOBB_MASK, PPCCOM, ISA_V2|PPCVLE, {BI}}, |
3235 | { "bcctr-", XLYLK(19,528,0,0), XLYBB_MASK, PPCCOM, { BOE, BI } }, | 4349 | {"bflrl+", XLO(19,BOFP,16,1), XLBOBB_MASK, PPCCOM, ISA_V2|PPCVLE, {BI}}, |
3236 | { "bcctr+", XLYLK(19,528,1,0), XLYBB_MASK, PPCCOM, { BOE, BI } }, | 4350 | {"bflr-", XLO(19,BOFM4,16,0), XLBOBB_MASK, ISA_V2, PPCVLE, {BI}}, |
3237 | { "bcctrl-", XLYLK(19,528,0,1), XLYBB_MASK, PPCCOM, { BOE, BI } }, | 4351 | {"bflrl-", XLO(19,BOFM4,16,1), XLBOBB_MASK, ISA_V2, PPCVLE, {BI}}, |
3238 | { "bcctrl+", XLYLK(19,528,1,1), XLYBB_MASK, PPCCOM, { BOE, BI } }, | 4352 | {"bflr+", XLO(19,BOFP4,16,0), XLBOBB_MASK, ISA_V2, PPCVLE, {BI}}, |
3239 | { "bcctr", XLLK(19,528,0), XLBH_MASK, PPCCOM, { BO, BI, BH } }, | 4353 | {"bflrl+", XLO(19,BOFP4,16,1), XLBOBB_MASK, ISA_V2, PPCVLE, {BI}}, |
3240 | { "bcctrl", XLLK(19,528,1), XLBH_MASK, PPCCOM, { BO, BI, BH } }, | 4354 | {"bdnztlr", XLO(19,BODNZT,16,0), XLBOBB_MASK, PPCCOM, PPCVLE, {BI}}, |
3241 | { "bcc", XLLK(19,528,0), XLBB_MASK, PWRCOM, { BO, BI } }, | 4355 | {"bdnztlr-", XLO(19,BODNZT,16,0), XLBOBB_MASK, PPCCOM, ISA_V2|PPCVLE, {BI}}, |
3242 | { "bccl", XLLK(19,528,1), XLBB_MASK, PWRCOM, { BO, BI } }, | 4356 | {"bdnztlrl", XLO(19,BODNZT,16,1), XLBOBB_MASK, PPCCOM, PPCVLE, {BI}}, |
3243 | { "bcctre", XLLK(19,529,0), XLYBB_MASK, BOOKE64, { BO, BI } }, | 4357 | {"bdnztlrl-", XLO(19,BODNZT,16,1), XLBOBB_MASK, PPCCOM, ISA_V2|PPCVLE, {BI}}, |
3244 | { "bcctrel", XLLK(19,529,1), XLYBB_MASK, BOOKE64, { BO, BI } }, | 4358 | {"bdnztlr+", XLO(19,BODNZTP,16,0), XLBOBB_MASK, PPCCOM, ISA_V2|PPCVLE, {BI}}, |
3245 | 4359 | {"bdnztlrl+", XLO(19,BODNZTP,16,1), XLBOBB_MASK, PPCCOM, ISA_V2|PPCVLE, {BI}}, | |
3246 | { "rlwimi", M(20,0), M_MASK, PPCCOM, { RA,RS,SH,MBE,ME } }, | 4360 | {"bdztlr", XLO(19,BODZT,16,0), XLBOBB_MASK, PPCCOM, PPCVLE, {BI}}, |
3247 | { "rlimi", M(20,0), M_MASK, PWRCOM, { RA,RS,SH,MBE,ME } }, | 4361 | {"bdztlr-", XLO(19,BODZT,16,0), XLBOBB_MASK, PPCCOM, ISA_V2|PPCVLE, {BI}}, |
3248 | 4362 | {"bdztlrl", XLO(19,BODZT,16,1), XLBOBB_MASK, PPCCOM, PPCVLE, {BI}}, | |
3249 | { "rlwimi.", M(20,1), M_MASK, PPCCOM, { RA,RS,SH,MBE,ME } }, | 4363 | {"bdztlrl-", XLO(19,BODZT,16,1), XLBOBB_MASK, PPCCOM, ISA_V2|PPCVLE, {BI}}, |
3250 | { "rlimi.", M(20,1), M_MASK, PWRCOM, { RA,RS,SH,MBE,ME } }, | 4364 | {"bdztlr+", XLO(19,BODZTP,16,0), XLBOBB_MASK, PPCCOM, ISA_V2|PPCVLE, {BI}}, |
3251 | 4365 | {"bdztlrl+", XLO(19,BODZTP,16,1), XLBOBB_MASK, PPCCOM, ISA_V2|PPCVLE, {BI}}, | |
3252 | { "rotlwi", MME(21,31,0), MMBME_MASK, PPCCOM, { RA, RS, SH } }, | 4366 | {"btlr", XLO(19,BOT,16,0), XLBOBB_MASK, PPCCOM, PPCVLE, {BI}}, |
3253 | { "clrlwi", MME(21,31,0), MSHME_MASK, PPCCOM, { RA, RS, MB } }, | 4367 | {"btlr-", XLO(19,BOT,16,0), XLBOBB_MASK, PPCCOM, ISA_V2|PPCVLE, {BI}}, |
3254 | { "rlwinm", M(21,0), M_MASK, PPCCOM, { RA,RS,SH,MBE,ME } }, | 4368 | {"bbtr", XLO(19,BOT,16,0), XLBOBB_MASK, PWRCOM, PPCVLE, {BI}}, |
3255 | { "rlinm", M(21,0), M_MASK, PWRCOM, { RA,RS,SH,MBE,ME } }, | 4369 | {"btlrl", XLO(19,BOT,16,1), XLBOBB_MASK, PPCCOM, PPCVLE, {BI}}, |
3256 | { "rotlwi.", MME(21,31,1), MMBME_MASK, PPCCOM, { RA,RS,SH } }, | 4370 | {"btlrl-", XLO(19,BOT,16,1), XLBOBB_MASK, PPCCOM, ISA_V2|PPCVLE, {BI}}, |
3257 | { "clrlwi.", MME(21,31,1), MSHME_MASK, PPCCOM, { RA, RS, MB } }, | 4371 | {"bbtrl", XLO(19,BOT,16,1), XLBOBB_MASK, PWRCOM, PPCVLE, {BI}}, |
3258 | { "rlwinm.", M(21,1), M_MASK, PPCCOM, { RA,RS,SH,MBE,ME } }, | 4372 | {"btlr+", XLO(19,BOTP,16,0), XLBOBB_MASK, PPCCOM, ISA_V2|PPCVLE, {BI}}, |
3259 | { "rlinm.", M(21,1), M_MASK, PWRCOM, { RA,RS,SH,MBE,ME } }, | 4373 | {"btlrl+", XLO(19,BOTP,16,1), XLBOBB_MASK, PPCCOM, ISA_V2|PPCVLE, {BI}}, |
3260 | 4374 | {"btlr-", XLO(19,BOTM4,16,0), XLBOBB_MASK, ISA_V2, PPCVLE, {BI}}, | |
3261 | { "rlmi", M(22,0), M_MASK, M601, { RA,RS,RB,MBE,ME } }, | 4375 | {"btlrl-", XLO(19,BOTM4,16,1), XLBOBB_MASK, ISA_V2, PPCVLE, {BI}}, |
3262 | { "rlmi.", M(22,1), M_MASK, M601, { RA,RS,RB,MBE,ME } }, | 4376 | {"btlr+", XLO(19,BOTP4,16,0), XLBOBB_MASK, ISA_V2, PPCVLE, {BI}}, |
3263 | 4377 | {"btlrl+", XLO(19,BOTP4,16,1), XLBOBB_MASK, ISA_V2, PPCVLE, {BI}}, | |
3264 | { "be", B(22,0,0), B_MASK, BOOKE64, { LI } }, | 4378 | |
3265 | { "bel", B(22,0,1), B_MASK, BOOKE64, { LI } }, | 4379 | {"bclr-", XLYLK(19,16,0,0), XLYBB_MASK, PPCCOM, PPCVLE, {BOE, BI}}, |
3266 | { "bea", B(22,1,0), B_MASK, BOOKE64, { LIA } }, | 4380 | {"bclrl-", XLYLK(19,16,0,1), XLYBB_MASK, PPCCOM, PPCVLE, {BOE, BI}}, |
3267 | { "bela", B(22,1,1), B_MASK, BOOKE64, { LIA } }, | 4381 | {"bclr+", XLYLK(19,16,1,0), XLYBB_MASK, PPCCOM, PPCVLE, {BOE, BI}}, |
3268 | 4382 | {"bclrl+", XLYLK(19,16,1,1), XLYBB_MASK, PPCCOM, PPCVLE, {BOE, BI}}, | |
3269 | { "rotlw", MME(23,31,0), MMBME_MASK, PPCCOM, { RA, RS, RB } }, | 4383 | {"bclr", XLLK(19,16,0), XLBH_MASK, PPCCOM, PPCVLE, {BO, BI, BH}}, |
3270 | { "rlwnm", M(23,0), M_MASK, PPCCOM, { RA,RS,RB,MBE,ME } }, | 4384 | {"bcr", XLLK(19,16,0), XLBB_MASK, PWRCOM, PPCVLE, {BO, BI}}, |
3271 | { "rlnm", M(23,0), M_MASK, PWRCOM, { RA,RS,RB,MBE,ME } }, | 4385 | {"bclrl", XLLK(19,16,1), XLBH_MASK, PPCCOM, PPCVLE, {BO, BI, BH}}, |
3272 | { "rotlw.", MME(23,31,1), MMBME_MASK, PPCCOM, { RA, RS, RB } }, | 4386 | {"bcrl", XLLK(19,16,1), XLBB_MASK, PWRCOM, PPCVLE, {BO, BI}}, |
3273 | { "rlwnm.", M(23,1), M_MASK, PPCCOM, { RA,RS,RB,MBE,ME } }, | 4387 | |
3274 | { "rlnm.", M(23,1), M_MASK, PWRCOM, { RA,RS,RB,MBE,ME } }, | 4388 | {"rfid", XL(19,18), 0xffffffff, PPC64, PPCVLE, {0}}, |
3275 | 4389 | ||
3276 | { "nop", OP(24), 0xffffffff, PPCCOM, { 0 } }, | 4390 | {"crnot", XL(19,33), XL_MASK, PPCCOM, PPCVLE, {BT, BA, BBA}}, |
3277 | { "ori", OP(24), OP_MASK, PPCCOM, { RA, RS, UI } }, | 4391 | {"crnor", XL(19,33), XL_MASK, COM, PPCVLE, {BT, BA, BB}}, |
3278 | { "oril", OP(24), OP_MASK, PWRCOM, { RA, RS, UI } }, | 4392 | {"rfmci", X(19,38), 0xffffffff, PPCRFMCI|PPCA2|PPC476, PPCVLE, {0}}, |
3279 | 4393 | ||
3280 | { "oris", OP(25), OP_MASK, PPCCOM, { RA, RS, UI } }, | 4394 | {"rfdi", XL(19,39), 0xffffffff, E500MC, PPCVLE, {0}}, |
3281 | { "oriu", OP(25), OP_MASK, PWRCOM, { RA, RS, UI } }, | 4395 | {"rfi", XL(19,50), 0xffffffff, COM, PPCVLE, {0}}, |
3282 | 4396 | {"rfci", XL(19,51), 0xffffffff, PPC403|BOOKE|PPCE300|PPCA2|PPC476, PPCVLE, {0}}, | |
3283 | { "xori", OP(26), OP_MASK, PPCCOM, { RA, RS, UI } }, | 4397 | |
3284 | { "xoril", OP(26), OP_MASK, PWRCOM, { RA, RS, UI } }, | 4398 | {"rfsvc", XL(19,82), 0xffffffff, POWER, PPCVLE, {0}}, |
3285 | 4399 | ||
3286 | { "xoris", OP(27), OP_MASK, PPCCOM, { RA, RS, UI } }, | 4400 | {"rfgi", XL(19,102), 0xffffffff, E500MC|PPCA2, PPCVLE, {0}}, |
3287 | { "xoriu", OP(27), OP_MASK, PWRCOM, { RA, RS, UI } }, | 4401 | |
3288 | 4402 | {"crandc", XL(19,129), XL_MASK, COM, PPCVLE, {BT, BA, BB}}, | |
3289 | { "andi.", OP(28), OP_MASK, PPCCOM, { RA, RS, UI } }, | 4403 | |
3290 | { "andil.", OP(28), OP_MASK, PWRCOM, { RA, RS, UI } }, | 4404 | {"rfebb", XL(19,146), XLS_MASK, POWER8, PPCVLE, {SXL}}, |
3291 | 4405 | ||
3292 | { "andis.", OP(29), OP_MASK, PPCCOM, { RA, RS, UI } }, | 4406 | {"isync", XL(19,150), 0xffffffff, PPCCOM, PPCVLE, {0}}, |
3293 | { "andiu.", OP(29), OP_MASK, PWRCOM, { RA, RS, UI } }, | 4407 | {"ics", XL(19,150), 0xffffffff, PWRCOM, PPCVLE, {0}}, |
3294 | 4408 | ||
3295 | { "rotldi", MD(30,0,0), MDMB_MASK, PPC64, { RA, RS, SH6 } }, | 4409 | {"crclr", XL(19,193), XL_MASK, PPCCOM, PPCVLE, {BT, BAT, BBA}}, |
3296 | { "clrldi", MD(30,0,0), MDSH_MASK, PPC64, { RA, RS, MB6 } }, | 4410 | {"crxor", XL(19,193), XL_MASK, COM, PPCVLE, {BT, BA, BB}}, |
3297 | { "rldicl", MD(30,0,0), MD_MASK, PPC64, { RA, RS, SH6, MB6 } }, | 4411 | |
3298 | { "rotldi.", MD(30,0,1), MDMB_MASK, PPC64, { RA, RS, SH6 } }, | 4412 | {"dnh", X(19,198), X_MASK, E500MC, PPCVLE, {DUI, DUIS}}, |
3299 | { "clrldi.", MD(30,0,1), MDSH_MASK, PPC64, { RA, RS, MB6 } }, | 4413 | |
3300 | { "rldicl.", MD(30,0,1), MD_MASK, PPC64, { RA, RS, SH6, MB6 } }, | 4414 | {"crnand", XL(19,225), XL_MASK, COM, PPCVLE, {BT, BA, BB}}, |
3301 | 4415 | ||
3302 | { "rldicr", MD(30,1,0), MD_MASK, PPC64, { RA, RS, SH6, ME6 } }, | 4416 | {"crand", XL(19,257), XL_MASK, COM, PPCVLE, {BT, BA, BB}}, |
3303 | { "rldicr.", MD(30,1,1), MD_MASK, PPC64, { RA, RS, SH6, ME6 } }, | 4417 | |
3304 | 4418 | {"hrfid", XL(19,274), 0xffffffff, POWER5|CELL, PPC476|PPCVLE, {0}}, | |
3305 | { "rldic", MD(30,2,0), MD_MASK, PPC64, { RA, RS, SH6, MB6 } }, | 4419 | |
3306 | { "rldic.", MD(30,2,1), MD_MASK, PPC64, { RA, RS, SH6, MB6 } }, | 4420 | {"crset", XL(19,289), XL_MASK, PPCCOM, PPCVLE, {BT, BAT, BBA}}, |
3307 | 4421 | {"creqv", XL(19,289), XL_MASK, COM, PPCVLE, {BT, BA, BB}}, | |
3308 | { "rldimi", MD(30,3,0), MD_MASK, PPC64, { RA, RS, SH6, MB6 } }, | 4422 | |
3309 | { "rldimi.", MD(30,3,1), MD_MASK, PPC64, { RA, RS, SH6, MB6 } }, | 4423 | {"urfid", XL(19,306), 0xffffffff, POWER9, PPCVLE, {0}}, |
3310 | 4424 | {"stop", XL(19,370), 0xffffffff, POWER9, PPCVLE, {0}}, | |
3311 | { "rotld", MDS(30,8,0), MDSMB_MASK, PPC64, { RA, RS, RB } }, | 4425 | |
3312 | { "rldcl", MDS(30,8,0), MDS_MASK, PPC64, { RA, RS, RB, MB6 } }, | 4426 | {"doze", XL(19,402), 0xffffffff, POWER6, POWER9|PPCVLE, {0}}, |
3313 | { "rotld.", MDS(30,8,1), MDSMB_MASK, PPC64, { RA, RS, RB } }, | 4427 | |
3314 | { "rldcl.", MDS(30,8,1), MDS_MASK, PPC64, { RA, RS, RB, MB6 } }, | 4428 | {"crorc", XL(19,417), XL_MASK, COM, PPCVLE, {BT, BA, BB}}, |
3315 | 4429 | ||
3316 | { "rldcr", MDS(30,9,0), MDS_MASK, PPC64, { RA, RS, RB, ME6 } }, | 4430 | {"nap", XL(19,434), 0xffffffff, POWER6, POWER9|PPCVLE, {0}}, |
3317 | { "rldcr.", MDS(30,9,1), MDS_MASK, PPC64, { RA, RS, RB, ME6 } }, | 4431 | |
3318 | 4432 | {"crmove", XL(19,449), XL_MASK, PPCCOM, PPCVLE, {BT, BA, BBA}}, | |
3319 | { "cmpw", XOPL(31,0,0), XCMPL_MASK, PPCCOM, { OBF, RA, RB } }, | 4433 | {"cror", XL(19,449), XL_MASK, COM, PPCVLE, {BT, BA, BB}}, |
3320 | { "cmpd", XOPL(31,0,1), XCMPL_MASK, PPC64, { OBF, RA, RB } }, | 4434 | |
3321 | { "cmp", X(31,0), XCMP_MASK, PPC, { BF, L, RA, RB } }, | 4435 | {"sleep", XL(19,466), 0xffffffff, POWER6, POWER9|PPCVLE, {0}}, |
3322 | { "cmp", X(31,0), XCMPL_MASK, PWRCOM, { BF, RA, RB } }, | 4436 | {"rvwinkle", XL(19,498), 0xffffffff, POWER6, POWER9|PPCVLE, {0}}, |
3323 | 4437 | ||
3324 | { "twlgt", XTO(31,4,TOLGT), XTO_MASK, PPCCOM, { RA, RB } }, | 4438 | {"bctr", XLO(19,BOU,528,0), XLBOBIBB_MASK, COM, PPCVLE, {0}}, |
3325 | { "tlgt", XTO(31,4,TOLGT), XTO_MASK, PWRCOM, { RA, RB } }, | 4439 | {"bctrl", XLO(19,BOU,528,1), XLBOBIBB_MASK, COM, PPCVLE, {0}}, |
3326 | { "twllt", XTO(31,4,TOLLT), XTO_MASK, PPCCOM, { RA, RB } }, | 4440 | |
3327 | { "tllt", XTO(31,4,TOLLT), XTO_MASK, PWRCOM, { RA, RB } }, | 4441 | {"bgectr", XLOCB(19,BOF,CBLT,528,0), XLBOCBBB_MASK, PPCCOM, PPCVLE, {CR}}, |
3328 | { "tweq", XTO(31,4,TOEQ), XTO_MASK, PPCCOM, { RA, RB } }, | 4442 | {"bgectr-", XLOCB(19,BOF,CBLT,528,0), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3329 | { "teq", XTO(31,4,TOEQ), XTO_MASK, PWRCOM, { RA, RB } }, | 4443 | {"bnlctr", XLOCB(19,BOF,CBLT,528,0), XLBOCBBB_MASK, PPCCOM, PPCVLE, {CR}}, |
3330 | { "twlge", XTO(31,4,TOLGE), XTO_MASK, PPCCOM, { RA, RB } }, | 4444 | {"bnlctr-", XLOCB(19,BOF,CBLT,528,0), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3331 | { "tlge", XTO(31,4,TOLGE), XTO_MASK, PWRCOM, { RA, RB } }, | 4445 | {"bgectrl", XLOCB(19,BOF,CBLT,528,1), XLBOCBBB_MASK, PPCCOM, PPCVLE, {CR}}, |
3332 | { "twlnl", XTO(31,4,TOLNL), XTO_MASK, PPCCOM, { RA, RB } }, | 4446 | {"bgectrl-",XLOCB(19,BOF,CBLT,528,1), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3333 | { "tlnl", XTO(31,4,TOLNL), XTO_MASK, PWRCOM, { RA, RB } }, | 4447 | {"bnlctrl", XLOCB(19,BOF,CBLT,528,1), XLBOCBBB_MASK, PPCCOM, PPCVLE, {CR}}, |
3334 | { "twlle", XTO(31,4,TOLLE), XTO_MASK, PPCCOM, { RA, RB } }, | 4448 | {"bnlctrl-",XLOCB(19,BOF,CBLT,528,1), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3335 | { "tlle", XTO(31,4,TOLLE), XTO_MASK, PWRCOM, { RA, RB } }, | 4449 | {"blectr", XLOCB(19,BOF,CBGT,528,0), XLBOCBBB_MASK, PPCCOM, PPCVLE, {CR}}, |
3336 | { "twlng", XTO(31,4,TOLNG), XTO_MASK, PPCCOM, { RA, RB } }, | 4450 | {"blectr-", XLOCB(19,BOF,CBGT,528,0), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3337 | { "tlng", XTO(31,4,TOLNG), XTO_MASK, PWRCOM, { RA, RB } }, | 4451 | {"bngctr", XLOCB(19,BOF,CBGT,528,0), XLBOCBBB_MASK, PPCCOM, PPCVLE, {CR}}, |
3338 | { "twgt", XTO(31,4,TOGT), XTO_MASK, PPCCOM, { RA, RB } }, | 4452 | {"bngctr-", XLOCB(19,BOF,CBGT,528,0), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3339 | { "tgt", XTO(31,4,TOGT), XTO_MASK, PWRCOM, { RA, RB } }, | 4453 | {"blectrl", XLOCB(19,BOF,CBGT,528,1), XLBOCBBB_MASK, PPCCOM, PPCVLE, {CR}}, |
3340 | { "twge", XTO(31,4,TOGE), XTO_MASK, PPCCOM, { RA, RB } }, | 4454 | {"blectrl-",XLOCB(19,BOF,CBGT,528,1), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3341 | { "tge", XTO(31,4,TOGE), XTO_MASK, PWRCOM, { RA, RB } }, | 4455 | {"bngctrl", XLOCB(19,BOF,CBGT,528,1), XLBOCBBB_MASK, PPCCOM, PPCVLE, {CR}}, |
3342 | { "twnl", XTO(31,4,TONL), XTO_MASK, PPCCOM, { RA, RB } }, | 4456 | {"bngctrl-",XLOCB(19,BOF,CBGT,528,1), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3343 | { "tnl", XTO(31,4,TONL), XTO_MASK, PWRCOM, { RA, RB } }, | 4457 | {"bnectr", XLOCB(19,BOF,CBEQ,528,0), XLBOCBBB_MASK, PPCCOM, PPCVLE, {CR}}, |
3344 | { "twlt", XTO(31,4,TOLT), XTO_MASK, PPCCOM, { RA, RB } }, | 4458 | {"bnectr-", XLOCB(19,BOF,CBEQ,528,0), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3345 | { "tlt", XTO(31,4,TOLT), XTO_MASK, PWRCOM, { RA, RB } }, | 4459 | {"bnectrl", XLOCB(19,BOF,CBEQ,528,1), XLBOCBBB_MASK, PPCCOM, PPCVLE, {CR}}, |
3346 | { "twle", XTO(31,4,TOLE), XTO_MASK, PPCCOM, { RA, RB } }, | 4460 | {"bnectrl-",XLOCB(19,BOF,CBEQ,528,1), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3347 | { "tle", XTO(31,4,TOLE), XTO_MASK, PWRCOM, { RA, RB } }, | 4461 | {"bnsctr", XLOCB(19,BOF,CBSO,528,0), XLBOCBBB_MASK, PPCCOM, PPCVLE, {CR}}, |
3348 | { "twng", XTO(31,4,TONG), XTO_MASK, PPCCOM, { RA, RB } }, | 4462 | {"bnsctr-", XLOCB(19,BOF,CBSO,528,0), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3349 | { "tng", XTO(31,4,TONG), XTO_MASK, PWRCOM, { RA, RB } }, | 4463 | {"bnuctr", XLOCB(19,BOF,CBSO,528,0), XLBOCBBB_MASK, PPCCOM, PPCVLE, {CR}}, |
3350 | { "twne", XTO(31,4,TONE), XTO_MASK, PPCCOM, { RA, RB } }, | 4464 | {"bnuctr-", XLOCB(19,BOF,CBSO,528,0), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3351 | { "tne", XTO(31,4,TONE), XTO_MASK, PWRCOM, { RA, RB } }, | 4465 | {"bnsctrl", XLOCB(19,BOF,CBSO,528,1), XLBOCBBB_MASK, PPCCOM, PPCVLE, {CR}}, |
3352 | { "trap", XTO(31,4,TOU), 0xffffffff, PPCCOM, { 0 } }, | 4466 | {"bnsctrl-",XLOCB(19,BOF,CBSO,528,1), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3353 | { "tw", X(31,4), X_MASK, PPCCOM, { TO, RA, RB } }, | 4467 | {"bnuctrl", XLOCB(19,BOF,CBSO,528,1), XLBOCBBB_MASK, PPCCOM, PPCVLE, {CR}}, |
3354 | { "t", X(31,4), X_MASK, PWRCOM, { TO, RA, RB } }, | 4468 | {"bnuctrl-",XLOCB(19,BOF,CBSO,528,1), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3355 | 4469 | {"bgectr+", XLOCB(19,BOFP,CBLT,528,0), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, | |
3356 | { "subfc", XO(31,8,0,0), XO_MASK, PPCCOM, { RT, RA, RB } }, | 4470 | {"bnlctr+", XLOCB(19,BOFP,CBLT,528,0), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3357 | { "sf", XO(31,8,0,0), XO_MASK, PWRCOM, { RT, RA, RB } }, | 4471 | {"bgectrl+",XLOCB(19,BOFP,CBLT,528,1), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3358 | { "subc", XO(31,8,0,0), XO_MASK, PPC, { RT, RB, RA } }, | 4472 | {"bnlctrl+",XLOCB(19,BOFP,CBLT,528,1), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3359 | { "subfc.", XO(31,8,0,1), XO_MASK, PPCCOM, { RT, RA, RB } }, | 4473 | {"blectr+", XLOCB(19,BOFP,CBGT,528,0), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3360 | { "sf.", XO(31,8,0,1), XO_MASK, PWRCOM, { RT, RA, RB } }, | 4474 | {"bngctr+", XLOCB(19,BOFP,CBGT,528,0), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3361 | { "subc.", XO(31,8,0,1), XO_MASK, PPCCOM, { RT, RB, RA } }, | 4475 | {"blectrl+",XLOCB(19,BOFP,CBGT,528,1), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3362 | { "subfco", XO(31,8,1,0), XO_MASK, PPCCOM, { RT, RA, RB } }, | 4476 | {"bngctrl+",XLOCB(19,BOFP,CBGT,528,1), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3363 | { "sfo", XO(31,8,1,0), XO_MASK, PWRCOM, { RT, RA, RB } }, | 4477 | {"bnectr+", XLOCB(19,BOFP,CBEQ,528,0), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3364 | { "subco", XO(31,8,1,0), XO_MASK, PPC, { RT, RB, RA } }, | 4478 | {"bnectrl+",XLOCB(19,BOFP,CBEQ,528,1), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3365 | { "subfco.", XO(31,8,1,1), XO_MASK, PPCCOM, { RT, RA, RB } }, | 4479 | {"bnsctr+", XLOCB(19,BOFP,CBSO,528,0), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3366 | { "sfo.", XO(31,8,1,1), XO_MASK, PWRCOM, { RT, RA, RB } }, | 4480 | {"bnuctr+", XLOCB(19,BOFP,CBSO,528,0), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3367 | { "subco.", XO(31,8,1,1), XO_MASK, PPC, { RT, RB, RA } }, | 4481 | {"bnsctrl+",XLOCB(19,BOFP,CBSO,528,1), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3368 | 4482 | {"bnuctrl+",XLOCB(19,BOFP,CBSO,528,1), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, | |
3369 | { "mulhdu", XO(31,9,0,0), XO_MASK, PPC64, { RT, RA, RB } }, | 4483 | {"bgectr-", XLOCB(19,BOFM4,CBLT,528,0), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3370 | { "mulhdu.", XO(31,9,0,1), XO_MASK, PPC64, { RT, RA, RB } }, | 4484 | {"bnlctr-", XLOCB(19,BOFM4,CBLT,528,0), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3371 | 4485 | {"bgectrl-",XLOCB(19,BOFM4,CBLT,528,1), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, | |
3372 | { "addc", XO(31,10,0,0), XO_MASK, PPCCOM, { RT, RA, RB } }, | 4486 | {"bnlctrl-",XLOCB(19,BOFM4,CBLT,528,1), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3373 | { "a", XO(31,10,0,0), XO_MASK, PWRCOM, { RT, RA, RB } }, | 4487 | {"blectr-", XLOCB(19,BOFM4,CBGT,528,0), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3374 | { "addc.", XO(31,10,0,1), XO_MASK, PPCCOM, { RT, RA, RB } }, | 4488 | {"bngctr-", XLOCB(19,BOFM4,CBGT,528,0), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3375 | { "a.", XO(31,10,0,1), XO_MASK, PWRCOM, { RT, RA, RB } }, | 4489 | {"blectrl-",XLOCB(19,BOFM4,CBGT,528,1), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3376 | { "addco", XO(31,10,1,0), XO_MASK, PPCCOM, { RT, RA, RB } }, | 4490 | {"bngctrl-",XLOCB(19,BOFM4,CBGT,528,1), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3377 | { "ao", XO(31,10,1,0), XO_MASK, PWRCOM, { RT, RA, RB } }, | 4491 | {"bnectr-", XLOCB(19,BOFM4,CBEQ,528,0), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3378 | { "addco.", XO(31,10,1,1), XO_MASK, PPCCOM, { RT, RA, RB } }, | 4492 | {"bnectrl-",XLOCB(19,BOFM4,CBEQ,528,1), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3379 | { "ao.", XO(31,10,1,1), XO_MASK, PWRCOM, { RT, RA, RB } }, | 4493 | {"bnsctr-", XLOCB(19,BOFM4,CBSO,528,0), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3380 | 4494 | {"bnuctr-", XLOCB(19,BOFM4,CBSO,528,0), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, | |
3381 | { "mulhwu", XO(31,11,0,0), XO_MASK, PPC, { RT, RA, RB } }, | 4495 | {"bnsctrl-",XLOCB(19,BOFM4,CBSO,528,1), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3382 | { "mulhwu.", XO(31,11,0,1), XO_MASK, PPC, { RT, RA, RB } }, | 4496 | {"bnuctrl-",XLOCB(19,BOFM4,CBSO,528,1), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3383 | 4497 | {"bgectr+", XLOCB(19,BOFP4,CBLT,528,0), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, | |
3384 | { "isellt", X(31,15), X_MASK, PPCISEL, { RT, RA, RB } }, | 4498 | {"bnlctr+", XLOCB(19,BOFP4,CBLT,528,0), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3385 | { "iselgt", X(31,47), X_MASK, PPCISEL, { RT, RA, RB } }, | 4499 | {"bgectrl+",XLOCB(19,BOFP4,CBLT,528,1), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3386 | { "iseleq", X(31,79), X_MASK, PPCISEL, { RT, RA, RB } }, | 4500 | {"bnlctrl+",XLOCB(19,BOFP4,CBLT,528,1), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3387 | { "isel", XISEL(31,15), XISEL_MASK, PPCISEL, { RT, RA, RB, CRB } }, | 4501 | {"blectr+", XLOCB(19,BOFP4,CBGT,528,0), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3388 | 4502 | {"bngctr+", XLOCB(19,BOFP4,CBGT,528,0), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, | |
3389 | { "mfocrf", XFXM(31,19,0,1), XFXFXM_MASK, COM, { RT, FXM } }, | 4503 | {"blectrl+",XLOCB(19,BOFP4,CBGT,528,1), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3390 | { "mfcr", X(31,19), XRARB_MASK, NOPOWER4 | COM, { RT } }, | 4504 | {"bngctrl+",XLOCB(19,BOFP4,CBGT,528,1), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3391 | { "mfcr", X(31,19), XFXFXM_MASK, POWER4, { RT, FXM4 } }, | 4505 | {"bnectr+", XLOCB(19,BOFP4,CBEQ,528,0), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3392 | 4506 | {"bnectrl+",XLOCB(19,BOFP4,CBEQ,528,1), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, | |
3393 | { "lwarx", X(31,20), XEH_MASK, PPC, { RT, RA0, RB, EH } }, | 4507 | {"bnsctr+", XLOCB(19,BOFP4,CBSO,528,0), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3394 | 4508 | {"bnuctr+", XLOCB(19,BOFP4,CBSO,528,0), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, | |
3395 | { "ldx", X(31,21), X_MASK, PPC64, { RT, RA0, RB } }, | 4509 | {"bnsctrl+",XLOCB(19,BOFP4,CBSO,528,1), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3396 | 4510 | {"bnuctrl+",XLOCB(19,BOFP4,CBSO,528,1), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, | |
3397 | { "icbt", X(31,22), X_MASK, BOOKE|PPCE300, { CT, RA, RB } }, | 4511 | {"bltctr", XLOCB(19,BOT,CBLT,528,0), XLBOCBBB_MASK, PPCCOM, PPCVLE, {CR}}, |
3398 | { "icbt", X(31,262), XRT_MASK, PPC403, { RA, RB } }, | 4512 | {"bltctr-", XLOCB(19,BOT,CBLT,528,0), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3399 | 4513 | {"bltctrl", XLOCB(19,BOT,CBLT,528,1), XLBOCBBB_MASK, PPCCOM, PPCVLE, {CR}}, | |
3400 | { "lwzx", X(31,23), X_MASK, PPCCOM, { RT, RA0, RB } }, | 4514 | {"bltctrl-",XLOCB(19,BOT,CBLT,528,1), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3401 | { "lx", X(31,23), X_MASK, PWRCOM, { RT, RA, RB } }, | 4515 | {"bgtctr", XLOCB(19,BOT,CBGT,528,0), XLBOCBBB_MASK, PPCCOM, PPCVLE, {CR}}, |
3402 | 4516 | {"bgtctr-", XLOCB(19,BOT,CBGT,528,0), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, | |
3403 | { "slw", XRC(31,24,0), X_MASK, PPCCOM, { RA, RS, RB } }, | 4517 | {"bgtctrl", XLOCB(19,BOT,CBGT,528,1), XLBOCBBB_MASK, PPCCOM, PPCVLE, {CR}}, |
3404 | { "sl", XRC(31,24,0), X_MASK, PWRCOM, { RA, RS, RB } }, | 4518 | {"bgtctrl-",XLOCB(19,BOT,CBGT,528,1), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3405 | { "slw.", XRC(31,24,1), X_MASK, PPCCOM, { RA, RS, RB } }, | 4519 | {"beqctr", XLOCB(19,BOT,CBEQ,528,0), XLBOCBBB_MASK, PPCCOM, PPCVLE, {CR}}, |
3406 | { "sl.", XRC(31,24,1), X_MASK, PWRCOM, { RA, RS, RB } }, | 4520 | {"beqctr-", XLOCB(19,BOT,CBEQ,528,0), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3407 | 4521 | {"beqctrl", XLOCB(19,BOT,CBEQ,528,1), XLBOCBBB_MASK, PPCCOM, PPCVLE, {CR}}, | |
3408 | { "cntlzw", XRC(31,26,0), XRB_MASK, PPCCOM, { RA, RS } }, | 4522 | {"beqctrl-",XLOCB(19,BOT,CBEQ,528,1), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3409 | { "cntlz", XRC(31,26,0), XRB_MASK, PWRCOM, { RA, RS } }, | 4523 | {"bsoctr", XLOCB(19,BOT,CBSO,528,0), XLBOCBBB_MASK, PPCCOM, PPCVLE, {CR}}, |
3410 | { "cntlzw.", XRC(31,26,1), XRB_MASK, PPCCOM, { RA, RS } }, | 4524 | {"bsoctr-", XLOCB(19,BOT,CBSO,528,0), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3411 | { "cntlz.", XRC(31,26,1), XRB_MASK, PWRCOM, { RA, RS } }, | 4525 | {"bunctr", XLOCB(19,BOT,CBSO,528,0), XLBOCBBB_MASK, PPCCOM, PPCVLE, {CR}}, |
3412 | 4526 | {"bunctr-", XLOCB(19,BOT,CBSO,528,0), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, | |
3413 | { "sld", XRC(31,27,0), X_MASK, PPC64, { RA, RS, RB } }, | 4527 | {"bsoctrl", XLOCB(19,BOT,CBSO,528,1), XLBOCBBB_MASK, PPCCOM, PPCVLE, {CR}}, |
3414 | { "sld.", XRC(31,27,1), X_MASK, PPC64, { RA, RS, RB } }, | 4528 | {"bsoctrl-",XLOCB(19,BOT,CBSO,528,1), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3415 | 4529 | {"bunctrl", XLOCB(19,BOT,CBSO,528,1), XLBOCBBB_MASK, PPCCOM, PPCVLE, {CR}}, | |
3416 | { "and", XRC(31,28,0), X_MASK, COM, { RA, RS, RB } }, | 4530 | {"bunctrl-",XLOCB(19,BOT,CBSO,528,1), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3417 | { "and.", XRC(31,28,1), X_MASK, COM, { RA, RS, RB } }, | 4531 | {"bltctr+", XLOCB(19,BOTP,CBLT,528,0), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3418 | 4532 | {"bltctrl+",XLOCB(19,BOTP,CBLT,528,1), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, | |
3419 | { "maskg", XRC(31,29,0), X_MASK, M601, { RA, RS, RB } }, | 4533 | {"bgtctr+", XLOCB(19,BOTP,CBGT,528,0), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3420 | { "maskg.", XRC(31,29,1), X_MASK, M601, { RA, RS, RB } }, | 4534 | {"bgtctrl+",XLOCB(19,BOTP,CBGT,528,1), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3421 | 4535 | {"beqctr+", XLOCB(19,BOTP,CBEQ,528,0), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, | |
3422 | { "icbte", X(31,30), X_MASK, BOOKE64, { CT, RA, RB } }, | 4536 | {"beqctrl+",XLOCB(19,BOTP,CBEQ,528,1), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3423 | 4537 | {"bsoctr+", XLOCB(19,BOTP,CBSO,528,0), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, | |
3424 | { "lwzxe", X(31,31), X_MASK, BOOKE64, { RT, RA0, RB } }, | 4538 | {"bunctr+", XLOCB(19,BOTP,CBSO,528,0), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3425 | 4539 | {"bsoctrl+",XLOCB(19,BOTP,CBSO,528,1), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, | |
3426 | { "cmplw", XOPL(31,32,0), XCMPL_MASK, PPCCOM, { OBF, RA, RB } }, | 4540 | {"bunctrl+",XLOCB(19,BOTP,CBSO,528,1), XLBOCBBB_MASK, PPCCOM, ISA_V2|PPCVLE, {CR}}, |
3427 | { "cmpld", XOPL(31,32,1), XCMPL_MASK, PPC64, { OBF, RA, RB } }, | 4541 | {"bltctr-", XLOCB(19,BOTM4,CBLT,528,0), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3428 | { "cmpl", X(31,32), XCMP_MASK, PPC, { BF, L, RA, RB } }, | 4542 | {"bltctrl-",XLOCB(19,BOTM4,CBLT,528,1), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3429 | { "cmpl", X(31,32), XCMPL_MASK, PWRCOM, { BF, RA, RB } }, | 4543 | {"bgtctr-", XLOCB(19,BOTM4,CBGT,528,0), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3430 | 4544 | {"bgtctrl-",XLOCB(19,BOTM4,CBGT,528,1), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, | |
3431 | { "subf", XO(31,40,0,0), XO_MASK, PPC, { RT, RA, RB } }, | 4545 | {"beqctr-", XLOCB(19,BOTM4,CBEQ,528,0), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3432 | { "sub", XO(31,40,0,0), XO_MASK, PPC, { RT, RB, RA } }, | 4546 | {"beqctrl-",XLOCB(19,BOTM4,CBEQ,528,1), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3433 | { "subf.", XO(31,40,0,1), XO_MASK, PPC, { RT, RA, RB } }, | 4547 | {"bsoctr-", XLOCB(19,BOTM4,CBSO,528,0), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3434 | { "sub.", XO(31,40,0,1), XO_MASK, PPC, { RT, RB, RA } }, | 4548 | {"bunctr-", XLOCB(19,BOTM4,CBSO,528,0), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3435 | { "subfo", XO(31,40,1,0), XO_MASK, PPC, { RT, RA, RB } }, | 4549 | {"bsoctrl-",XLOCB(19,BOTM4,CBSO,528,1), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3436 | { "subo", XO(31,40,1,0), XO_MASK, PPC, { RT, RB, RA } }, | 4550 | {"bunctrl-",XLOCB(19,BOTM4,CBSO,528,1), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3437 | { "subfo.", XO(31,40,1,1), XO_MASK, PPC, { RT, RA, RB } }, | 4551 | {"bltctr+", XLOCB(19,BOTP4,CBLT,528,0), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
3438 | { "subo.", XO(31,40,1,1), XO_MASK, PPC, { RT, RB, RA } }, | 4552 | {"bltctrl+",XLOCB(19,BOTP4,CBLT,528,1), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, |
4553 | {"bgtctr+", XLOCB(19,BOTP4,CBGT,528,0), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, | ||
4554 | {"bgtctrl+",XLOCB(19,BOTP4,CBGT,528,1), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, | ||
4555 | {"beqctr+", XLOCB(19,BOTP4,CBEQ,528,0), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, | ||
4556 | {"beqctrl+",XLOCB(19,BOTP4,CBEQ,528,1), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, | ||
4557 | {"bsoctr+", XLOCB(19,BOTP4,CBSO,528,0), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, | ||
4558 | {"bunctr+", XLOCB(19,BOTP4,CBSO,528,0), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, | ||
4559 | {"bsoctrl+",XLOCB(19,BOTP4,CBSO,528,1), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, | ||
4560 | {"bunctrl+",XLOCB(19,BOTP4,CBSO,528,1), XLBOCBBB_MASK, ISA_V2, PPCVLE, {CR}}, | ||
4561 | |||
4562 | {"bfctr", XLO(19,BOF,528,0), XLBOBB_MASK, PPCCOM, PPCVLE, {BI}}, | ||
4563 | {"bfctr-", XLO(19,BOF,528,0), XLBOBB_MASK, PPCCOM, ISA_V2|PPCVLE, {BI}}, | ||
4564 | {"bfctrl", XLO(19,BOF,528,1), XLBOBB_MASK, PPCCOM, PPCVLE, {BI}}, | ||
4565 | {"bfctrl-", XLO(19,BOF,528,1), XLBOBB_MASK, PPCCOM, ISA_V2|PPCVLE, {BI}}, | ||
4566 | {"bfctr+", XLO(19,BOFP,528,0), XLBOBB_MASK, PPCCOM, ISA_V2|PPCVLE, {BI}}, | ||
4567 | {"bfctrl+", XLO(19,BOFP,528,1), XLBOBB_MASK, PPCCOM, ISA_V2|PPCVLE, {BI}}, | ||
4568 | {"bfctr-", XLO(19,BOFM4,528,0), XLBOBB_MASK, ISA_V2, PPCVLE, {BI}}, | ||
4569 | {"bfctrl-", XLO(19,BOFM4,528,1), XLBOBB_MASK, ISA_V2, PPCVLE, {BI}}, | ||
4570 | {"bfctr+", XLO(19,BOFP4,528,0), XLBOBB_MASK, ISA_V2, PPCVLE, {BI}}, | ||
4571 | {"bfctrl+", XLO(19,BOFP4,528,1), XLBOBB_MASK, ISA_V2, PPCVLE, {BI}}, | ||
4572 | {"btctr", XLO(19,BOT,528,0), XLBOBB_MASK, PPCCOM, PPCVLE, {BI}}, | ||
4573 | {"btctr-", XLO(19,BOT,528,0), XLBOBB_MASK, PPCCOM, ISA_V2|PPCVLE, {BI}}, | ||
4574 | {"btctrl", XLO(19,BOT,528,1), XLBOBB_MASK, PPCCOM, PPCVLE, {BI}}, | ||
4575 | {"btctrl-", XLO(19,BOT,528,1), XLBOBB_MASK, PPCCOM, ISA_V2|PPCVLE, {BI}}, | ||
4576 | {"btctr+", XLO(19,BOTP,528,0), XLBOBB_MASK, PPCCOM, ISA_V2|PPCVLE, {BI}}, | ||
4577 | {"btctrl+", XLO(19,BOTP,528,1), XLBOBB_MASK, PPCCOM, ISA_V2|PPCVLE, {BI}}, | ||
4578 | {"btctr-", XLO(19,BOTM4,528,0), XLBOBB_MASK, ISA_V2, PPCVLE, {BI}}, | ||
4579 | {"btctrl-", XLO(19,BOTM4,528,1), XLBOBB_MASK, ISA_V2, PPCVLE, {BI}}, | ||
4580 | {"btctr+", XLO(19,BOTP4,528,0), XLBOBB_MASK, ISA_V2, PPCVLE, {BI}}, | ||
4581 | {"btctrl+", XLO(19,BOTP4,528,1), XLBOBB_MASK, ISA_V2, PPCVLE, {BI}}, | ||
4582 | |||
4583 | {"bcctr-", XLYLK(19,528,0,0), XLYBB_MASK, PPCCOM, PPCVLE, {BOE, BI}}, | ||
4584 | {"bcctrl-", XLYLK(19,528,0,1), XLYBB_MASK, PPCCOM, PPCVLE, {BOE, BI}}, | ||
4585 | {"bcctr+", XLYLK(19,528,1,0), XLYBB_MASK, PPCCOM, PPCVLE, {BOE, BI}}, | ||
4586 | {"bcctrl+", XLYLK(19,528,1,1), XLYBB_MASK, PPCCOM, PPCVLE, {BOE, BI}}, | ||
4587 | {"bcctr", XLLK(19,528,0), XLBH_MASK, PPCCOM, PPCVLE, {BO, BI, BH}}, | ||
4588 | {"bcc", XLLK(19,528,0), XLBB_MASK, PWRCOM, PPCVLE, {BO, BI}}, | ||
4589 | {"bcctrl", XLLK(19,528,1), XLBH_MASK, PPCCOM, PPCVLE, {BO, BI, BH}}, | ||
4590 | {"bccl", XLLK(19,528,1), XLBB_MASK, PWRCOM, PPCVLE, {BO, BI}}, | ||
4591 | |||
4592 | {"bctar-", XLYLK(19,560,0,0), XLYBB_MASK, POWER8, PPCVLE, {BOE, BI}}, | ||
4593 | {"bctarl-", XLYLK(19,560,0,1), XLYBB_MASK, POWER8, PPCVLE, {BOE, BI}}, | ||
4594 | {"bctar+", XLYLK(19,560,1,0), XLYBB_MASK, POWER8, PPCVLE, {BOE, BI}}, | ||
4595 | {"bctarl+", XLYLK(19,560,1,1), XLYBB_MASK, POWER8, PPCVLE, {BOE, BI}}, | ||
4596 | {"bctar", XLLK(19,560,0), XLBH_MASK, POWER8, PPCVLE, {BO, BI, BH}}, | ||
4597 | {"bctarl", XLLK(19,560,1), XLBH_MASK, POWER8, PPCVLE, {BO, BI, BH}}, | ||
4598 | |||
4599 | {"rlwimi", M(20,0), M_MASK, PPCCOM, PPCVLE, {RA, RS, SH, MBE, ME}}, | ||
4600 | {"rlimi", M(20,0), M_MASK, PWRCOM, PPCVLE, {RA, RS, SH, MBE, ME}}, | ||
4601 | |||
4602 | {"rlwimi.", M(20,1), M_MASK, PPCCOM, PPCVLE, {RA, RS, SH, MBE, ME}}, | ||
4603 | {"rlimi.", M(20,1), M_MASK, PWRCOM, PPCVLE, {RA, RS, SH, MBE, ME}}, | ||
4604 | |||
4605 | {"rotlwi", MME(21,31,0), MMBME_MASK, PPCCOM, PPCVLE, {RA, RS, SH}}, | ||
4606 | {"clrlwi", MME(21,31,0), MSHME_MASK, PPCCOM, PPCVLE, {RA, RS, MB}}, | ||
4607 | {"rlwinm", M(21,0), M_MASK, PPCCOM, PPCVLE, {RA, RS, SH, MBE, ME}}, | ||
4608 | {"rlinm", M(21,0), M_MASK, PWRCOM, PPCVLE, {RA, RS, SH, MBE, ME}}, | ||
4609 | {"rotlwi.", MME(21,31,1), MMBME_MASK, PPCCOM, PPCVLE, {RA, RS, SH}}, | ||
4610 | {"clrlwi.", MME(21,31,1), MSHME_MASK, PPCCOM, PPCVLE, {RA, RS, MB}}, | ||
4611 | {"rlwinm.", M(21,1), M_MASK, PPCCOM, PPCVLE, {RA, RS, SH, MBE, ME}}, | ||
4612 | {"rlinm.", M(21,1), M_MASK, PWRCOM, PPCVLE, {RA, RS, SH, MBE, ME}}, | ||
4613 | |||
4614 | {"rlmi", M(22,0), M_MASK, M601, PPCVLE, {RA, RS, RB, MBE, ME}}, | ||
4615 | {"rlmi.", M(22,1), M_MASK, M601, PPCVLE, {RA, RS, RB, MBE, ME}}, | ||
4616 | |||
4617 | {"rotlw", MME(23,31,0), MMBME_MASK, PPCCOM, PPCVLE, {RA, RS, RB}}, | ||
4618 | {"rlwnm", M(23,0), M_MASK, PPCCOM, PPCVLE, {RA, RS, RB, MBE, ME}}, | ||
4619 | {"rlnm", M(23,0), M_MASK, PWRCOM, PPCVLE, {RA, RS, RB, MBE, ME}}, | ||
4620 | {"rotlw.", MME(23,31,1), MMBME_MASK, PPCCOM, PPCVLE, {RA, RS, RB}}, | ||
4621 | {"rlwnm.", M(23,1), M_MASK, PPCCOM, PPCVLE, {RA, RS, RB, MBE, ME}}, | ||
4622 | {"rlnm.", M(23,1), M_MASK, PWRCOM, PPCVLE, {RA, RS, RB, MBE, ME}}, | ||
4623 | |||
4624 | {"nop", OP(24), 0xffffffff, PPCCOM, PPCVLE, {0}}, | ||
4625 | {"ori", OP(24), OP_MASK, PPCCOM, PPCVLE, {RA, RS, UI}}, | ||
4626 | {"oril", OP(24), OP_MASK, PWRCOM, PPCVLE, {RA, RS, UI}}, | ||
4627 | |||
4628 | {"oris", OP(25), OP_MASK, PPCCOM, PPCVLE, {RA, RS, UI}}, | ||
4629 | {"oriu", OP(25), OP_MASK, PWRCOM, PPCVLE, {RA, RS, UI}}, | ||
4630 | |||
4631 | {"xnop", OP(26), 0xffffffff, PPCCOM, PPCVLE, {0}}, | ||
4632 | {"xori", OP(26), OP_MASK, PPCCOM, PPCVLE, {RA, RS, UI}}, | ||
4633 | {"xoril", OP(26), OP_MASK, PWRCOM, PPCVLE, {RA, RS, UI}}, | ||
4634 | |||
4635 | {"xoris", OP(27), OP_MASK, PPCCOM, PPCVLE, {RA, RS, UI}}, | ||
4636 | {"xoriu", OP(27), OP_MASK, PWRCOM, PPCVLE, {RA, RS, UI}}, | ||
4637 | |||
4638 | {"andi.", OP(28), OP_MASK, PPCCOM, PPCVLE, {RA, RS, UI}}, | ||
4639 | {"andil.", OP(28), OP_MASK, PWRCOM, PPCVLE, {RA, RS, UI}}, | ||
4640 | |||
4641 | {"andis.", OP(29), OP_MASK, PPCCOM, PPCVLE, {RA, RS, UI}}, | ||
4642 | {"andiu.", OP(29), OP_MASK, PWRCOM, PPCVLE, {RA, RS, UI}}, | ||
4643 | |||
4644 | {"rotldi", MD(30,0,0), MDMB_MASK, PPC64, PPCVLE, {RA, RS, SH6}}, | ||
4645 | {"clrldi", MD(30,0,0), MDSH_MASK, PPC64, PPCVLE, {RA, RS, MB6}}, | ||
4646 | {"rldicl", MD(30,0,0), MD_MASK, PPC64, PPCVLE, {RA, RS, SH6, MB6}}, | ||
4647 | {"rotldi.", MD(30,0,1), MDMB_MASK, PPC64, PPCVLE, {RA, RS, SH6}}, | ||
4648 | {"clrldi.", MD(30,0,1), MDSH_MASK, PPC64, PPCVLE, {RA, RS, MB6}}, | ||
4649 | {"rldicl.", MD(30,0,1), MD_MASK, PPC64, PPCVLE, {RA, RS, SH6, MB6}}, | ||
4650 | |||
4651 | {"rldicr", MD(30,1,0), MD_MASK, PPC64, PPCVLE, {RA, RS, SH6, ME6}}, | ||
4652 | {"rldicr.", MD(30,1,1), MD_MASK, PPC64, PPCVLE, {RA, RS, SH6, ME6}}, | ||
4653 | |||
4654 | {"rldic", MD(30,2,0), MD_MASK, PPC64, PPCVLE, {RA, RS, SH6, MB6}}, | ||
4655 | {"rldic.", MD(30,2,1), MD_MASK, PPC64, PPCVLE, {RA, RS, SH6, MB6}}, | ||
4656 | |||
4657 | {"rldimi", MD(30,3,0), MD_MASK, PPC64, PPCVLE, {RA, RS, SH6, MB6}}, | ||
4658 | {"rldimi.", MD(30,3,1), MD_MASK, PPC64, PPCVLE, {RA, RS, SH6, MB6}}, | ||
4659 | |||
4660 | {"rotld", MDS(30,8,0), MDSMB_MASK, PPC64, PPCVLE, {RA, RS, RB}}, | ||
4661 | {"rldcl", MDS(30,8,0), MDS_MASK, PPC64, PPCVLE, {RA, RS, RB, MB6}}, | ||
4662 | {"rotld.", MDS(30,8,1), MDSMB_MASK, PPC64, PPCVLE, {RA, RS, RB}}, | ||
4663 | {"rldcl.", MDS(30,8,1), MDS_MASK, PPC64, PPCVLE, {RA, RS, RB, MB6}}, | ||
4664 | |||
4665 | {"rldcr", MDS(30,9,0), MDS_MASK, PPC64, PPCVLE, {RA, RS, RB, ME6}}, | ||
4666 | {"rldcr.", MDS(30,9,1), MDS_MASK, PPC64, PPCVLE, {RA, RS, RB, ME6}}, | ||
4667 | |||
4668 | {"cmpw", XOPL(31,0,0), XCMPL_MASK, PPCCOM, 0, {OBF, RA, RB}}, | ||
4669 | {"cmpd", XOPL(31,0,1), XCMPL_MASK, PPC64, 0, {OBF, RA, RB}}, | ||
4670 | {"cmp", X(31,0), XCMP_MASK, PPC, 0, {BF, L32OPT, RA, RB}}, | ||
4671 | {"cmp", X(31,0), XCMPL_MASK, PWRCOM, PPC, {BF, RA, RB}}, | ||
4672 | |||
4673 | {"twlgt", XTO(31,4,TOLGT), XTO_MASK, PPCCOM, 0, {RA, RB}}, | ||
4674 | {"tlgt", XTO(31,4,TOLGT), XTO_MASK, PWRCOM, 0, {RA, RB}}, | ||
4675 | {"twllt", XTO(31,4,TOLLT), XTO_MASK, PPCCOM, 0, {RA, RB}}, | ||
4676 | {"tllt", XTO(31,4,TOLLT), XTO_MASK, PWRCOM, 0, {RA, RB}}, | ||
4677 | {"tweq", XTO(31,4,TOEQ), XTO_MASK, PPCCOM, 0, {RA, RB}}, | ||
4678 | {"teq", XTO(31,4,TOEQ), XTO_MASK, PWRCOM, 0, {RA, RB}}, | ||
4679 | {"twlge", XTO(31,4,TOLGE), XTO_MASK, PPCCOM, 0, {RA, RB}}, | ||
4680 | {"tlge", XTO(31,4,TOLGE), XTO_MASK, PWRCOM, 0, {RA, RB}}, | ||
4681 | {"twlnl", XTO(31,4,TOLNL), XTO_MASK, PPCCOM, 0, {RA, RB}}, | ||
4682 | {"tlnl", XTO(31,4,TOLNL), XTO_MASK, PWRCOM, 0, {RA, RB}}, | ||
4683 | {"twlle", XTO(31,4,TOLLE), XTO_MASK, PPCCOM, 0, {RA, RB}}, | ||
4684 | {"tlle", XTO(31,4,TOLLE), XTO_MASK, PWRCOM, 0, {RA, RB}}, | ||
4685 | {"twlng", XTO(31,4,TOLNG), XTO_MASK, PPCCOM, 0, {RA, RB}}, | ||
4686 | {"tlng", XTO(31,4,TOLNG), XTO_MASK, PWRCOM, 0, {RA, RB}}, | ||
4687 | {"twgt", XTO(31,4,TOGT), XTO_MASK, PPCCOM, 0, {RA, RB}}, | ||
4688 | {"tgt", XTO(31,4,TOGT), XTO_MASK, PWRCOM, 0, {RA, RB}}, | ||
4689 | {"twge", XTO(31,4,TOGE), XTO_MASK, PPCCOM, 0, {RA, RB}}, | ||
4690 | {"tge", XTO(31,4,TOGE), XTO_MASK, PWRCOM, 0, {RA, RB}}, | ||
4691 | {"twnl", XTO(31,4,TONL), XTO_MASK, PPCCOM, 0, {RA, RB}}, | ||
4692 | {"tnl", XTO(31,4,TONL), XTO_MASK, PWRCOM, 0, {RA, RB}}, | ||
4693 | {"twlt", XTO(31,4,TOLT), XTO_MASK, PPCCOM, 0, {RA, RB}}, | ||
4694 | {"tlt", XTO(31,4,TOLT), XTO_MASK, PWRCOM, 0, {RA, RB}}, | ||
4695 | {"twle", XTO(31,4,TOLE), XTO_MASK, PPCCOM, 0, {RA, RB}}, | ||
4696 | {"tle", XTO(31,4,TOLE), XTO_MASK, PWRCOM, 0, {RA, RB}}, | ||
4697 | {"twng", XTO(31,4,TONG), XTO_MASK, PPCCOM, 0, {RA, RB}}, | ||
4698 | {"tng", XTO(31,4,TONG), XTO_MASK, PWRCOM, 0, {RA, RB}}, | ||
4699 | {"twne", XTO(31,4,TONE), XTO_MASK, PPCCOM, 0, {RA, RB}}, | ||
4700 | {"tne", XTO(31,4,TONE), XTO_MASK, PWRCOM, 0, {RA, RB}}, | ||
4701 | {"trap", XTO(31,4,TOU), 0xffffffff, PPCCOM, 0, {0}}, | ||
4702 | {"twu", XTO(31,4,TOU), XTO_MASK, PPCCOM, 0, {RA, RB}}, | ||
4703 | {"tu", XTO(31,4,TOU), XTO_MASK, PWRCOM, 0, {RA, RB}}, | ||
4704 | {"tw", X(31,4), X_MASK, PPCCOM, 0, {TO, RA, RB}}, | ||
4705 | {"t", X(31,4), X_MASK, PWRCOM, 0, {TO, RA, RB}}, | ||
4706 | |||
4707 | {"lvsl", X(31,6), X_MASK, PPCVEC, 0, {VD, RA0, RB}}, | ||
4708 | {"lvebx", X(31,7), X_MASK, PPCVEC, 0, {VD, RA0, RB}}, | ||
4709 | {"lbfcmx", APU(31,7,0), APU_MASK, PPC405, 0, {FCRT, RA, RB}}, | ||
4710 | |||
4711 | {"subfc", XO(31,8,0,0), XO_MASK, PPCCOM, 0, {RT, RA, RB}}, | ||
4712 | {"sf", XO(31,8,0,0), XO_MASK, PWRCOM, 0, {RT, RA, RB}}, | ||
4713 | {"subc", XO(31,8,0,0), XO_MASK, PPCCOM, 0, {RT, RB, RA}}, | ||
4714 | {"subfc.", XO(31,8,0,1), XO_MASK, PPCCOM, 0, {RT, RA, RB}}, | ||
4715 | {"sf.", XO(31,8,0,1), XO_MASK, PWRCOM, 0, {RT, RA, RB}}, | ||
4716 | {"subc.", XO(31,8,0,1), XO_MASK, PPCCOM, 0, {RT, RB, RA}}, | ||
4717 | |||
4718 | {"mulhdu", XO(31,9,0,0), XO_MASK, PPC64, 0, {RT, RA, RB}}, | ||
4719 | {"mulhdu.", XO(31,9,0,1), XO_MASK, PPC64, 0, {RT, RA, RB}}, | ||
4720 | |||
4721 | {"addc", XO(31,10,0,0), XO_MASK, PPCCOM, 0, {RT, RA, RB}}, | ||
4722 | {"a", XO(31,10,0,0), XO_MASK, PWRCOM, 0, {RT, RA, RB}}, | ||
4723 | {"addc.", XO(31,10,0,1), XO_MASK, PPCCOM, 0, {RT, RA, RB}}, | ||
4724 | {"a.", XO(31,10,0,1), XO_MASK, PWRCOM, 0, {RT, RA, RB}}, | ||
4725 | |||
4726 | {"mulhwu", XO(31,11,0,0), XO_MASK, PPC, 0, {RT, RA, RB}}, | ||
4727 | {"mulhwu.", XO(31,11,0,1), XO_MASK, PPC, 0, {RT, RA, RB}}, | ||
4728 | |||
4729 | {"lxsiwzx", X(31,12), XX1_MASK, PPCVSX2, 0, {XT6, RA0, RB}}, | ||
4730 | |||
4731 | {"isellt", X(31,15), X_MASK, PPCISEL, 0, {RT, RA0, RB}}, | ||
4732 | |||
4733 | {"tlbilxlpid", XTO(31,18,0), XTO_MASK, E500MC|PPCA2, 0, {0}}, | ||
4734 | {"tlbilxpid", XTO(31,18,1), XTO_MASK, E500MC|PPCA2, 0, {0}}, | ||
4735 | {"tlbilxva", XTO(31,18,3), XTO_MASK, E500MC|PPCA2, 0, {RA0, RB}}, | ||
4736 | {"tlbilx", X(31,18), X_MASK, E500MC|PPCA2, 0, {T, RA0, RB}}, | ||
4737 | |||
4738 | {"mfcr", XFXM(31,19,0,0), XFXFXM_MASK, COM, 0, {RT, FXM4}}, | ||
4739 | {"mfocrf", XFXM(31,19,0,1), XFXFXM_MASK, COM, 0, {RT, FXM}}, | ||
4740 | |||
4741 | {"lwarx", X(31,20), XEH_MASK, PPC, 0, {RT, RA0, RB, EH}}, | ||
4742 | |||
4743 | {"ldx", X(31,21), X_MASK, PPC64, 0, {RT, RA0, RB}}, | ||
4744 | |||
4745 | {"icbt", X(31,22), X_MASK, BOOKE|PPCE300|PPCA2|PPC476, 0, {CT, RA0, RB}}, | ||
4746 | |||
4747 | {"lwzx", X(31,23), X_MASK, PPCCOM, 0, {RT, RA0, RB}}, | ||
4748 | {"lx", X(31,23), X_MASK, PWRCOM, 0, {RT, RA, RB}}, | ||
4749 | |||
4750 | {"slw", XRC(31,24,0), X_MASK, PPCCOM, 0, {RA, RS, RB}}, | ||
4751 | {"sl", XRC(31,24,0), X_MASK, PWRCOM, 0, {RA, RS, RB}}, | ||
4752 | {"slw.", XRC(31,24,1), X_MASK, PPCCOM, 0, {RA, RS, RB}}, | ||
4753 | {"sl.", XRC(31,24,1), X_MASK, PWRCOM, 0, {RA, RS, RB}}, | ||
4754 | |||
4755 | {"cntlzw", XRC(31,26,0), XRB_MASK, PPCCOM, 0, {RA, RS}}, | ||
4756 | {"cntlz", XRC(31,26,0), XRB_MASK, PWRCOM, 0, {RA, RS}}, | ||
4757 | {"cntlzw.", XRC(31,26,1), XRB_MASK, PPCCOM, 0, {RA, RS}}, | ||
4758 | {"cntlz.", XRC(31,26,1), XRB_MASK, PWRCOM, 0, {RA, RS}}, | ||
4759 | |||
4760 | {"sld", XRC(31,27,0), X_MASK, PPC64, 0, {RA, RS, RB}}, | ||
4761 | {"sld.", XRC(31,27,1), X_MASK, PPC64, 0, {RA, RS, RB}}, | ||
4762 | |||
4763 | {"and", XRC(31,28,0), X_MASK, COM, 0, {RA, RS, RB}}, | ||
4764 | {"and.", XRC(31,28,1), X_MASK, COM, 0, {RA, RS, RB}}, | ||
4765 | |||
4766 | {"maskg", XRC(31,29,0), X_MASK, M601, PPCA2, {RA, RS, RB}}, | ||
4767 | {"maskg.", XRC(31,29,1), X_MASK, M601, PPCA2, {RA, RS, RB}}, | ||
4768 | |||
4769 | {"ldepx", X(31,29), X_MASK, E500MC|PPCA2, 0, {RT, RA0, RB}}, | ||
4770 | |||
4771 | {"waitasec", X(31,30), XRTRARB_MASK, POWER8, POWER9, {0}}, | ||
4772 | {"wait", X(31,30), XWC_MASK, POWER9, 0, {WC}}, | ||
4773 | |||
4774 | {"lwepx", X(31,31), X_MASK, E500MC|PPCA2, 0, {RT, RA0, RB}}, | ||
4775 | |||
4776 | {"cmplw", XOPL(31,32,0), XCMPL_MASK, PPCCOM, 0, {OBF, RA, RB}}, | ||
4777 | {"cmpld", XOPL(31,32,1), XCMPL_MASK, PPC64, 0, {OBF, RA, RB}}, | ||
4778 | {"cmpl", X(31,32), XCMP_MASK, PPC, 0, {BF, L32OPT, RA, RB}}, | ||
4779 | {"cmpl", X(31,32), XCMPL_MASK, PWRCOM, PPC, {BF, RA, RB}}, | ||
4780 | |||
4781 | {"lvsr", X(31,38), X_MASK, PPCVEC, 0, {VD, RA0, RB}}, | ||
4782 | {"lvehx", X(31,39), X_MASK, PPCVEC, 0, {VD, RA0, RB}}, | ||
4783 | {"lhfcmx", APU(31,39,0), APU_MASK, PPC405, 0, {FCRT, RA, RB}}, | ||
4784 | |||
4785 | {"mviwsplt", X(31,46), X_MASK, PPCVEC2, 0, {VD, RA, RB}}, | ||
4786 | |||
4787 | {"iselgt", X(31,47), X_MASK, PPCISEL, 0, {RT, RA0, RB}}, | ||
4788 | |||
4789 | {"lvewx", X(31,71), X_MASK, PPCVEC, 0, {VD, RA0, RB}}, | ||
4790 | |||
4791 | {"addg6s", XO(31,74,0,0), XO_MASK, POWER6, 0, {RT, RA, RB}}, | ||
4792 | |||
4793 | {"lxsiwax", X(31,76), XX1_MASK, PPCVSX2, 0, {XT6, RA0, RB}}, | ||
4794 | |||
4795 | {"iseleq", X(31,79), X_MASK, PPCISEL, 0, {RT, RA0, RB}}, | ||
4796 | |||
4797 | {"isel", XISEL(31,15), XISEL_MASK, PPCISEL|TITAN, 0, {RT, RA0, RB, CRB}}, | ||
4798 | |||
4799 | {"subf", XO(31,40,0,0), XO_MASK, PPC, 0, {RT, RA, RB}}, | ||
4800 | {"sub", XO(31,40,0,0), XO_MASK, PPC, 0, {RT, RB, RA}}, | ||
4801 | {"subf.", XO(31,40,0,1), XO_MASK, PPC, 0, {RT, RA, RB}}, | ||
4802 | {"sub.", XO(31,40,0,1), XO_MASK, PPC, 0, {RT, RB, RA}}, | ||
4803 | |||
4804 | {"mfvsrd", X(31,51), XX1RB_MASK, PPCVSX2, 0, {RA, XS6}}, | ||
4805 | {"mffprd", X(31,51), XX1RB_MASK|1, PPCVSX2, 0, {RA, FRS}}, | ||
4806 | {"mfvrd", X(31,51)|1, XX1RB_MASK|1, PPCVSX2, 0, {RA, VS}}, | ||
4807 | {"eratilx", X(31,51), X_MASK, PPCA2, 0, {ERAT_T, RA, RB}}, | ||
4808 | |||
4809 | {"lbarx", X(31,52), XEH_MASK, POWER8|E6500, 0, {RT, RA0, RB, EH}}, | ||
4810 | |||
4811 | {"ldux", X(31,53), X_MASK, PPC64, 0, {RT, RAL, RB}}, | ||
4812 | |||
4813 | {"dcbst", X(31,54), XRT_MASK, PPC, 0, {RA0, RB}}, | ||
4814 | |||
4815 | {"lwzux", X(31,55), X_MASK, PPCCOM, 0, {RT, RAL, RB}}, | ||
4816 | {"lux", X(31,55), X_MASK, PWRCOM, 0, {RT, RA, RB}}, | ||
4817 | |||
4818 | {"cntlzd", XRC(31,58,0), XRB_MASK, PPC64, 0, {RA, RS}}, | ||
4819 | {"cntlzd.", XRC(31,58,1), XRB_MASK, PPC64, 0, {RA, RS}}, | ||
4820 | |||
4821 | {"andc", XRC(31,60,0), X_MASK, COM, 0, {RA, RS, RB}}, | ||
4822 | {"andc.", XRC(31,60,1), X_MASK, COM, 0, {RA, RS, RB}}, | ||
4823 | |||
4824 | {"waitrsv", X(31,62)|(1<<21), 0xffffffff, E500MC|PPCA2, 0, {0}}, | ||
4825 | {"waitimpl", X(31,62)|(2<<21), 0xffffffff, E500MC|PPCA2, 0, {0}}, | ||
4826 | {"wait", X(31,62), XWC_MASK, E500MC|PPCA2, 0, {WC}}, | ||
4827 | |||
4828 | {"dcbstep", XRT(31,63,0), XRT_MASK, E500MC|PPCA2, 0, {RA0, RB}}, | ||
4829 | |||
4830 | {"tdlgt", XTO(31,68,TOLGT), XTO_MASK, PPC64, 0, {RA, RB}}, | ||
4831 | {"tdllt", XTO(31,68,TOLLT), XTO_MASK, PPC64, 0, {RA, RB}}, | ||
4832 | {"tdeq", XTO(31,68,TOEQ), XTO_MASK, PPC64, 0, {RA, RB}}, | ||
4833 | {"tdlge", XTO(31,68,TOLGE), XTO_MASK, PPC64, 0, {RA, RB}}, | ||
4834 | {"tdlnl", XTO(31,68,TOLNL), XTO_MASK, PPC64, 0, {RA, RB}}, | ||
4835 | {"tdlle", XTO(31,68,TOLLE), XTO_MASK, PPC64, 0, {RA, RB}}, | ||
4836 | {"tdlng", XTO(31,68,TOLNG), XTO_MASK, PPC64, 0, {RA, RB}}, | ||
4837 | {"tdgt", XTO(31,68,TOGT), XTO_MASK, PPC64, 0, {RA, RB}}, | ||
4838 | {"tdge", XTO(31,68,TOGE), XTO_MASK, PPC64, 0, {RA, RB}}, | ||
4839 | {"tdnl", XTO(31,68,TONL), XTO_MASK, PPC64, 0, {RA, RB}}, | ||
4840 | {"tdlt", XTO(31,68,TOLT), XTO_MASK, PPC64, 0, {RA, RB}}, | ||
4841 | {"tdle", XTO(31,68,TOLE), XTO_MASK, PPC64, 0, {RA, RB}}, | ||
4842 | {"tdng", XTO(31,68,TONG), XTO_MASK, PPC64, 0, {RA, RB}}, | ||
4843 | {"tdne", XTO(31,68,TONE), XTO_MASK, PPC64, 0, {RA, RB}}, | ||
4844 | {"tdu", XTO(31,68,TOU), XTO_MASK, PPC64, 0, {RA, RB}}, | ||
4845 | {"td", X(31,68), X_MASK, PPC64, 0, {TO, RA, RB}}, | ||
4846 | |||
4847 | {"lwfcmx", APU(31,71,0), APU_MASK, PPC405, 0, {FCRT, RA, RB}}, | ||
4848 | {"mulhd", XO(31,73,0,0), XO_MASK, PPC64, 0, {RT, RA, RB}}, | ||
4849 | {"mulhd.", XO(31,73,0,1), XO_MASK, PPC64, 0, {RT, RA, RB}}, | ||
4850 | |||
4851 | {"mulhw", XO(31,75,0,0), XO_MASK, PPC, 0, {RT, RA, RB}}, | ||
4852 | {"mulhw.", XO(31,75,0,1), XO_MASK, PPC, 0, {RT, RA, RB}}, | ||
4853 | |||
4854 | {"dlmzb", XRC(31,78,0), X_MASK, PPC403|PPC440|TITAN, 0, {RA, RS, RB}}, | ||
4855 | {"dlmzb.", XRC(31,78,1), X_MASK, PPC403|PPC440|TITAN, 0, {RA, RS, RB}}, | ||
4856 | |||
4857 | {"mtsrd", X(31,82), XRB_MASK|(1<<20), PPC64, 0, {SR, RS}}, | ||
4858 | |||
4859 | {"mfmsr", X(31,83), XRARB_MASK, COM, 0, {RT}}, | ||
4860 | |||
4861 | {"ldarx", X(31,84), XEH_MASK, PPC64, 0, {RT, RA0, RB, EH}}, | ||
4862 | |||
4863 | {"dcbfl", XOPL(31,86,1), XRT_MASK, POWER5, PPC476, {RA0, RB}}, | ||
4864 | {"dcbf", X(31,86), XLRT_MASK, PPC, 0, {RA0, RB, L2OPT}}, | ||
4865 | |||
4866 | {"lbzx", X(31,87), X_MASK, COM, 0, {RT, RA0, RB}}, | ||
4867 | |||
4868 | {"lbepx", X(31,95), X_MASK, E500MC|PPCA2, 0, {RT, RA0, RB}}, | ||
4869 | |||
4870 | {"dni", XRC(31,97,1), XRB_MASK, E6500, 0, {DUI, DCTL}}, | ||
4871 | |||
4872 | {"lvx", X(31,103), X_MASK, PPCVEC, 0, {VD, RA0, RB}}, | ||
4873 | {"lqfcmx", APU(31,103,0), APU_MASK, PPC405, 0, {FCRT, RA, RB}}, | ||
4874 | |||
4875 | {"neg", XO(31,104,0,0), XORB_MASK, COM, 0, {RT, RA}}, | ||
4876 | {"neg.", XO(31,104,0,1), XORB_MASK, COM, 0, {RT, RA}}, | ||
4877 | |||
4878 | {"mul", XO(31,107,0,0), XO_MASK, M601, 0, {RT, RA, RB}}, | ||
4879 | {"mul.", XO(31,107,0,1), XO_MASK, M601, 0, {RT, RA, RB}}, | ||
4880 | |||
4881 | {"mvidsplt", X(31,110), X_MASK, PPCVEC2, 0, {VD, RA, RB}}, | ||
4882 | |||
4883 | {"mtsrdin", X(31,114), XRA_MASK, PPC64, 0, {RS, RB}}, | ||
4884 | |||
4885 | {"mffprwz", X(31,115), XX1RB_MASK|1, PPCVSX2, 0, {RA, FRS}}, | ||
4886 | {"mfvrwz", X(31,115)|1, XX1RB_MASK|1, PPCVSX2, 0, {RA, VS}}, | ||
4887 | {"mfvsrwz", X(31,115), XX1RB_MASK, PPCVSX2, 0, {RA, XS6}}, | ||
4888 | |||
4889 | {"lharx", X(31,116), XEH_MASK, POWER8|E6500, 0, {RT, RA0, RB, EH}}, | ||
4890 | |||
4891 | {"clf", X(31,118), XTO_MASK, POWER, 0, {RA, RB}}, | ||
4892 | |||
4893 | {"lbzux", X(31,119), X_MASK, COM, 0, {RT, RAL, RB}}, | ||
4894 | |||
4895 | {"popcntb", X(31,122), XRB_MASK, POWER5, 0, {RA, RS}}, | ||
4896 | |||
4897 | {"not", XRC(31,124,0), X_MASK, COM, 0, {RA, RS, RBS}}, | ||
4898 | {"nor", XRC(31,124,0), X_MASK, COM, 0, {RA, RS, RB}}, | ||
4899 | {"not.", XRC(31,124,1), X_MASK, COM, 0, {RA, RS, RBS}}, | ||
4900 | {"nor.", XRC(31,124,1), X_MASK, COM, 0, {RA, RS, RB}}, | ||
4901 | |||
4902 | {"dcbfep", XRT(31,127,0), XRT_MASK, E500MC|PPCA2, 0, {RA0, RB}}, | ||
4903 | |||
4904 | {"setb", X(31,128), XRB_MASK|(3<<16), POWER9, 0, {RT, BFA}}, | ||
4905 | |||
4906 | {"wrtee", X(31,131), XRARB_MASK, PPC403|BOOKE|PPCA2|PPC476, 0, {RS}}, | ||
4907 | |||
4908 | {"dcbtstls", X(31,134), X_MASK, PPCCHLK|PPC476|TITAN, 0, {CT, RA0, RB}}, | ||
4909 | |||
4910 | {"stvebx", X(31,135), X_MASK, PPCVEC, 0, {VS, RA0, RB}}, | ||
4911 | {"stbfcmx", APU(31,135,0), APU_MASK, PPC405, 0, {FCRT, RA, RB}}, | ||
4912 | |||
4913 | {"subfe", XO(31,136,0,0), XO_MASK, PPCCOM, 0, {RT, RA, RB}}, | ||
4914 | {"sfe", XO(31,136,0,0), XO_MASK, PWRCOM, 0, {RT, RA, RB}}, | ||
4915 | {"subfe.", XO(31,136,0,1), XO_MASK, PPCCOM, 0, {RT, RA, RB}}, | ||
4916 | {"sfe.", XO(31,136,0,1), XO_MASK, PWRCOM, 0, {RT, RA, RB}}, | ||
4917 | |||
4918 | {"adde", XO(31,138,0,0), XO_MASK, PPCCOM, 0, {RT, RA, RB}}, | ||
4919 | {"ae", XO(31,138,0,0), XO_MASK, PWRCOM, 0, {RT, RA, RB}}, | ||
4920 | {"adde.", XO(31,138,0,1), XO_MASK, PPCCOM, 0, {RT, RA, RB}}, | ||
4921 | {"ae.", XO(31,138,0,1), XO_MASK, PWRCOM, 0, {RT, RA, RB}}, | ||
4922 | |||
4923 | {"stxsiwx", X(31,140), XX1_MASK, PPCVSX2, 0, {XS6, RA0, RB}}, | ||
4924 | |||
4925 | {"msgsndp", XRTRA(31,142,0,0), XRTRA_MASK, POWER8, 0, {RB}}, | ||
4926 | {"dcbtstlse", X(31,142), X_MASK, PPCCHLK, E500MC, {CT, RA0, RB}}, | ||
4927 | |||
4928 | {"mtcr", XFXM(31,144,0xff,0), XRARB_MASK, COM, 0, {RS}}, | ||
4929 | {"mtcrf", XFXM(31,144,0,0), XFXFXM_MASK, COM, 0, {FXM, RS}}, | ||
4930 | {"mtocrf", XFXM(31,144,0,1), XFXFXM_MASK, COM, 0, {FXM, RS}}, | ||
4931 | |||
4932 | {"mtmsr", X(31,146), XRLARB_MASK, COM, 0, {RS, A_L}}, | ||
4933 | |||
4934 | {"mtsle", X(31,147), XRTLRARB_MASK, POWER8, 0, {L}}, | ||
3439 | 4935 | ||
3440 | { "ldux", X(31,53), X_MASK, PPC64, { RT, RAL, RB } }, | 4936 | {"eratsx", XRC(31,147,0), X_MASK, PPCA2, 0, {RT, RA0, RB}}, |
4937 | {"eratsx.", XRC(31,147,1), X_MASK, PPCA2, 0, {RT, RA0, RB}}, | ||
3441 | 4938 | ||
3442 | { "dcbst", X(31,54), XRT_MASK, PPC, { RA, RB } }, | 4939 | {"stdx", X(31,149), X_MASK, PPC64, 0, {RS, RA0, RB}}, |
3443 | 4940 | ||
3444 | { "lwzux", X(31,55), X_MASK, PPCCOM, { RT, RAL, RB } }, | 4941 | {"stwcx.", XRC(31,150,1), X_MASK, PPC, 0, {RS, RA0, RB}}, |
3445 | { "lux", X(31,55), X_MASK, PWRCOM, { RT, RA, RB } }, | ||
3446 | 4942 | ||
3447 | { "dcbste", X(31,62), XRT_MASK, BOOKE64, { RA, RB } }, | 4943 | {"stwx", X(31,151), X_MASK, PPCCOM, 0, {RS, RA0, RB}}, |
4944 | {"stx", X(31,151), X_MASK, PWRCOM, 0, {RS, RA, RB}}, | ||
3448 | 4945 | ||
3449 | { "lwzuxe", X(31,63), X_MASK, BOOKE64, { RT, RAL, RB } }, | 4946 | {"slq", XRC(31,152,0), X_MASK, M601, 0, {RA, RS, RB}}, |
4947 | {"slq.", XRC(31,152,1), X_MASK, M601, 0, {RA, RS, RB}}, | ||
3450 | 4948 | ||
3451 | { "cntlzd", XRC(31,58,0), XRB_MASK, PPC64, { RA, RS } }, | 4949 | {"sle", XRC(31,153,0), X_MASK, M601, 0, {RA, RS, RB}}, |
3452 | { "cntlzd.", XRC(31,58,1), XRB_MASK, PPC64, { RA, RS } }, | 4950 | {"sle.", XRC(31,153,1), X_MASK, M601, 0, {RA, RS, RB}}, |
3453 | 4951 | ||
3454 | { "andc", XRC(31,60,0), X_MASK, COM, { RA, RS, RB } }, | 4952 | {"prtyw", X(31,154), XRB_MASK, POWER6|PPCA2|PPC476, 0, {RA, RS}}, |
3455 | { "andc.", XRC(31,60,1), X_MASK, COM, { RA, RS, RB } }, | ||
3456 | 4953 | ||
3457 | { "tdlgt", XTO(31,68,TOLGT), XTO_MASK, PPC64, { RA, RB } }, | 4954 | {"stdepx", X(31,157), X_MASK, E500MC|PPCA2, 0, {RS, RA0, RB}}, |
3458 | { "tdllt", XTO(31,68,TOLLT), XTO_MASK, PPC64, { RA, RB } }, | ||
3459 | { "tdeq", XTO(31,68,TOEQ), XTO_MASK, PPC64, { RA, RB } }, | ||
3460 | { "tdlge", XTO(31,68,TOLGE), XTO_MASK, PPC64, { RA, RB } }, | ||
3461 | { "tdlnl", XTO(31,68,TOLNL), XTO_MASK, PPC64, { RA, RB } }, | ||
3462 | { "tdlle", XTO(31,68,TOLLE), XTO_MASK, PPC64, { RA, RB } }, | ||
3463 | { "tdlng", XTO(31,68,TOLNG), XTO_MASK, PPC64, { RA, RB } }, | ||
3464 | { "tdgt", XTO(31,68,TOGT), XTO_MASK, PPC64, { RA, RB } }, | ||
3465 | { "tdge", XTO(31,68,TOGE), XTO_MASK, PPC64, { RA, RB } }, | ||
3466 | { "tdnl", XTO(31,68,TONL), XTO_MASK, PPC64, { RA, RB } }, | ||
3467 | { "tdlt", XTO(31,68,TOLT), XTO_MASK, PPC64, { RA, RB } }, | ||
3468 | { "tdle", XTO(31,68,TOLE), XTO_MASK, PPC64, { RA, RB } }, | ||
3469 | { "tdng", XTO(31,68,TONG), XTO_MASK, PPC64, { RA, RB } }, | ||
3470 | { "tdne", XTO(31,68,TONE), XTO_MASK, PPC64, { RA, RB } }, | ||
3471 | { "td", X(31,68), X_MASK, PPC64, { TO, RA, RB } }, | ||
3472 | 4955 | ||
3473 | { "mulhd", XO(31,73,0,0), XO_MASK, PPC64, { RT, RA, RB } }, | 4956 | {"stwepx", X(31,159), X_MASK, E500MC|PPCA2, 0, {RS, RA0, RB}}, |
3474 | { "mulhd.", XO(31,73,0,1), XO_MASK, PPC64, { RT, RA, RB } }, | ||
3475 | 4957 | ||
3476 | { "mulhw", XO(31,75,0,0), XO_MASK, PPC, { RT, RA, RB } }, | 4958 | {"wrteei", X(31,163), XE_MASK, PPC403|BOOKE|PPCA2|PPC476, 0, {E}}, |
3477 | { "mulhw.", XO(31,75,0,1), XO_MASK, PPC, { RT, RA, RB } }, | ||
3478 | 4959 | ||
3479 | { "dlmzb", XRC(31,78,0), X_MASK, PPC403|PPC440, { RA, RS, RB } }, | 4960 | {"dcbtls", X(31,166), X_MASK, PPCCHLK|PPC476|TITAN, 0, {CT, RA0, RB}}, |
3480 | { "dlmzb.", XRC(31,78,1), X_MASK, PPC403|PPC440, { RA, RS, RB } }, | ||
3481 | 4961 | ||
3482 | { "mtsrd", X(31,82), XRB_MASK|(1<<20), PPC64, { SR, RS } }, | 4962 | {"stvehx", X(31,167), X_MASK, PPCVEC, 0, {VS, RA0, RB}}, |
4963 | {"sthfcmx", APU(31,167,0), APU_MASK, PPC405, 0, {FCRT, RA, RB}}, | ||
3483 | 4964 | ||
3484 | { "mfmsr", X(31,83), XRARB_MASK, COM, { RT } }, | 4965 | {"addex", ZRC(31,170,0), Z2_MASK, POWER9, 0, {RT, RA, RB, CY}}, |
3485 | 4966 | ||
3486 | { "ldarx", X(31,84), XEH_MASK, PPC64, { RT, RA0, RB, EH } }, | 4967 | {"msgclrp", XRTRA(31,174,0,0), XRTRA_MASK, POWER8, 0, {RB}}, |
4968 | {"dcbtlse", X(31,174), X_MASK, PPCCHLK, E500MC, {CT, RA0, RB}}, | ||
3487 | 4969 | ||
3488 | { "dcbfl", XOPL(31,86,1), XRT_MASK, POWER5, { RA, RB } }, | 4970 | {"mtmsrd", X(31,178), XRLARB_MASK, PPC64, 0, {RS, A_L}}, |
3489 | { "dcbf", X(31,86), XLRT_MASK, PPC, { RA, RB, XRT_L } }, | ||
3490 | 4971 | ||
3491 | { "lbzx", X(31,87), X_MASK, COM, { RT, RA0, RB } }, | 4972 | {"mtvsrd", X(31,179), XX1RB_MASK, PPCVSX2, 0, {XT6, RA}}, |
4973 | {"mtfprd", X(31,179), XX1RB_MASK|1, PPCVSX2, 0, {FRT, RA}}, | ||
4974 | {"mtvrd", X(31,179)|1, XX1RB_MASK|1, PPCVSX2, 0, {VD, RA}}, | ||
4975 | {"eratre", X(31,179), X_MASK, PPCA2, 0, {RT, RA, WS}}, | ||
3492 | 4976 | ||
3493 | { "dcbfe", X(31,94), XRT_MASK, BOOKE64, { RA, RB } }, | 4977 | {"stdux", X(31,181), X_MASK, PPC64, 0, {RS, RAS, RB}}, |
3494 | 4978 | ||
3495 | { "lbzxe", X(31,95), X_MASK, BOOKE64, { RT, RA0, RB } }, | 4979 | {"stqcx.", XRC(31,182,1), X_MASK, POWER8, 0, {RSQ, RA0, RB}}, |
4980 | {"wchkall", X(31,182), X_MASK, PPCA2, 0, {OBF}}, | ||
3496 | 4981 | ||
3497 | { "neg", XO(31,104,0,0), XORB_MASK, COM, { RT, RA } }, | 4982 | {"stwux", X(31,183), X_MASK, PPCCOM, 0, {RS, RAS, RB}}, |
3498 | { "neg.", XO(31,104,0,1), XORB_MASK, COM, { RT, RA } }, | 4983 | {"stux", X(31,183), X_MASK, PWRCOM, 0, {RS, RA0, RB}}, |
3499 | { "nego", XO(31,104,1,0), XORB_MASK, COM, { RT, RA } }, | ||
3500 | { "nego.", XO(31,104,1,1), XORB_MASK, COM, { RT, RA } }, | ||
3501 | 4984 | ||
3502 | { "mul", XO(31,107,0,0), XO_MASK, M601, { RT, RA, RB } }, | 4985 | {"sliq", XRC(31,184,0), X_MASK, M601, 0, {RA, RS, SH}}, |
3503 | { "mul.", XO(31,107,0,1), XO_MASK, M601, { RT, RA, RB } }, | 4986 | {"sliq.", XRC(31,184,1), X_MASK, M601, 0, {RA, RS, SH}}, |
3504 | { "mulo", XO(31,107,1,0), XO_MASK, M601, { RT, RA, RB } }, | ||
3505 | { "mulo.", XO(31,107,1,1), XO_MASK, M601, { RT, RA, RB } }, | ||
3506 | 4987 | ||
3507 | { "mtsrdin", X(31,114), XRA_MASK, PPC64, { RS, RB } }, | 4988 | {"prtyd", X(31,186), XRB_MASK, POWER6|PPCA2, 0, {RA, RS}}, |
3508 | 4989 | ||
3509 | { "clf", X(31,118), XTO_MASK, POWER, { RA, RB } }, | 4990 | {"cmprb", X(31,192), XCMP_MASK, POWER9, 0, {BF, L, RA, RB}}, |
3510 | 4991 | ||
3511 | { "lbzux", X(31,119), X_MASK, COM, { RT, RAL, RB } }, | 4992 | {"icblq.", XRC(31,198,1), X_MASK, E6500, 0, {CT, RA0, RB}}, |
3512 | 4993 | ||
3513 | { "popcntb", X(31,122), XRB_MASK, POWER5, { RA, RS } }, | 4994 | {"stvewx", X(31,199), X_MASK, PPCVEC, 0, {VS, RA0, RB}}, |
4995 | {"stwfcmx", APU(31,199,0), APU_MASK, PPC405, 0, {FCRT, RA, RB}}, | ||
3514 | 4996 | ||
3515 | { "not", XRC(31,124,0), X_MASK, COM, { RA, RS, RBS } }, | 4997 | {"subfze", XO(31,200,0,0), XORB_MASK, PPCCOM, 0, {RT, RA}}, |
3516 | { "nor", XRC(31,124,0), X_MASK, COM, { RA, RS, RB } }, | 4998 | {"sfze", XO(31,200,0,0), XORB_MASK, PWRCOM, 0, {RT, RA}}, |
3517 | { "not.", XRC(31,124,1), X_MASK, COM, { RA, RS, RBS } }, | 4999 | {"subfze.", XO(31,200,0,1), XORB_MASK, PPCCOM, 0, {RT, RA}}, |
3518 | { "nor.", XRC(31,124,1), X_MASK, COM, { RA, RS, RB } }, | 5000 | {"sfze.", XO(31,200,0,1), XORB_MASK, PWRCOM, 0, {RT, RA}}, |
3519 | 5001 | ||
3520 | { "lwarxe", X(31,126), X_MASK, BOOKE64, { RT, RA0, RB } }, | 5002 | {"addze", XO(31,202,0,0), XORB_MASK, PPCCOM, 0, {RT, RA}}, |
5003 | {"aze", XO(31,202,0,0), XORB_MASK, PWRCOM, 0, {RT, RA}}, | ||
5004 | {"addze.", XO(31,202,0,1), XORB_MASK, PPCCOM, 0, {RT, RA}}, | ||
5005 | {"aze.", XO(31,202,0,1), XORB_MASK, PWRCOM, 0, {RT, RA}}, | ||
3521 | 5006 | ||
3522 | { "lbzuxe", X(31,127), X_MASK, BOOKE64, { RT, RAL, RB } }, | 5007 | {"msgsnd", XRTRA(31,206,0,0), XRTRA_MASK, E500MC|PPCA2|POWER8, 0, {RB}}, |
3523 | 5008 | ||
3524 | { "wrtee", X(31,131), XRARB_MASK, PPC403 | BOOKE, { RS } }, | 5009 | {"mtsr", X(31,210), XRB_MASK|(1<<20), COM, NON32, {SR, RS}}, |
3525 | 5010 | ||
3526 | { "dcbtstls",X(31,134), X_MASK, PPCCHLK, { CT, RA, RB }}, | 5011 | {"mtfprwa", X(31,211), XX1RB_MASK|1, PPCVSX2, 0, {FRT, RA}}, |
5012 | {"mtvrwa", X(31,211)|1, XX1RB_MASK|1, PPCVSX2, 0, {VD, RA}}, | ||
5013 | {"mtvsrwa", X(31,211), XX1RB_MASK, PPCVSX2, 0, {XT6, RA}}, | ||
5014 | {"eratwe", X(31,211), X_MASK, PPCA2, 0, {RS, RA, WS}}, | ||
3527 | 5015 | ||
3528 | { "subfe", XO(31,136,0,0), XO_MASK, PPCCOM, { RT, RA, RB } }, | 5016 | {"ldawx.", XRC(31,212,1), X_MASK, PPCA2, 0, {RT, RA0, RB}}, |
3529 | { "sfe", XO(31,136,0,0), XO_MASK, PWRCOM, { RT, RA, RB } }, | ||
3530 | { "subfe.", XO(31,136,0,1), XO_MASK, PPCCOM, { RT, RA, RB } }, | ||
3531 | { "sfe.", XO(31,136,0,1), XO_MASK, PWRCOM, { RT, RA, RB } }, | ||
3532 | { "subfeo", XO(31,136,1,0), XO_MASK, PPCCOM, { RT, RA, RB } }, | ||
3533 | { "sfeo", XO(31,136,1,0), XO_MASK, PWRCOM, { RT, RA, RB } }, | ||
3534 | { "subfeo.", XO(31,136,1,1), XO_MASK, PPCCOM, { RT, RA, RB } }, | ||
3535 | { "sfeo.", XO(31,136,1,1), XO_MASK, PWRCOM, { RT, RA, RB } }, | ||
3536 | 5017 | ||
3537 | { "adde", XO(31,138,0,0), XO_MASK, PPCCOM, { RT, RA, RB } }, | 5018 | {"stdcx.", XRC(31,214,1), X_MASK, PPC64, 0, {RS, RA0, RB}}, |
3538 | { "ae", XO(31,138,0,0), XO_MASK, PWRCOM, { RT, RA, RB } }, | ||
3539 | { "adde.", XO(31,138,0,1), XO_MASK, PPCCOM, { RT, RA, RB } }, | ||
3540 | { "ae.", XO(31,138,0,1), XO_MASK, PWRCOM, { RT, RA, RB } }, | ||
3541 | { "addeo", XO(31,138,1,0), XO_MASK, PPCCOM, { RT, RA, RB } }, | ||
3542 | { "aeo", XO(31,138,1,0), XO_MASK, PWRCOM, { RT, RA, RB } }, | ||
3543 | { "addeo.", XO(31,138,1,1), XO_MASK, PPCCOM, { RT, RA, RB } }, | ||
3544 | { "aeo.", XO(31,138,1,1), XO_MASK, PWRCOM, { RT, RA, RB } }, | ||
3545 | 5019 | ||
3546 | { "dcbtstlse",X(31,142),X_MASK, PPCCHLK64, { CT, RA, RB }}, | 5020 | {"stbx", X(31,215), X_MASK, COM, 0, {RS, RA0, RB}}, |
3547 | 5021 | ||
3548 | { "mtocrf", XFXM(31,144,0,1), XFXFXM_MASK, COM, { FXM, RS } }, | 5022 | {"sllq", XRC(31,216,0), X_MASK, M601, 0, {RA, RS, RB}}, |
3549 | { "mtcr", XFXM(31,144,0xff,0), XRARB_MASK, COM, { RS }}, | 5023 | {"sllq.", XRC(31,216,1), X_MASK, M601, 0, {RA, RS, RB}}, |
3550 | { "mtcrf", X(31,144), XFXFXM_MASK, COM, { FXM, RS } }, | ||
3551 | 5024 | ||
3552 | { "mtmsr", X(31,146), XRARB_MASK, COM, { RS } }, | 5025 | {"sleq", XRC(31,217,0), X_MASK, M601, 0, {RA, RS, RB}}, |
5026 | {"sleq.", XRC(31,217,1), X_MASK, M601, 0, {RA, RS, RB}}, | ||
3553 | 5027 | ||
3554 | { "stdx", X(31,149), X_MASK, PPC64, { RS, RA0, RB } }, | 5028 | {"stbepx", X(31,223), X_MASK, E500MC|PPCA2, 0, {RS, RA0, RB}}, |
3555 | 5029 | ||
3556 | { "stwcx.", XRC(31,150,1), X_MASK, PPC, { RS, RA0, RB } }, | 5030 | {"cmpeqb", X(31,224), XCMPL_MASK, POWER9, 0, {BF, RA, RB}}, |
3557 | 5031 | ||
3558 | { "stwx", X(31,151), X_MASK, PPCCOM, { RS, RA0, RB } }, | 5032 | {"icblc", X(31,230), X_MASK, PPCCHLK|PPC476|TITAN, 0, {CT, RA0, RB}}, |
3559 | { "stx", X(31,151), X_MASK, PWRCOM, { RS, RA, RB } }, | ||
3560 | 5033 | ||
3561 | { "stwcxe.", XRC(31,158,1), X_MASK, BOOKE64, { RS, RA0, RB } }, | 5034 | {"stvx", X(31,231), X_MASK, PPCVEC, 0, {VS, RA0, RB}}, |
5035 | {"stqfcmx", APU(31,231,0), APU_MASK, PPC405, 0, {FCRT, RA, RB}}, | ||
3562 | 5036 | ||
3563 | { "stwxe", X(31,159), X_MASK, BOOKE64, { RS, RA0, RB } }, | 5037 | {"subfme", XO(31,232,0,0), XORB_MASK, PPCCOM, 0, {RT, RA}}, |
5038 | {"sfme", XO(31,232,0,0), XORB_MASK, PWRCOM, 0, {RT, RA}}, | ||
5039 | {"subfme.", XO(31,232,0,1), XORB_MASK, PPCCOM, 0, {RT, RA}}, | ||
5040 | {"sfme.", XO(31,232,0,1), XORB_MASK, PWRCOM, 0, {RT, RA}}, | ||
3564 | 5041 | ||
3565 | { "slq", XRC(31,152,0), X_MASK, M601, { RA, RS, RB } }, | 5042 | {"mulld", XO(31,233,0,0), XO_MASK, PPC64, 0, {RT, RA, RB}}, |
3566 | { "slq.", XRC(31,152,1), X_MASK, M601, { RA, RS, RB } }, | 5043 | {"mulld.", XO(31,233,0,1), XO_MASK, PPC64, 0, {RT, RA, RB}}, |
3567 | 5044 | ||
3568 | { "sle", XRC(31,153,0), X_MASK, M601, { RA, RS, RB } }, | 5045 | {"addme", XO(31,234,0,0), XORB_MASK, PPCCOM, 0, {RT, RA}}, |
3569 | { "sle.", XRC(31,153,1), X_MASK, M601, { RA, RS, RB } }, | 5046 | {"ame", XO(31,234,0,0), XORB_MASK, PWRCOM, 0, {RT, RA}}, |
5047 | {"addme.", XO(31,234,0,1), XORB_MASK, PPCCOM, 0, {RT, RA}}, | ||
5048 | {"ame.", XO(31,234,0,1), XORB_MASK, PWRCOM, 0, {RT, RA}}, | ||
3570 | 5049 | ||
3571 | { "prtyw", X(31,154), XRB_MASK, POWER6, { RA, RS } }, | 5050 | {"mullw", XO(31,235,0,0), XO_MASK, PPCCOM, 0, {RT, RA, RB}}, |
5051 | {"muls", XO(31,235,0,0), XO_MASK, PWRCOM, 0, {RT, RA, RB}}, | ||
5052 | {"mullw.", XO(31,235,0,1), XO_MASK, PPCCOM, 0, {RT, RA, RB}}, | ||
5053 | {"muls.", XO(31,235,0,1), XO_MASK, PWRCOM, 0, {RT, RA, RB}}, | ||
3572 | 5054 | ||
3573 | { "wrteei", X(31,163), XE_MASK, PPC403 | BOOKE, { E } }, | 5055 | {"icblce", X(31,238), X_MASK, PPCCHLK, E500MC|PPCA2, {CT, RA, RB}}, |
5056 | {"msgclr", XRTRA(31,238,0,0), XRTRA_MASK, E500MC|PPCA2|POWER8, 0, {RB}}, | ||
5057 | {"mtsrin", X(31,242), XRA_MASK, PPC, NON32, {RS, RB}}, | ||
5058 | {"mtsri", X(31,242), XRA_MASK, POWER, NON32, {RS, RB}}, | ||
3574 | 5059 | ||
3575 | { "dcbtls", X(31,166), X_MASK, PPCCHLK, { CT, RA, RB }}, | 5060 | {"mtfprwz", X(31,243), XX1RB_MASK|1, PPCVSX2, 0, {FRT, RA}}, |
3576 | { "dcbtlse", X(31,174), X_MASK, PPCCHLK64, { CT, RA, RB }}, | 5061 | {"mtvrwz", X(31,243)|1, XX1RB_MASK|1, PPCVSX2, 0, {VD, RA}}, |
5062 | {"mtvsrwz", X(31,243), XX1RB_MASK, PPCVSX2, 0, {XT6, RA}}, | ||
3577 | 5063 | ||
3578 | { "mtmsrd", X(31,178), XRLARB_MASK, PPC64, { RS, MTMSRD_L } }, | 5064 | {"dcbtstt", XRT(31,246,0x10), XRT_MASK, POWER7, 0, {RA0, RB}}, |
5065 | {"dcbtst", X(31,246), X_MASK, POWER4, DCBT_EO, {RA0, RB, CT}}, | ||
5066 | {"dcbtst", X(31,246), X_MASK, DCBT_EO, 0, {CT, RA0, RB}}, | ||
5067 | {"dcbtst", X(31,246), X_MASK, PPC, POWER4|DCBT_EO, {RA0, RB}}, | ||
3579 | 5068 | ||
3580 | { "stdux", X(31,181), X_MASK, PPC64, { RS, RAS, RB } }, | 5069 | {"stbux", X(31,247), X_MASK, COM, 0, {RS, RAS, RB}}, |
3581 | 5070 | ||
3582 | { "stwux", X(31,183), X_MASK, PPCCOM, { RS, RAS, RB } }, | 5071 | {"slliq", XRC(31,248,0), X_MASK, M601, 0, {RA, RS, SH}}, |
3583 | { "stux", X(31,183), X_MASK, PWRCOM, { RS, RA0, RB } }, | 5072 | {"slliq.", XRC(31,248,1), X_MASK, M601, 0, {RA, RS, SH}}, |
3584 | 5073 | ||
3585 | { "sliq", XRC(31,184,0), X_MASK, M601, { RA, RS, SH } }, | 5074 | {"bpermd", X(31,252), X_MASK, POWER7|PPCA2, 0, {RA, RS, RB}}, |
3586 | { "sliq.", XRC(31,184,1), X_MASK, M601, { RA, RS, SH } }, | ||
3587 | 5075 | ||
3588 | { "prtyd", X(31,186), XRB_MASK, POWER6, { RA, RS } }, | 5076 | {"dcbtstep", XRT(31,255,0), X_MASK, E500MC|PPCA2, 0, {RT, RA0, RB}}, |
3589 | 5077 | ||
3590 | { "stwuxe", X(31,191), X_MASK, BOOKE64, { RS, RAS, RB } }, | 5078 | {"mfdcrx", X(31,259), X_MASK, BOOKE|PPCA2|PPC476, TITAN, {RS, RA}}, |
5079 | {"mfdcrx.", XRC(31,259,1), X_MASK, PPCA2, 0, {RS, RA}}, | ||
3591 | 5080 | ||
3592 | { "subfze", XO(31,200,0,0), XORB_MASK, PPCCOM, { RT, RA } }, | 5081 | {"lvexbx", X(31,261), X_MASK, PPCVEC2, 0, {VD, RA0, RB}}, |
3593 | { "sfze", XO(31,200,0,0), XORB_MASK, PWRCOM, { RT, RA } }, | ||
3594 | { "subfze.", XO(31,200,0,1), XORB_MASK, PPCCOM, { RT, RA } }, | ||
3595 | { "sfze.", XO(31,200,0,1), XORB_MASK, PWRCOM, { RT, RA } }, | ||
3596 | { "subfzeo", XO(31,200,1,0), XORB_MASK, PPCCOM, { RT, RA } }, | ||
3597 | { "sfzeo", XO(31,200,1,0), XORB_MASK, PWRCOM, { RT, RA } }, | ||
3598 | { "subfzeo.",XO(31,200,1,1), XORB_MASK, PPCCOM, { RT, RA } }, | ||
3599 | { "sfzeo.", XO(31,200,1,1), XORB_MASK, PWRCOM, { RT, RA } }, | ||
3600 | 5082 | ||
3601 | { "addze", XO(31,202,0,0), XORB_MASK, PPCCOM, { RT, RA } }, | 5083 | {"icbt", X(31,262), XRT_MASK, PPC403, 0, {RA, RB}}, |
3602 | { "aze", XO(31,202,0,0), XORB_MASK, PWRCOM, { RT, RA } }, | ||
3603 | { "addze.", XO(31,202,0,1), XORB_MASK, PPCCOM, { RT, RA } }, | ||
3604 | { "aze.", XO(31,202,0,1), XORB_MASK, PWRCOM, { RT, RA } }, | ||
3605 | { "addzeo", XO(31,202,1,0), XORB_MASK, PPCCOM, { RT, RA } }, | ||
3606 | { "azeo", XO(31,202,1,0), XORB_MASK, PWRCOM, { RT, RA } }, | ||
3607 | { "addzeo.", XO(31,202,1,1), XORB_MASK, PPCCOM, { RT, RA } }, | ||
3608 | { "azeo.", XO(31,202,1,1), XORB_MASK, PWRCOM, { RT, RA } }, | ||
3609 | 5084 | ||
3610 | { "mtsr", X(31,210), XRB_MASK|(1<<20), COM32, { SR, RS } }, | 5085 | {"lvepxl", X(31,263), X_MASK, PPCVEC2, 0, {VD, RA0, RB}}, |
3611 | 5086 | ||
3612 | { "stdcx.", XRC(31,214,1), X_MASK, PPC64, { RS, RA0, RB } }, | 5087 | {"ldfcmx", APU(31,263,0), APU_MASK, PPC405, 0, {FCRT, RA, RB}}, |
5088 | {"doz", XO(31,264,0,0), XO_MASK, M601, 0, {RT, RA, RB}}, | ||
5089 | {"doz.", XO(31,264,0,1), XO_MASK, M601, 0, {RT, RA, RB}}, | ||
3613 | 5090 | ||
3614 | { "stbx", X(31,215), X_MASK, COM, { RS, RA0, RB } }, | 5091 | {"modud", X(31,265), X_MASK, POWER9, 0, {RT, RA, RB}}, |
3615 | 5092 | ||
3616 | { "sllq", XRC(31,216,0), X_MASK, M601, { RA, RS, RB } }, | 5093 | {"add", XO(31,266,0,0), XO_MASK, PPCCOM, 0, {RT, RA, RB}}, |
3617 | { "sllq.", XRC(31,216,1), X_MASK, M601, { RA, RS, RB } }, | 5094 | {"cax", XO(31,266,0,0), XO_MASK, PWRCOM, 0, {RT, RA, RB}}, |
5095 | {"add.", XO(31,266,0,1), XO_MASK, PPCCOM, 0, {RT, RA, RB}}, | ||
5096 | {"cax.", XO(31,266,0,1), XO_MASK, PWRCOM, 0, {RT, RA, RB}}, | ||
3618 | 5097 | ||
3619 | { "sleq", XRC(31,217,0), X_MASK, M601, { RA, RS, RB } }, | 5098 | {"moduw", X(31,267), X_MASK, POWER9, 0, {RT, RA, RB}}, |
3620 | { "sleq.", XRC(31,217,1), X_MASK, M601, { RA, RS, RB } }, | ||
3621 | 5099 | ||
3622 | { "stbxe", X(31,223), X_MASK, BOOKE64, { RS, RA0, RB } }, | 5100 | {"lxvx", X(31,268), XX1_MASK|1<<6, PPCVSX3, 0, {XT6, RA0, RB}}, |
5101 | {"lxvl", X(31,269), XX1_MASK, PPCVSX3, 0, {XT6, RA0, RB}}, | ||
3623 | 5102 | ||
3624 | { "icblc", X(31,230), X_MASK, PPCCHLK, { CT, RA, RB }}, | 5103 | {"ehpriv", X(31,270), 0xffffffff, E500MC|PPCA2, 0, {0}}, |
3625 | 5104 | ||
3626 | { "subfme", XO(31,232,0,0), XORB_MASK, PPCCOM, { RT, RA } }, | 5105 | {"tlbiel", X(31,274), X_MASK|1<<20,POWER9, PPC476, {RB, RSO, RIC, PRS, X_R}}, |
3627 | { "sfme", XO(31,232,0,0), XORB_MASK, PWRCOM, { RT, RA } }, | 5106 | {"tlbiel", X(31,274), XRTLRA_MASK, POWER4, POWER9|PPC476, {RB, LOPT}}, |
3628 | { "subfme.", XO(31,232,0,1), XORB_MASK, PPCCOM, { RT, RA } }, | ||
3629 | { "sfme.", XO(31,232,0,1), XORB_MASK, PWRCOM, { RT, RA } }, | ||
3630 | { "subfmeo", XO(31,232,1,0), XORB_MASK, PPCCOM, { RT, RA } }, | ||
3631 | { "sfmeo", XO(31,232,1,0), XORB_MASK, PWRCOM, { RT, RA } }, | ||
3632 | { "subfmeo.",XO(31,232,1,1), XORB_MASK, PPCCOM, { RT, RA } }, | ||
3633 | { "sfmeo.", XO(31,232,1,1), XORB_MASK, PWRCOM, { RT, RA } }, | ||
3634 | 5107 | ||
3635 | { "mulld", XO(31,233,0,0), XO_MASK, PPC64, { RT, RA, RB } }, | 5108 | {"mfapidi", X(31,275), X_MASK, BOOKE, E500|TITAN, {RT, RA}}, |
3636 | { "mulld.", XO(31,233,0,1), XO_MASK, PPC64, { RT, RA, RB } }, | ||
3637 | { "mulldo", XO(31,233,1,0), XO_MASK, PPC64, { RT, RA, RB } }, | ||
3638 | { "mulldo.", XO(31,233,1,1), XO_MASK, PPC64, { RT, RA, RB } }, | ||
3639 | 5109 | ||
3640 | { "addme", XO(31,234,0,0), XORB_MASK, PPCCOM, { RT, RA } }, | 5110 | {"lqarx", X(31,276), XEH_MASK, POWER8, 0, {RTQ, RAX, RBX, EH}}, |
3641 | { "ame", XO(31,234,0,0), XORB_MASK, PWRCOM, { RT, RA } }, | ||
3642 | { "addme.", XO(31,234,0,1), XORB_MASK, PPCCOM, { RT, RA } }, | ||
3643 | { "ame.", XO(31,234,0,1), XORB_MASK, PWRCOM, { RT, RA } }, | ||
3644 | { "addmeo", XO(31,234,1,0), XORB_MASK, PPCCOM, { RT, RA } }, | ||
3645 | { "ameo", XO(31,234,1,0), XORB_MASK, PWRCOM, { RT, RA } }, | ||
3646 | { "addmeo.", XO(31,234,1,1), XORB_MASK, PPCCOM, { RT, RA } }, | ||
3647 | { "ameo.", XO(31,234,1,1), XORB_MASK, PWRCOM, { RT, RA } }, | ||
3648 | 5111 | ||
3649 | { "mullw", XO(31,235,0,0), XO_MASK, PPCCOM, { RT, RA, RB } }, | 5112 | {"lscbx", XRC(31,277,0), X_MASK, M601, 0, {RT, RA, RB}}, |
3650 | { "muls", XO(31,235,0,0), XO_MASK, PWRCOM, { RT, RA, RB } }, | 5113 | {"lscbx.", XRC(31,277,1), X_MASK, M601, 0, {RT, RA, RB}}, |
3651 | { "mullw.", XO(31,235,0,1), XO_MASK, PPCCOM, { RT, RA, RB } }, | ||
3652 | { "muls.", XO(31,235,0,1), XO_MASK, PWRCOM, { RT, RA, RB } }, | ||
3653 | { "mullwo", XO(31,235,1,0), XO_MASK, PPCCOM, { RT, RA, RB } }, | ||
3654 | { "mulso", XO(31,235,1,0), XO_MASK, PWRCOM, { RT, RA, RB } }, | ||
3655 | { "mullwo.", XO(31,235,1,1), XO_MASK, PPCCOM, { RT, RA, RB } }, | ||
3656 | { "mulso.", XO(31,235,1,1), XO_MASK, PWRCOM, { RT, RA, RB } }, | ||
3657 | 5114 | ||
3658 | { "icblce", X(31,238), X_MASK, PPCCHLK64, { CT, RA, RB }}, | 5115 | {"dcbtt", XRT(31,278,0x10), XRT_MASK, POWER7, 0, {RA0, RB}}, |
3659 | { "mtsrin", X(31,242), XRA_MASK, PPC32, { RS, RB } }, | 5116 | {"dcbt", X(31,278), X_MASK, POWER4, DCBT_EO, {RA0, RB, CT}}, |
3660 | { "mtsri", X(31,242), XRA_MASK, POWER32, { RS, RB } }, | 5117 | {"dcbt", X(31,278), X_MASK, DCBT_EO, 0, {CT, RA0, RB}}, |
5118 | {"dcbt", X(31,278), X_MASK, PPC, POWER4|DCBT_EO, {RA0, RB}}, | ||
3661 | 5119 | ||
3662 | { "dcbtst", X(31,246), X_MASK, PPC, { CT, RA, RB } }, | 5120 | {"lhzx", X(31,279), X_MASK, COM, 0, {RT, RA0, RB}}, |
3663 | 5121 | ||
3664 | { "stbux", X(31,247), X_MASK, COM, { RS, RAS, RB } }, | 5122 | {"cdtbcd", X(31,282), XRB_MASK, POWER6, 0, {RA, RS}}, |
3665 | |||
3666 | { "slliq", XRC(31,248,0), X_MASK, M601, { RA, RS, SH } }, | ||
3667 | { "slliq.", XRC(31,248,1), X_MASK, M601, { RA, RS, SH } }, | ||
3668 | |||
3669 | { "dcbtste", X(31,253), X_MASK, BOOKE64, { CT, RA, RB } }, | ||
3670 | |||
3671 | { "stbuxe", X(31,255), X_MASK, BOOKE64, { RS, RAS, RB } }, | ||
3672 | |||
3673 | { "mfdcrx", X(31,259), X_MASK, BOOKE, { RS, RA } }, | ||
3674 | |||
3675 | { "doz", XO(31,264,0,0), XO_MASK, M601, { RT, RA, RB } }, | ||
3676 | { "doz.", XO(31,264,0,1), XO_MASK, M601, { RT, RA, RB } }, | ||
3677 | { "dozo", XO(31,264,1,0), XO_MASK, M601, { RT, RA, RB } }, | ||
3678 | { "dozo.", XO(31,264,1,1), XO_MASK, M601, { RT, RA, RB } }, | ||
3679 | |||
3680 | { "add", XO(31,266,0,0), XO_MASK, PPCCOM, { RT, RA, RB } }, | ||
3681 | { "cax", XO(31,266,0,0), XO_MASK, PWRCOM, { RT, RA, RB } }, | ||
3682 | { "add.", XO(31,266,0,1), XO_MASK, PPCCOM, { RT, RA, RB } }, | ||
3683 | { "cax.", XO(31,266,0,1), XO_MASK, PWRCOM, { RT, RA, RB } }, | ||
3684 | { "addo", XO(31,266,1,0), XO_MASK, PPCCOM, { RT, RA, RB } }, | ||
3685 | { "caxo", XO(31,266,1,0), XO_MASK, PWRCOM, { RT, RA, RB } }, | ||
3686 | { "addo.", XO(31,266,1,1), XO_MASK, PPCCOM, { RT, RA, RB } }, | ||
3687 | { "caxo.", XO(31,266,1,1), XO_MASK, PWRCOM, { RT, RA, RB } }, | ||
3688 | |||
3689 | { "tlbiel", X(31,274), XRTLRA_MASK, POWER4, { RB, L } }, | ||
3690 | |||
3691 | { "mfapidi", X(31,275), X_MASK, BOOKE, { RT, RA } }, | ||
3692 | |||
3693 | { "lscbx", XRC(31,277,0), X_MASK, M601, { RT, RA, RB } }, | ||
3694 | { "lscbx.", XRC(31,277,1), X_MASK, M601, { RT, RA, RB } }, | ||
3695 | |||
3696 | { "dcbt", X(31,278), X_MASK, PPC, { CT, RA, RB } }, | ||
3697 | |||
3698 | { "lhzx", X(31,279), X_MASK, COM, { RT, RA0, RB } }, | ||
3699 | |||
3700 | { "eqv", XRC(31,284,0), X_MASK, COM, { RA, RS, RB } }, | ||
3701 | { "eqv.", XRC(31,284,1), X_MASK, COM, { RA, RS, RB } }, | ||
3702 | |||
3703 | { "dcbte", X(31,286), X_MASK, BOOKE64, { CT, RA, RB } }, | ||
3704 | |||
3705 | { "lhzxe", X(31,287), X_MASK, BOOKE64, { RT, RA0, RB } }, | ||
3706 | |||
3707 | { "tlbie", X(31,306), XRTLRA_MASK, PPC, { RB, L } }, | ||
3708 | { "tlbi", X(31,306), XRT_MASK, POWER, { RA0, RB } }, | ||
3709 | |||
3710 | { "eciwx", X(31,310), X_MASK, PPC, { RT, RA, RB } }, | ||
3711 | |||
3712 | { "lhzux", X(31,311), X_MASK, COM, { RT, RAL, RB } }, | ||
3713 | |||
3714 | { "xor", XRC(31,316,0), X_MASK, COM, { RA, RS, RB } }, | ||
3715 | { "xor.", XRC(31,316,1), X_MASK, COM, { RA, RS, RB } }, | ||
3716 | |||
3717 | { "lhzuxe", X(31,319), X_MASK, BOOKE64, { RT, RAL, RB } }, | ||
3718 | |||
3719 | { "mfexisr", XSPR(31,323,64), XSPR_MASK, PPC403, { RT } }, | ||
3720 | { "mfexier", XSPR(31,323,66), XSPR_MASK, PPC403, { RT } }, | ||
3721 | { "mfbr0", XSPR(31,323,128), XSPR_MASK, PPC403, { RT } }, | ||
3722 | { "mfbr1", XSPR(31,323,129), XSPR_MASK, PPC403, { RT } }, | ||
3723 | { "mfbr2", XSPR(31,323,130), XSPR_MASK, PPC403, { RT } }, | ||
3724 | { "mfbr3", XSPR(31,323,131), XSPR_MASK, PPC403, { RT } }, | ||
3725 | { "mfbr4", XSPR(31,323,132), XSPR_MASK, PPC403, { RT } }, | ||
3726 | { "mfbr5", XSPR(31,323,133), XSPR_MASK, PPC403, { RT } }, | ||
3727 | { "mfbr6", XSPR(31,323,134), XSPR_MASK, PPC403, { RT } }, | ||
3728 | { "mfbr7", XSPR(31,323,135), XSPR_MASK, PPC403, { RT } }, | ||
3729 | { "mfbear", XSPR(31,323,144), XSPR_MASK, PPC403, { RT } }, | ||
3730 | { "mfbesr", XSPR(31,323,145), XSPR_MASK, PPC403, { RT } }, | ||
3731 | { "mfiocr", XSPR(31,323,160), XSPR_MASK, PPC403, { RT } }, | ||
3732 | { "mfdmacr0", XSPR(31,323,192), XSPR_MASK, PPC403, { RT } }, | ||
3733 | { "mfdmact0", XSPR(31,323,193), XSPR_MASK, PPC403, { RT } }, | ||
3734 | { "mfdmada0", XSPR(31,323,194), XSPR_MASK, PPC403, { RT } }, | ||
3735 | { "mfdmasa0", XSPR(31,323,195), XSPR_MASK, PPC403, { RT } }, | ||
3736 | { "mfdmacc0", XSPR(31,323,196), XSPR_MASK, PPC403, { RT } }, | ||
3737 | { "mfdmacr1", XSPR(31,323,200), XSPR_MASK, PPC403, { RT } }, | ||
3738 | { "mfdmact1", XSPR(31,323,201), XSPR_MASK, PPC403, { RT } }, | ||
3739 | { "mfdmada1", XSPR(31,323,202), XSPR_MASK, PPC403, { RT } }, | ||
3740 | { "mfdmasa1", XSPR(31,323,203), XSPR_MASK, PPC403, { RT } }, | ||
3741 | { "mfdmacc1", XSPR(31,323,204), XSPR_MASK, PPC403, { RT } }, | ||
3742 | { "mfdmacr2", XSPR(31,323,208), XSPR_MASK, PPC403, { RT } }, | ||
3743 | { "mfdmact2", XSPR(31,323,209), XSPR_MASK, PPC403, { RT } }, | ||
3744 | { "mfdmada2", XSPR(31,323,210), XSPR_MASK, PPC403, { RT } }, | ||
3745 | { "mfdmasa2", XSPR(31,323,211), XSPR_MASK, PPC403, { RT } }, | ||
3746 | { "mfdmacc2", XSPR(31,323,212), XSPR_MASK, PPC403, { RT } }, | ||
3747 | { "mfdmacr3", XSPR(31,323,216), XSPR_MASK, PPC403, { RT } }, | ||
3748 | { "mfdmact3", XSPR(31,323,217), XSPR_MASK, PPC403, { RT } }, | ||
3749 | { "mfdmada3", XSPR(31,323,218), XSPR_MASK, PPC403, { RT } }, | ||
3750 | { "mfdmasa3", XSPR(31,323,219), XSPR_MASK, PPC403, { RT } }, | ||
3751 | { "mfdmacc3", XSPR(31,323,220), XSPR_MASK, PPC403, { RT } }, | ||
3752 | { "mfdmasr", XSPR(31,323,224), XSPR_MASK, PPC403, { RT } }, | ||
3753 | { "mfdcr", X(31,323), X_MASK, PPC403 | BOOKE, { RT, SPR } }, | ||
3754 | |||
3755 | { "div", XO(31,331,0,0), XO_MASK, M601, { RT, RA, RB } }, | ||
3756 | { "div.", XO(31,331,0,1), XO_MASK, M601, { RT, RA, RB } }, | ||
3757 | { "divo", XO(31,331,1,0), XO_MASK, M601, { RT, RA, RB } }, | ||
3758 | { "divo.", XO(31,331,1,1), XO_MASK, M601, { RT, RA, RB } }, | ||
3759 | |||
3760 | { "mfpmr", X(31,334), X_MASK, PPCPMR, { RT, PMR }}, | ||
3761 | |||
3762 | { "mfmq", XSPR(31,339,0), XSPR_MASK, M601, { RT } }, | ||
3763 | { "mfxer", XSPR(31,339,1), XSPR_MASK, COM, { RT } }, | ||
3764 | { "mfrtcu", XSPR(31,339,4), XSPR_MASK, COM, { RT } }, | ||
3765 | { "mfrtcl", XSPR(31,339,5), XSPR_MASK, COM, { RT } }, | ||
3766 | { "mfdec", XSPR(31,339,6), XSPR_MASK, MFDEC1, { RT } }, | ||
3767 | { "mfdec", XSPR(31,339,22), XSPR_MASK, MFDEC2, { RT } }, | ||
3768 | { "mflr", XSPR(31,339,8), XSPR_MASK, COM, { RT } }, | ||
3769 | { "mfctr", XSPR(31,339,9), XSPR_MASK, COM, { RT } }, | ||
3770 | { "mftid", XSPR(31,339,17), XSPR_MASK, POWER, { RT } }, | ||
3771 | { "mfdsisr", XSPR(31,339,18), XSPR_MASK, COM, { RT } }, | ||
3772 | { "mfdar", XSPR(31,339,19), XSPR_MASK, COM, { RT } }, | ||
3773 | { "mfsdr0", XSPR(31,339,24), XSPR_MASK, POWER, { RT } }, | ||
3774 | { "mfsdr1", XSPR(31,339,25), XSPR_MASK, COM, { RT } }, | ||
3775 | { "mfsrr0", XSPR(31,339,26), XSPR_MASK, COM, { RT } }, | ||
3776 | { "mfsrr1", XSPR(31,339,27), XSPR_MASK, COM, { RT } }, | ||
3777 | { "mfcfar", XSPR(31,339,28), XSPR_MASK, POWER6, { RT } }, | ||
3778 | { "mfpid", XSPR(31,339,48), XSPR_MASK, BOOKE, { RT } }, | ||
3779 | { "mfpid", XSPR(31,339,945), XSPR_MASK, PPC403, { RT } }, | ||
3780 | { "mfcsrr0", XSPR(31,339,58), XSPR_MASK, BOOKE, { RT } }, | ||
3781 | { "mfcsrr1", XSPR(31,339,59), XSPR_MASK, BOOKE, { RT } }, | ||
3782 | { "mfdear", XSPR(31,339,61), XSPR_MASK, BOOKE, { RT } }, | ||
3783 | { "mfdear", XSPR(31,339,981), XSPR_MASK, PPC403, { RT } }, | ||
3784 | { "mfesr", XSPR(31,339,62), XSPR_MASK, BOOKE, { RT } }, | ||
3785 | { "mfesr", XSPR(31,339,980), XSPR_MASK, PPC403, { RT } }, | ||
3786 | { "mfivpr", XSPR(31,339,63), XSPR_MASK, BOOKE, { RT } }, | ||
3787 | { "mfcmpa", XSPR(31,339,144), XSPR_MASK, PPC860, { RT } }, | ||
3788 | { "mfcmpb", XSPR(31,339,145), XSPR_MASK, PPC860, { RT } }, | ||
3789 | { "mfcmpc", XSPR(31,339,146), XSPR_MASK, PPC860, { RT } }, | ||
3790 | { "mfcmpd", XSPR(31,339,147), XSPR_MASK, PPC860, { RT } }, | ||
3791 | { "mficr", XSPR(31,339,148), XSPR_MASK, PPC860, { RT } }, | ||
3792 | { "mfder", XSPR(31,339,149), XSPR_MASK, PPC860, { RT } }, | ||
3793 | { "mfcounta", XSPR(31,339,150), XSPR_MASK, PPC860, { RT } }, | ||
3794 | { "mfcountb", XSPR(31,339,151), XSPR_MASK, PPC860, { RT } }, | ||
3795 | { "mfcmpe", XSPR(31,339,152), XSPR_MASK, PPC860, { RT } }, | ||
3796 | { "mfcmpf", XSPR(31,339,153), XSPR_MASK, PPC860, { RT } }, | ||
3797 | { "mfcmpg", XSPR(31,339,154), XSPR_MASK, PPC860, { RT } }, | ||
3798 | { "mfcmph", XSPR(31,339,155), XSPR_MASK, PPC860, { RT } }, | ||
3799 | { "mflctrl1", XSPR(31,339,156), XSPR_MASK, PPC860, { RT } }, | ||
3800 | { "mflctrl2", XSPR(31,339,157), XSPR_MASK, PPC860, { RT } }, | ||
3801 | { "mfictrl", XSPR(31,339,158), XSPR_MASK, PPC860, { RT } }, | ||
3802 | { "mfbar", XSPR(31,339,159), XSPR_MASK, PPC860, { RT } }, | ||
3803 | { "mfvrsave", XSPR(31,339,256), XSPR_MASK, PPCVEC, { RT } }, | ||
3804 | { "mfusprg0", XSPR(31,339,256), XSPR_MASK, BOOKE, { RT } }, | ||
3805 | { "mftb", X(31,371), X_MASK, CLASSIC, { RT, TBR } }, | ||
3806 | { "mftb", XSPR(31,339,268), XSPR_MASK, BOOKE, { RT } }, | ||
3807 | { "mftbl", XSPR(31,371,268), XSPR_MASK, CLASSIC, { RT } }, | ||
3808 | { "mftbl", XSPR(31,339,268), XSPR_MASK, BOOKE, { RT } }, | ||
3809 | { "mftbu", XSPR(31,371,269), XSPR_MASK, CLASSIC, { RT } }, | ||
3810 | { "mftbu", XSPR(31,339,269), XSPR_MASK, BOOKE, { RT } }, | ||
3811 | { "mfsprg", XSPR(31,339,256), XSPRG_MASK, PPC, { RT, SPRG } }, | ||
3812 | { "mfsprg0", XSPR(31,339,272), XSPR_MASK, PPC, { RT } }, | ||
3813 | { "mfsprg1", XSPR(31,339,273), XSPR_MASK, PPC, { RT } }, | ||
3814 | { "mfsprg2", XSPR(31,339,274), XSPR_MASK, PPC, { RT } }, | ||
3815 | { "mfsprg3", XSPR(31,339,275), XSPR_MASK, PPC, { RT } }, | ||
3816 | { "mfsprg4", XSPR(31,339,260), XSPR_MASK, PPC405 | BOOKE, { RT } }, | ||
3817 | { "mfsprg5", XSPR(31,339,261), XSPR_MASK, PPC405 | BOOKE, { RT } }, | ||
3818 | { "mfsprg6", XSPR(31,339,262), XSPR_MASK, PPC405 | BOOKE, { RT } }, | ||
3819 | { "mfsprg7", XSPR(31,339,263), XSPR_MASK, PPC405 | BOOKE, { RT } }, | ||
3820 | { "mfasr", XSPR(31,339,280), XSPR_MASK, PPC64, { RT } }, | ||
3821 | { "mfear", XSPR(31,339,282), XSPR_MASK, PPC, { RT } }, | ||
3822 | { "mfpir", XSPR(31,339,286), XSPR_MASK, BOOKE, { RT } }, | ||
3823 | { "mfpvr", XSPR(31,339,287), XSPR_MASK, PPC, { RT } }, | ||
3824 | { "mfdbsr", XSPR(31,339,304), XSPR_MASK, BOOKE, { RT } }, | ||
3825 | { "mfdbsr", XSPR(31,339,1008), XSPR_MASK, PPC403, { RT } }, | ||
3826 | { "mfdbcr0", XSPR(31,339,308), XSPR_MASK, BOOKE, { RT } }, | ||
3827 | { "mfdbcr0", XSPR(31,339,1010), XSPR_MASK, PPC405, { RT } }, | ||
3828 | { "mfdbcr1", XSPR(31,339,309), XSPR_MASK, BOOKE, { RT } }, | ||
3829 | { "mfdbcr1", XSPR(31,339,957), XSPR_MASK, PPC405, { RT } }, | ||
3830 | { "mfdbcr2", XSPR(31,339,310), XSPR_MASK, BOOKE, { RT } }, | ||
3831 | { "mfiac1", XSPR(31,339,312), XSPR_MASK, BOOKE, { RT } }, | ||
3832 | { "mfiac1", XSPR(31,339,1012), XSPR_MASK, PPC403, { RT } }, | ||
3833 | { "mfiac2", XSPR(31,339,313), XSPR_MASK, BOOKE, { RT } }, | ||
3834 | { "mfiac2", XSPR(31,339,1013), XSPR_MASK, PPC403, { RT } }, | ||
3835 | { "mfiac3", XSPR(31,339,314), XSPR_MASK, BOOKE, { RT } }, | ||
3836 | { "mfiac3", XSPR(31,339,948), XSPR_MASK, PPC405, { RT } }, | ||
3837 | { "mfiac4", XSPR(31,339,315), XSPR_MASK, BOOKE, { RT } }, | ||
3838 | { "mfiac4", XSPR(31,339,949), XSPR_MASK, PPC405, { RT } }, | ||
3839 | { "mfdac1", XSPR(31,339,316), XSPR_MASK, BOOKE, { RT } }, | ||
3840 | { "mfdac1", XSPR(31,339,1014), XSPR_MASK, PPC403, { RT } }, | ||
3841 | { "mfdac2", XSPR(31,339,317), XSPR_MASK, BOOKE, { RT } }, | ||
3842 | { "mfdac2", XSPR(31,339,1015), XSPR_MASK, PPC403, { RT } }, | ||
3843 | { "mfdvc1", XSPR(31,339,318), XSPR_MASK, BOOKE, { RT } }, | ||
3844 | { "mfdvc1", XSPR(31,339,950), XSPR_MASK, PPC405, { RT } }, | ||
3845 | { "mfdvc2", XSPR(31,339,319), XSPR_MASK, BOOKE, { RT } }, | ||
3846 | { "mfdvc2", XSPR(31,339,951), XSPR_MASK, PPC405, { RT } }, | ||
3847 | { "mftsr", XSPR(31,339,336), XSPR_MASK, BOOKE, { RT } }, | ||
3848 | { "mftsr", XSPR(31,339,984), XSPR_MASK, PPC403, { RT } }, | ||
3849 | { "mftcr", XSPR(31,339,340), XSPR_MASK, BOOKE, { RT } }, | ||
3850 | { "mftcr", XSPR(31,339,986), XSPR_MASK, PPC403, { RT } }, | ||
3851 | { "mfivor0", XSPR(31,339,400), XSPR_MASK, BOOKE, { RT } }, | ||
3852 | { "mfivor1", XSPR(31,339,401), XSPR_MASK, BOOKE, { RT } }, | ||
3853 | { "mfivor2", XSPR(31,339,402), XSPR_MASK, BOOKE, { RT } }, | ||
3854 | { "mfivor3", XSPR(31,339,403), XSPR_MASK, BOOKE, { RT } }, | ||
3855 | { "mfivor4", XSPR(31,339,404), XSPR_MASK, BOOKE, { RT } }, | ||
3856 | { "mfivor5", XSPR(31,339,405), XSPR_MASK, BOOKE, { RT } }, | ||
3857 | { "mfivor6", XSPR(31,339,406), XSPR_MASK, BOOKE, { RT } }, | ||
3858 | { "mfivor7", XSPR(31,339,407), XSPR_MASK, BOOKE, { RT } }, | ||
3859 | { "mfivor8", XSPR(31,339,408), XSPR_MASK, BOOKE, { RT } }, | ||
3860 | { "mfivor9", XSPR(31,339,409), XSPR_MASK, BOOKE, { RT } }, | ||
3861 | { "mfivor10", XSPR(31,339,410), XSPR_MASK, BOOKE, { RT } }, | ||
3862 | { "mfivor11", XSPR(31,339,411), XSPR_MASK, BOOKE, { RT } }, | ||
3863 | { "mfivor12", XSPR(31,339,412), XSPR_MASK, BOOKE, { RT } }, | ||
3864 | { "mfivor13", XSPR(31,339,413), XSPR_MASK, BOOKE, { RT } }, | ||
3865 | { "mfivor14", XSPR(31,339,414), XSPR_MASK, BOOKE, { RT } }, | ||
3866 | { "mfivor15", XSPR(31,339,415), XSPR_MASK, BOOKE, { RT } }, | ||
3867 | { "mfspefscr", XSPR(31,339,512), XSPR_MASK, PPCSPE, { RT } }, | ||
3868 | { "mfbbear", XSPR(31,339,513), XSPR_MASK, PPCBRLK, { RT } }, | ||
3869 | { "mfbbtar", XSPR(31,339,514), XSPR_MASK, PPCBRLK, { RT } }, | ||
3870 | { "mfivor32", XSPR(31,339,528), XSPR_MASK, PPCSPE, { RT } }, | ||
3871 | { "mfivor33", XSPR(31,339,529), XSPR_MASK, PPCSPE, { RT } }, | ||
3872 | { "mfivor34", XSPR(31,339,530), XSPR_MASK, PPCSPE, { RT } }, | ||
3873 | { "mfivor35", XSPR(31,339,531), XSPR_MASK, PPCPMR, { RT } }, | ||
3874 | { "mfibatu", XSPR(31,339,528), XSPRBAT_MASK, PPC, { RT, SPRBAT } }, | ||
3875 | { "mfibatl", XSPR(31,339,529), XSPRBAT_MASK, PPC, { RT, SPRBAT } }, | ||
3876 | { "mfdbatu", XSPR(31,339,536), XSPRBAT_MASK, PPC, { RT, SPRBAT } }, | ||
3877 | { "mfdbatl", XSPR(31,339,537), XSPRBAT_MASK, PPC, { RT, SPRBAT } }, | ||
3878 | { "mfic_cst", XSPR(31,339,560), XSPR_MASK, PPC860, { RT } }, | ||
3879 | { "mfic_adr", XSPR(31,339,561), XSPR_MASK, PPC860, { RT } }, | ||
3880 | { "mfic_dat", XSPR(31,339,562), XSPR_MASK, PPC860, { RT } }, | ||
3881 | { "mfdc_cst", XSPR(31,339,568), XSPR_MASK, PPC860, { RT } }, | ||
3882 | { "mfdc_adr", XSPR(31,339,569), XSPR_MASK, PPC860, { RT } }, | ||
3883 | { "mfmcsrr0", XSPR(31,339,570), XSPR_MASK, PPCRFMCI, { RT } }, | ||
3884 | { "mfdc_dat", XSPR(31,339,570), XSPR_MASK, PPC860, { RT } }, | ||
3885 | { "mfmcsrr1", XSPR(31,339,571), XSPR_MASK, PPCRFMCI, { RT } }, | ||
3886 | { "mfmcsr", XSPR(31,339,572), XSPR_MASK, PPCRFMCI, { RT } }, | ||
3887 | { "mfmcar", XSPR(31,339,573), XSPR_MASK, PPCRFMCI, { RT } }, | ||
3888 | { "mfdpdr", XSPR(31,339,630), XSPR_MASK, PPC860, { RT } }, | ||
3889 | { "mfdpir", XSPR(31,339,631), XSPR_MASK, PPC860, { RT } }, | ||
3890 | { "mfimmr", XSPR(31,339,638), XSPR_MASK, PPC860, { RT } }, | ||
3891 | { "mfmi_ctr", XSPR(31,339,784), XSPR_MASK, PPC860, { RT } }, | ||
3892 | { "mfmi_ap", XSPR(31,339,786), XSPR_MASK, PPC860, { RT } }, | ||
3893 | { "mfmi_epn", XSPR(31,339,787), XSPR_MASK, PPC860, { RT } }, | ||
3894 | { "mfmi_twc", XSPR(31,339,789), XSPR_MASK, PPC860, { RT } }, | ||
3895 | { "mfmi_rpn", XSPR(31,339,790), XSPR_MASK, PPC860, { RT } }, | ||
3896 | { "mfmd_ctr", XSPR(31,339,792), XSPR_MASK, PPC860, { RT } }, | ||
3897 | { "mfm_casid", XSPR(31,339,793), XSPR_MASK, PPC860, { RT } }, | ||
3898 | { "mfmd_ap", XSPR(31,339,794), XSPR_MASK, PPC860, { RT } }, | ||
3899 | { "mfmd_epn", XSPR(31,339,795), XSPR_MASK, PPC860, { RT } }, | ||
3900 | { "mfmd_twb", XSPR(31,339,796), XSPR_MASK, PPC860, { RT } }, | ||
3901 | { "mfmd_twc", XSPR(31,339,797), XSPR_MASK, PPC860, { RT } }, | ||
3902 | { "mfmd_rpn", XSPR(31,339,798), XSPR_MASK, PPC860, { RT } }, | ||
3903 | { "mfm_tw", XSPR(31,339,799), XSPR_MASK, PPC860, { RT } }, | ||
3904 | { "mfmi_dbcam", XSPR(31,339,816), XSPR_MASK, PPC860, { RT } }, | ||
3905 | { "mfmi_dbram0",XSPR(31,339,817), XSPR_MASK, PPC860, { RT } }, | ||
3906 | { "mfmi_dbram1",XSPR(31,339,818), XSPR_MASK, PPC860, { RT } }, | ||
3907 | { "mfmd_dbcam", XSPR(31,339,824), XSPR_MASK, PPC860, { RT } }, | ||
3908 | { "mfmd_dbram0",XSPR(31,339,825), XSPR_MASK, PPC860, { RT } }, | ||
3909 | { "mfmd_dbram1",XSPR(31,339,826), XSPR_MASK, PPC860, { RT } }, | ||
3910 | { "mfummcr0", XSPR(31,339,936), XSPR_MASK, PPC750, { RT } }, | ||
3911 | { "mfupmc1", XSPR(31,339,937), XSPR_MASK, PPC750, { RT } }, | ||
3912 | { "mfupmc2", XSPR(31,339,938), XSPR_MASK, PPC750, { RT } }, | ||
3913 | { "mfusia", XSPR(31,339,939), XSPR_MASK, PPC750, { RT } }, | ||
3914 | { "mfummcr1", XSPR(31,339,940), XSPR_MASK, PPC750, { RT } }, | ||
3915 | { "mfupmc3", XSPR(31,339,941), XSPR_MASK, PPC750, { RT } }, | ||
3916 | { "mfupmc4", XSPR(31,339,942), XSPR_MASK, PPC750, { RT } }, | ||
3917 | { "mfzpr", XSPR(31,339,944), XSPR_MASK, PPC403, { RT } }, | ||
3918 | { "mfccr0", XSPR(31,339,947), XSPR_MASK, PPC405, { RT } }, | ||
3919 | { "mfmmcr0", XSPR(31,339,952), XSPR_MASK, PPC750, { RT } }, | ||
3920 | { "mfpmc1", XSPR(31,339,953), XSPR_MASK, PPC750, { RT } }, | ||
3921 | { "mfsgr", XSPR(31,339,953), XSPR_MASK, PPC403, { RT } }, | ||
3922 | { "mfpmc2", XSPR(31,339,954), XSPR_MASK, PPC750, { RT } }, | ||
3923 | { "mfdcwr", XSPR(31,339,954), XSPR_MASK, PPC403, { RT } }, | ||
3924 | { "mfsia", XSPR(31,339,955), XSPR_MASK, PPC750, { RT } }, | ||
3925 | { "mfsler", XSPR(31,339,955), XSPR_MASK, PPC405, { RT } }, | ||
3926 | { "mfmmcr1", XSPR(31,339,956), XSPR_MASK, PPC750, { RT } }, | ||
3927 | { "mfsu0r", XSPR(31,339,956), XSPR_MASK, PPC405, { RT } }, | ||
3928 | { "mfpmc3", XSPR(31,339,957), XSPR_MASK, PPC750, { RT } }, | ||
3929 | { "mfpmc4", XSPR(31,339,958), XSPR_MASK, PPC750, { RT } }, | ||
3930 | { "mficdbdr", XSPR(31,339,979), XSPR_MASK, PPC403, { RT } }, | ||
3931 | { "mfevpr", XSPR(31,339,982), XSPR_MASK, PPC403, { RT } }, | ||
3932 | { "mfcdbcr", XSPR(31,339,983), XSPR_MASK, PPC403, { RT } }, | ||
3933 | { "mfpit", XSPR(31,339,987), XSPR_MASK, PPC403, { RT } }, | ||
3934 | { "mftbhi", XSPR(31,339,988), XSPR_MASK, PPC403, { RT } }, | ||
3935 | { "mftblo", XSPR(31,339,989), XSPR_MASK, PPC403, { RT } }, | ||
3936 | { "mfsrr2", XSPR(31,339,990), XSPR_MASK, PPC403, { RT } }, | ||
3937 | { "mfsrr3", XSPR(31,339,991), XSPR_MASK, PPC403, { RT } }, | ||
3938 | { "mfl2cr", XSPR(31,339,1017), XSPR_MASK, PPC750, { RT } }, | ||
3939 | { "mfdccr", XSPR(31,339,1018), XSPR_MASK, PPC403, { RT } }, | ||
3940 | { "mficcr", XSPR(31,339,1019), XSPR_MASK, PPC403, { RT } }, | ||
3941 | { "mfictc", XSPR(31,339,1019), XSPR_MASK, PPC750, { RT } }, | ||
3942 | { "mfpbl1", XSPR(31,339,1020), XSPR_MASK, PPC403, { RT } }, | ||
3943 | { "mfthrm1", XSPR(31,339,1020), XSPR_MASK, PPC750, { RT } }, | ||
3944 | { "mfpbu1", XSPR(31,339,1021), XSPR_MASK, PPC403, { RT } }, | ||
3945 | { "mfthrm2", XSPR(31,339,1021), XSPR_MASK, PPC750, { RT } }, | ||
3946 | { "mfpbl2", XSPR(31,339,1022), XSPR_MASK, PPC403, { RT } }, | ||
3947 | { "mfthrm3", XSPR(31,339,1022), XSPR_MASK, PPC750, { RT } }, | ||
3948 | { "mfpbu2", XSPR(31,339,1023), XSPR_MASK, PPC403, { RT } }, | ||
3949 | { "mfspr", X(31,339), X_MASK, COM, { RT, SPR } }, | ||
3950 | |||
3951 | { "lwax", X(31,341), X_MASK, PPC64, { RT, RA0, RB } }, | ||
3952 | |||
3953 | { "dst", XDSS(31,342,0), XDSS_MASK, PPCVEC, { RA, RB, STRM } }, | ||
3954 | { "dstt", XDSS(31,342,1), XDSS_MASK, PPCVEC, { RA, RB, STRM } }, | ||
3955 | |||
3956 | { "lhax", X(31,343), X_MASK, COM, { RT, RA0, RB } }, | ||
3957 | |||
3958 | { "lhaxe", X(31,351), X_MASK, BOOKE64, { RT, RA0, RB } }, | ||
3959 | |||
3960 | { "dstst", XDSS(31,374,0), XDSS_MASK, PPCVEC, { RA, RB, STRM } }, | ||
3961 | { "dststt", XDSS(31,374,1), XDSS_MASK, PPCVEC, { RA, RB, STRM } }, | ||
3962 | |||
3963 | { "dccci", X(31,454), XRT_MASK, PPC403|PPC440, { RA, RB } }, | ||
3964 | |||
3965 | { "abs", XO(31,360,0,0), XORB_MASK, M601, { RT, RA } }, | ||
3966 | { "abs.", XO(31,360,0,1), XORB_MASK, M601, { RT, RA } }, | ||
3967 | { "abso", XO(31,360,1,0), XORB_MASK, M601, { RT, RA } }, | ||
3968 | { "abso.", XO(31,360,1,1), XORB_MASK, M601, { RT, RA } }, | ||
3969 | |||
3970 | { "divs", XO(31,363,0,0), XO_MASK, M601, { RT, RA, RB } }, | ||
3971 | { "divs.", XO(31,363,0,1), XO_MASK, M601, { RT, RA, RB } }, | ||
3972 | { "divso", XO(31,363,1,0), XO_MASK, M601, { RT, RA, RB } }, | ||
3973 | { "divso.", XO(31,363,1,1), XO_MASK, M601, { RT, RA, RB } }, | ||
3974 | |||
3975 | { "tlbia", X(31,370), 0xffffffff, PPC, { 0 } }, | ||
3976 | |||
3977 | { "lwaux", X(31,373), X_MASK, PPC64, { RT, RAL, RB } }, | ||
3978 | |||
3979 | { "lhaux", X(31,375), X_MASK, COM, { RT, RAL, RB } }, | ||
3980 | |||
3981 | { "lhauxe", X(31,383), X_MASK, BOOKE64, { RT, RAL, RB } }, | ||
3982 | |||
3983 | { "mtdcrx", X(31,387), X_MASK, BOOKE, { RA, RS } }, | ||
3984 | |||
3985 | { "dcblc", X(31,390), X_MASK, PPCCHLK, { CT, RA, RB }}, | ||
3986 | |||
3987 | { "subfe64", XO(31,392,0,0), XO_MASK, BOOKE64, { RT, RA, RB } }, | ||
3988 | { "subfe64o",XO(31,392,1,0), XO_MASK, BOOKE64, { RT, RA, RB } }, | ||
3989 | |||
3990 | { "adde64", XO(31,394,0,0), XO_MASK, BOOKE64, { RT, RA, RB } }, | ||
3991 | { "adde64o", XO(31,394,1,0), XO_MASK, BOOKE64, { RT, RA, RB } }, | ||
3992 | |||
3993 | { "dcblce", X(31,398), X_MASK, PPCCHLK64, { CT, RA, RB }}, | ||
3994 | |||
3995 | { "slbmte", X(31,402), XRA_MASK, PPC64, { RS, RB } }, | ||
3996 | |||
3997 | { "sthx", X(31,407), X_MASK, COM, { RS, RA0, RB } }, | ||
3998 | |||
3999 | { "cmpb", X(31,508), X_MASK, POWER6, { RA, RS, RB } }, | ||
4000 | |||
4001 | { "lfqx", X(31,791), X_MASK, POWER2, { FRT, RA, RB } }, | ||
4002 | |||
4003 | { "lfdpx", X(31,791), X_MASK, POWER6, { FRT, RA, RB } }, | ||
4004 | |||
4005 | { "lfqux", X(31,823), X_MASK, POWER2, { FRT, RA, RB } }, | ||
4006 | |||
4007 | { "stfqx", X(31,919), X_MASK, POWER2, { FRS, RA, RB } }, | ||
4008 | |||
4009 | { "stfdpx", X(31,919), X_MASK, POWER6, { FRS, RA, RB } }, | ||
4010 | |||
4011 | { "stfqux", X(31,951), X_MASK, POWER2, { FRS, RA, RB } }, | ||
4012 | |||
4013 | { "orc", XRC(31,412,0), X_MASK, COM, { RA, RS, RB } }, | ||
4014 | { "orc.", XRC(31,412,1), X_MASK, COM, { RA, RS, RB } }, | ||
4015 | |||
4016 | { "sradi", XS(31,413,0), XS_MASK, PPC64, { RA, RS, SH6 } }, | ||
4017 | { "sradi.", XS(31,413,1), XS_MASK, PPC64, { RA, RS, SH6 } }, | ||
4018 | |||
4019 | { "sthxe", X(31,415), X_MASK, BOOKE64, { RS, RA0, RB } }, | ||
4020 | |||
4021 | { "slbie", X(31,434), XRTRA_MASK, PPC64, { RB } }, | ||
4022 | |||
4023 | { "ecowx", X(31,438), X_MASK, PPC, { RT, RA, RB } }, | ||
4024 | |||
4025 | { "sthux", X(31,439), X_MASK, COM, { RS, RAS, RB } }, | ||
4026 | |||
4027 | { "sthuxe", X(31,447), X_MASK, BOOKE64, { RS, RAS, RB } }, | ||
4028 | |||
4029 | { "mr", XRC(31,444,0), X_MASK, COM, { RA, RS, RBS } }, | ||
4030 | { "or", XRC(31,444,0), X_MASK, COM, { RA, RS, RB } }, | ||
4031 | { "mr.", XRC(31,444,1), X_MASK, COM, { RA, RS, RBS } }, | ||
4032 | { "or.", XRC(31,444,1), X_MASK, COM, { RA, RS, RB } }, | ||
4033 | |||
4034 | { "mtexisr", XSPR(31,451,64), XSPR_MASK, PPC403, { RS } }, | ||
4035 | { "mtexier", XSPR(31,451,66), XSPR_MASK, PPC403, { RS } }, | ||
4036 | { "mtbr0", XSPR(31,451,128), XSPR_MASK, PPC403, { RS } }, | ||
4037 | { "mtbr1", XSPR(31,451,129), XSPR_MASK, PPC403, { RS } }, | ||
4038 | { "mtbr2", XSPR(31,451,130), XSPR_MASK, PPC403, { RS } }, | ||
4039 | { "mtbr3", XSPR(31,451,131), XSPR_MASK, PPC403, { RS } }, | ||
4040 | { "mtbr4", XSPR(31,451,132), XSPR_MASK, PPC403, { RS } }, | ||
4041 | { "mtbr5", XSPR(31,451,133), XSPR_MASK, PPC403, { RS } }, | ||
4042 | { "mtbr6", XSPR(31,451,134), XSPR_MASK, PPC403, { RS } }, | ||
4043 | { "mtbr7", XSPR(31,451,135), XSPR_MASK, PPC403, { RS } }, | ||
4044 | { "mtbear", XSPR(31,451,144), XSPR_MASK, PPC403, { RS } }, | ||
4045 | { "mtbesr", XSPR(31,451,145), XSPR_MASK, PPC403, { RS } }, | ||
4046 | { "mtiocr", XSPR(31,451,160), XSPR_MASK, PPC403, { RS } }, | ||
4047 | { "mtdmacr0", XSPR(31,451,192), XSPR_MASK, PPC403, { RS } }, | ||
4048 | { "mtdmact0", XSPR(31,451,193), XSPR_MASK, PPC403, { RS } }, | ||
4049 | { "mtdmada0", XSPR(31,451,194), XSPR_MASK, PPC403, { RS } }, | ||
4050 | { "mtdmasa0", XSPR(31,451,195), XSPR_MASK, PPC403, { RS } }, | ||
4051 | { "mtdmacc0", XSPR(31,451,196), XSPR_MASK, PPC403, { RS } }, | ||
4052 | { "mtdmacr1", XSPR(31,451,200), XSPR_MASK, PPC403, { RS } }, | ||
4053 | { "mtdmact1", XSPR(31,451,201), XSPR_MASK, PPC403, { RS } }, | ||
4054 | { "mtdmada1", XSPR(31,451,202), XSPR_MASK, PPC403, { RS } }, | ||
4055 | { "mtdmasa1", XSPR(31,451,203), XSPR_MASK, PPC403, { RS } }, | ||
4056 | { "mtdmacc1", XSPR(31,451,204), XSPR_MASK, PPC403, { RS } }, | ||
4057 | { "mtdmacr2", XSPR(31,451,208), XSPR_MASK, PPC403, { RS } }, | ||
4058 | { "mtdmact2", XSPR(31,451,209), XSPR_MASK, PPC403, { RS } }, | ||
4059 | { "mtdmada2", XSPR(31,451,210), XSPR_MASK, PPC403, { RS } }, | ||
4060 | { "mtdmasa2", XSPR(31,451,211), XSPR_MASK, PPC403, { RS } }, | ||
4061 | { "mtdmacc2", XSPR(31,451,212), XSPR_MASK, PPC403, { RS } }, | ||
4062 | { "mtdmacr3", XSPR(31,451,216), XSPR_MASK, PPC403, { RS } }, | ||
4063 | { "mtdmact3", XSPR(31,451,217), XSPR_MASK, PPC403, { RS } }, | ||
4064 | { "mtdmada3", XSPR(31,451,218), XSPR_MASK, PPC403, { RS } }, | ||
4065 | { "mtdmasa3", XSPR(31,451,219), XSPR_MASK, PPC403, { RS } }, | ||
4066 | { "mtdmacc3", XSPR(31,451,220), XSPR_MASK, PPC403, { RS } }, | ||
4067 | { "mtdmasr", XSPR(31,451,224), XSPR_MASK, PPC403, { RS } }, | ||
4068 | { "mtdcr", X(31,451), X_MASK, PPC403 | BOOKE, { SPR, RS } }, | ||
4069 | |||
4070 | { "subfze64",XO(31,456,0,0), XORB_MASK, BOOKE64, { RT, RA } }, | ||
4071 | { "subfze64o",XO(31,456,1,0), XORB_MASK, BOOKE64, { RT, RA } }, | ||
4072 | |||
4073 | { "divdu", XO(31,457,0,0), XO_MASK, PPC64, { RT, RA, RB } }, | ||
4074 | { "divdu.", XO(31,457,0,1), XO_MASK, PPC64, { RT, RA, RB } }, | ||
4075 | { "divduo", XO(31,457,1,0), XO_MASK, PPC64, { RT, RA, RB } }, | ||
4076 | { "divduo.", XO(31,457,1,1), XO_MASK, PPC64, { RT, RA, RB } }, | ||
4077 | |||
4078 | { "addze64", XO(31,458,0,0), XORB_MASK, BOOKE64, { RT, RA } }, | ||
4079 | { "addze64o",XO(31,458,1,0), XORB_MASK, BOOKE64, { RT, RA } }, | ||
4080 | |||
4081 | { "divwu", XO(31,459,0,0), XO_MASK, PPC, { RT, RA, RB } }, | ||
4082 | { "divwu.", XO(31,459,0,1), XO_MASK, PPC, { RT, RA, RB } }, | ||
4083 | { "divwuo", XO(31,459,1,0), XO_MASK, PPC, { RT, RA, RB } }, | ||
4084 | { "divwuo.", XO(31,459,1,1), XO_MASK, PPC, { RT, RA, RB } }, | ||
4085 | |||
4086 | { "mtmq", XSPR(31,467,0), XSPR_MASK, M601, { RS } }, | ||
4087 | { "mtxer", XSPR(31,467,1), XSPR_MASK, COM, { RS } }, | ||
4088 | { "mtlr", XSPR(31,467,8), XSPR_MASK, COM, { RS } }, | ||
4089 | { "mtctr", XSPR(31,467,9), XSPR_MASK, COM, { RS } }, | ||
4090 | { "mttid", XSPR(31,467,17), XSPR_MASK, POWER, { RS } }, | ||
4091 | { "mtdsisr", XSPR(31,467,18), XSPR_MASK, COM, { RS } }, | ||
4092 | { "mtdar", XSPR(31,467,19), XSPR_MASK, COM, { RS } }, | ||
4093 | { "mtrtcu", XSPR(31,467,20), XSPR_MASK, COM, { RS } }, | ||
4094 | { "mtrtcl", XSPR(31,467,21), XSPR_MASK, COM, { RS } }, | ||
4095 | { "mtdec", XSPR(31,467,22), XSPR_MASK, COM, { RS } }, | ||
4096 | { "mtsdr0", XSPR(31,467,24), XSPR_MASK, POWER, { RS } }, | ||
4097 | { "mtsdr1", XSPR(31,467,25), XSPR_MASK, COM, { RS } }, | ||
4098 | { "mtsrr0", XSPR(31,467,26), XSPR_MASK, COM, { RS } }, | ||
4099 | { "mtsrr1", XSPR(31,467,27), XSPR_MASK, COM, { RS } }, | ||
4100 | { "mtcfar", XSPR(31,467,28), XSPR_MASK, POWER6, { RS } }, | ||
4101 | { "mtpid", XSPR(31,467,48), XSPR_MASK, BOOKE, { RS } }, | ||
4102 | { "mtpid", XSPR(31,467,945), XSPR_MASK, PPC403, { RS } }, | ||
4103 | { "mtdecar", XSPR(31,467,54), XSPR_MASK, BOOKE, { RS } }, | ||
4104 | { "mtcsrr0", XSPR(31,467,58), XSPR_MASK, BOOKE, { RS } }, | ||
4105 | { "mtcsrr1", XSPR(31,467,59), XSPR_MASK, BOOKE, { RS } }, | ||
4106 | { "mtdear", XSPR(31,467,61), XSPR_MASK, BOOKE, { RS } }, | ||
4107 | { "mtdear", XSPR(31,467,981), XSPR_MASK, PPC403, { RS } }, | ||
4108 | { "mtesr", XSPR(31,467,62), XSPR_MASK, BOOKE, { RS } }, | ||
4109 | { "mtesr", XSPR(31,467,980), XSPR_MASK, PPC403, { RS } }, | ||
4110 | { "mtivpr", XSPR(31,467,63), XSPR_MASK, BOOKE, { RS } }, | ||
4111 | { "mtcmpa", XSPR(31,467,144), XSPR_MASK, PPC860, { RS } }, | ||
4112 | { "mtcmpb", XSPR(31,467,145), XSPR_MASK, PPC860, { RS } }, | ||
4113 | { "mtcmpc", XSPR(31,467,146), XSPR_MASK, PPC860, { RS } }, | ||
4114 | { "mtcmpd", XSPR(31,467,147), XSPR_MASK, PPC860, { RS } }, | ||
4115 | { "mticr", XSPR(31,467,148), XSPR_MASK, PPC860, { RS } }, | ||
4116 | { "mtder", XSPR(31,467,149), XSPR_MASK, PPC860, { RS } }, | ||
4117 | { "mtcounta", XSPR(31,467,150), XSPR_MASK, PPC860, { RS } }, | ||
4118 | { "mtcountb", XSPR(31,467,151), XSPR_MASK, PPC860, { RS } }, | ||
4119 | { "mtcmpe", XSPR(31,467,152), XSPR_MASK, PPC860, { RS } }, | ||
4120 | { "mtcmpf", XSPR(31,467,153), XSPR_MASK, PPC860, { RS } }, | ||
4121 | { "mtcmpg", XSPR(31,467,154), XSPR_MASK, PPC860, { RS } }, | ||
4122 | { "mtcmph", XSPR(31,467,155), XSPR_MASK, PPC860, { RS } }, | ||
4123 | { "mtlctrl1", XSPR(31,467,156), XSPR_MASK, PPC860, { RS } }, | ||
4124 | { "mtlctrl2", XSPR(31,467,157), XSPR_MASK, PPC860, { RS } }, | ||
4125 | { "mtictrl", XSPR(31,467,158), XSPR_MASK, PPC860, { RS } }, | ||
4126 | { "mtbar", XSPR(31,467,159), XSPR_MASK, PPC860, { RS } }, | ||
4127 | { "mtvrsave", XSPR(31,467,256), XSPR_MASK, PPCVEC, { RS } }, | ||
4128 | { "mtusprg0", XSPR(31,467,256), XSPR_MASK, BOOKE, { RS } }, | ||
4129 | { "mtsprg", XSPR(31,467,256), XSPRG_MASK,PPC, { SPRG, RS } }, | ||
4130 | { "mtsprg0", XSPR(31,467,272), XSPR_MASK, PPC, { RS } }, | ||
4131 | { "mtsprg1", XSPR(31,467,273), XSPR_MASK, PPC, { RS } }, | ||
4132 | { "mtsprg2", XSPR(31,467,274), XSPR_MASK, PPC, { RS } }, | ||
4133 | { "mtsprg3", XSPR(31,467,275), XSPR_MASK, PPC, { RS } }, | ||
4134 | { "mtsprg4", XSPR(31,467,276), XSPR_MASK, PPC405 | BOOKE, { RS } }, | ||
4135 | { "mtsprg5", XSPR(31,467,277), XSPR_MASK, PPC405 | BOOKE, { RS } }, | ||
4136 | { "mtsprg6", XSPR(31,467,278), XSPR_MASK, PPC405 | BOOKE, { RS } }, | ||
4137 | { "mtsprg7", XSPR(31,467,279), XSPR_MASK, PPC405 | BOOKE, { RS } }, | ||
4138 | { "mtasr", XSPR(31,467,280), XSPR_MASK, PPC64, { RS } }, | ||
4139 | { "mtear", XSPR(31,467,282), XSPR_MASK, PPC, { RS } }, | ||
4140 | { "mttbl", XSPR(31,467,284), XSPR_MASK, PPC, { RS } }, | ||
4141 | { "mttbu", XSPR(31,467,285), XSPR_MASK, PPC, { RS } }, | ||
4142 | { "mtdbsr", XSPR(31,467,304), XSPR_MASK, BOOKE, { RS } }, | ||
4143 | { "mtdbsr", XSPR(31,467,1008), XSPR_MASK, PPC403, { RS } }, | ||
4144 | { "mtdbcr0", XSPR(31,467,308), XSPR_MASK, BOOKE, { RS } }, | ||
4145 | { "mtdbcr0", XSPR(31,467,1010), XSPR_MASK, PPC405, { RS } }, | ||
4146 | { "mtdbcr1", XSPR(31,467,309), XSPR_MASK, BOOKE, { RS } }, | ||
4147 | { "mtdbcr1", XSPR(31,467,957), XSPR_MASK, PPC405, { RS } }, | ||
4148 | { "mtdbcr2", XSPR(31,467,310), XSPR_MASK, BOOKE, { RS } }, | ||
4149 | { "mtiac1", XSPR(31,467,312), XSPR_MASK, BOOKE, { RS } }, | ||
4150 | { "mtiac1", XSPR(31,467,1012), XSPR_MASK, PPC403, { RS } }, | ||
4151 | { "mtiac2", XSPR(31,467,313), XSPR_MASK, BOOKE, { RS } }, | ||
4152 | { "mtiac2", XSPR(31,467,1013), XSPR_MASK, PPC403, { RS } }, | ||
4153 | { "mtiac3", XSPR(31,467,314), XSPR_MASK, BOOKE, { RS } }, | ||
4154 | { "mtiac3", XSPR(31,467,948), XSPR_MASK, PPC405, { RS } }, | ||
4155 | { "mtiac4", XSPR(31,467,315), XSPR_MASK, BOOKE, { RS } }, | ||
4156 | { "mtiac4", XSPR(31,467,949), XSPR_MASK, PPC405, { RS } }, | ||
4157 | { "mtdac1", XSPR(31,467,316), XSPR_MASK, BOOKE, { RS } }, | ||
4158 | { "mtdac1", XSPR(31,467,1014), XSPR_MASK, PPC403, { RS } }, | ||
4159 | { "mtdac2", XSPR(31,467,317), XSPR_MASK, BOOKE, { RS } }, | ||
4160 | { "mtdac2", XSPR(31,467,1015), XSPR_MASK, PPC403, { RS } }, | ||
4161 | { "mtdvc1", XSPR(31,467,318), XSPR_MASK, BOOKE, { RS } }, | ||
4162 | { "mtdvc1", XSPR(31,467,950), XSPR_MASK, PPC405, { RS } }, | ||
4163 | { "mtdvc2", XSPR(31,467,319), XSPR_MASK, BOOKE, { RS } }, | ||
4164 | { "mtdvc2", XSPR(31,467,951), XSPR_MASK, PPC405, { RS } }, | ||
4165 | { "mttsr", XSPR(31,467,336), XSPR_MASK, BOOKE, { RS } }, | ||
4166 | { "mttsr", XSPR(31,467,984), XSPR_MASK, PPC403, { RS } }, | ||
4167 | { "mttcr", XSPR(31,467,340), XSPR_MASK, BOOKE, { RS } }, | ||
4168 | { "mttcr", XSPR(31,467,986), XSPR_MASK, PPC403, { RS } }, | ||
4169 | { "mtivor0", XSPR(31,467,400), XSPR_MASK, BOOKE, { RS } }, | ||
4170 | { "mtivor1", XSPR(31,467,401), XSPR_MASK, BOOKE, { RS } }, | ||
4171 | { "mtivor2", XSPR(31,467,402), XSPR_MASK, BOOKE, { RS } }, | ||
4172 | { "mtivor3", XSPR(31,467,403), XSPR_MASK, BOOKE, { RS } }, | ||
4173 | { "mtivor4", XSPR(31,467,404), XSPR_MASK, BOOKE, { RS } }, | ||
4174 | { "mtivor5", XSPR(31,467,405), XSPR_MASK, BOOKE, { RS } }, | ||
4175 | { "mtivor6", XSPR(31,467,406), XSPR_MASK, BOOKE, { RS } }, | ||
4176 | { "mtivor7", XSPR(31,467,407), XSPR_MASK, BOOKE, { RS } }, | ||
4177 | { "mtivor8", XSPR(31,467,408), XSPR_MASK, BOOKE, { RS } }, | ||
4178 | { "mtivor9", XSPR(31,467,409), XSPR_MASK, BOOKE, { RS } }, | ||
4179 | { "mtivor10", XSPR(31,467,410), XSPR_MASK, BOOKE, { RS } }, | ||
4180 | { "mtivor11", XSPR(31,467,411), XSPR_MASK, BOOKE, { RS } }, | ||
4181 | { "mtivor12", XSPR(31,467,412), XSPR_MASK, BOOKE, { RS } }, | ||
4182 | { "mtivor13", XSPR(31,467,413), XSPR_MASK, BOOKE, { RS } }, | ||
4183 | { "mtivor14", XSPR(31,467,414), XSPR_MASK, BOOKE, { RS } }, | ||
4184 | { "mtivor15", XSPR(31,467,415), XSPR_MASK, BOOKE, { RS } }, | ||
4185 | { "mtspefscr", XSPR(31,467,512), XSPR_MASK, PPCSPE, { RS } }, | ||
4186 | { "mtbbear", XSPR(31,467,513), XSPR_MASK, PPCBRLK, { RS } }, | ||
4187 | { "mtbbtar", XSPR(31,467,514), XSPR_MASK, PPCBRLK, { RS } }, | ||
4188 | { "mtivor32", XSPR(31,467,528), XSPR_MASK, PPCSPE, { RS } }, | ||
4189 | { "mtivor33", XSPR(31,467,529), XSPR_MASK, PPCSPE, { RS } }, | ||
4190 | { "mtivor34", XSPR(31,467,530), XSPR_MASK, PPCSPE, { RS } }, | ||
4191 | { "mtivor35", XSPR(31,467,531), XSPR_MASK, PPCPMR, { RS } }, | ||
4192 | { "mtibatu", XSPR(31,467,528), XSPRBAT_MASK, PPC, { SPRBAT, RS } }, | ||
4193 | { "mtibatl", XSPR(31,467,529), XSPRBAT_MASK, PPC, { SPRBAT, RS } }, | ||
4194 | { "mtdbatu", XSPR(31,467,536), XSPRBAT_MASK, PPC, { SPRBAT, RS } }, | ||
4195 | { "mtdbatl", XSPR(31,467,537), XSPRBAT_MASK, PPC, { SPRBAT, RS } }, | ||
4196 | { "mtmcsrr0", XSPR(31,467,570), XSPR_MASK, PPCRFMCI, { RS } }, | ||
4197 | { "mtmcsrr1", XSPR(31,467,571), XSPR_MASK, PPCRFMCI, { RS } }, | ||
4198 | { "mtmcsr", XSPR(31,467,572), XSPR_MASK, PPCRFMCI, { RS } }, | ||
4199 | { "mtummcr0", XSPR(31,467,936), XSPR_MASK, PPC750, { RS } }, | ||
4200 | { "mtupmc1", XSPR(31,467,937), XSPR_MASK, PPC750, { RS } }, | ||
4201 | { "mtupmc2", XSPR(31,467,938), XSPR_MASK, PPC750, { RS } }, | ||
4202 | { "mtusia", XSPR(31,467,939), XSPR_MASK, PPC750, { RS } }, | ||
4203 | { "mtummcr1", XSPR(31,467,940), XSPR_MASK, PPC750, { RS } }, | ||
4204 | { "mtupmc3", XSPR(31,467,941), XSPR_MASK, PPC750, { RS } }, | ||
4205 | { "mtupmc4", XSPR(31,467,942), XSPR_MASK, PPC750, { RS } }, | ||
4206 | { "mtzpr", XSPR(31,467,944), XSPR_MASK, PPC403, { RS } }, | ||
4207 | { "mtccr0", XSPR(31,467,947), XSPR_MASK, PPC405, { RS } }, | ||
4208 | { "mtmmcr0", XSPR(31,467,952), XSPR_MASK, PPC750, { RS } }, | ||
4209 | { "mtsgr", XSPR(31,467,953), XSPR_MASK, PPC403, { RS } }, | ||
4210 | { "mtpmc1", XSPR(31,467,953), XSPR_MASK, PPC750, { RS } }, | ||
4211 | { "mtdcwr", XSPR(31,467,954), XSPR_MASK, PPC403, { RS } }, | ||
4212 | { "mtpmc2", XSPR(31,467,954), XSPR_MASK, PPC750, { RS } }, | ||
4213 | { "mtsler", XSPR(31,467,955), XSPR_MASK, PPC405, { RS } }, | ||
4214 | { "mtsia", XSPR(31,467,955), XSPR_MASK, PPC750, { RS } }, | ||
4215 | { "mtsu0r", XSPR(31,467,956), XSPR_MASK, PPC405, { RS } }, | ||
4216 | { "mtmmcr1", XSPR(31,467,956), XSPR_MASK, PPC750, { RS } }, | ||
4217 | { "mtpmc3", XSPR(31,467,957), XSPR_MASK, PPC750, { RS } }, | ||
4218 | { "mtpmc4", XSPR(31,467,958), XSPR_MASK, PPC750, { RS } }, | ||
4219 | { "mticdbdr", XSPR(31,467,979), XSPR_MASK, PPC403, { RS } }, | ||
4220 | { "mtevpr", XSPR(31,467,982), XSPR_MASK, PPC403, { RS } }, | ||
4221 | { "mtcdbcr", XSPR(31,467,983), XSPR_MASK, PPC403, { RS } }, | ||
4222 | { "mtpit", XSPR(31,467,987), XSPR_MASK, PPC403, { RS } }, | ||
4223 | { "mttbhi", XSPR(31,467,988), XSPR_MASK, PPC403, { RS } }, | ||
4224 | { "mttblo", XSPR(31,467,989), XSPR_MASK, PPC403, { RS } }, | ||
4225 | { "mtsrr2", XSPR(31,467,990), XSPR_MASK, PPC403, { RS } }, | ||
4226 | { "mtsrr3", XSPR(31,467,991), XSPR_MASK, PPC403, { RS } }, | ||
4227 | { "mtl2cr", XSPR(31,467,1017), XSPR_MASK, PPC750, { RS } }, | ||
4228 | { "mtdccr", XSPR(31,467,1018), XSPR_MASK, PPC403, { RS } }, | ||
4229 | { "mticcr", XSPR(31,467,1019), XSPR_MASK, PPC403, { RS } }, | ||
4230 | { "mtictc", XSPR(31,467,1019), XSPR_MASK, PPC750, { RS } }, | ||
4231 | { "mtpbl1", XSPR(31,467,1020), XSPR_MASK, PPC403, { RS } }, | ||
4232 | { "mtthrm1", XSPR(31,467,1020), XSPR_MASK, PPC750, { RS } }, | ||
4233 | { "mtpbu1", XSPR(31,467,1021), XSPR_MASK, PPC403, { RS } }, | ||
4234 | { "mtthrm2", XSPR(31,467,1021), XSPR_MASK, PPC750, { RS } }, | ||
4235 | { "mtpbl2", XSPR(31,467,1022), XSPR_MASK, PPC403, { RS } }, | ||
4236 | { "mtthrm3", XSPR(31,467,1022), XSPR_MASK, PPC750, { RS } }, | ||
4237 | { "mtpbu2", XSPR(31,467,1023), XSPR_MASK, PPC403, { RS } }, | ||
4238 | { "mtspr", X(31,467), X_MASK, COM, { SPR, RS } }, | ||
4239 | |||
4240 | { "dcbi", X(31,470), XRT_MASK, PPC, { RA, RB } }, | ||
4241 | |||
4242 | { "nand", XRC(31,476,0), X_MASK, COM, { RA, RS, RB } }, | ||
4243 | { "nand.", XRC(31,476,1), X_MASK, COM, { RA, RS, RB } }, | ||
4244 | |||
4245 | { "dcbie", X(31,478), XRT_MASK, BOOKE64, { RA, RB } }, | ||
4246 | |||
4247 | { "dcread", X(31,486), X_MASK, PPC403|PPC440, { RT, RA, RB }}, | ||
4248 | |||
4249 | { "mtpmr", X(31,462), X_MASK, PPCPMR, { PMR, RS }}, | ||
4250 | |||
4251 | { "icbtls", X(31,486), X_MASK, PPCCHLK, { CT, RA, RB }}, | ||
4252 | |||
4253 | { "nabs", XO(31,488,0,0), XORB_MASK, M601, { RT, RA } }, | ||
4254 | { "subfme64",XO(31,488,0,0), XORB_MASK, BOOKE64, { RT, RA } }, | ||
4255 | { "nabs.", XO(31,488,0,1), XORB_MASK, M601, { RT, RA } }, | ||
4256 | { "nabso", XO(31,488,1,0), XORB_MASK, M601, { RT, RA } }, | ||
4257 | { "subfme64o",XO(31,488,1,0), XORB_MASK, BOOKE64, { RT, RA } }, | ||
4258 | { "nabso.", XO(31,488,1,1), XORB_MASK, M601, { RT, RA } }, | ||
4259 | |||
4260 | { "divd", XO(31,489,0,0), XO_MASK, PPC64, { RT, RA, RB } }, | ||
4261 | { "divd.", XO(31,489,0,1), XO_MASK, PPC64, { RT, RA, RB } }, | ||
4262 | { "divdo", XO(31,489,1,0), XO_MASK, PPC64, { RT, RA, RB } }, | ||
4263 | { "divdo.", XO(31,489,1,1), XO_MASK, PPC64, { RT, RA, RB } }, | ||
4264 | |||
4265 | { "addme64", XO(31,490,0,0), XORB_MASK, BOOKE64, { RT, RA } }, | ||
4266 | { "addme64o",XO(31,490,1,0), XORB_MASK, BOOKE64, { RT, RA } }, | ||
4267 | |||
4268 | { "divw", XO(31,491,0,0), XO_MASK, PPC, { RT, RA, RB } }, | ||
4269 | { "divw.", XO(31,491,0,1), XO_MASK, PPC, { RT, RA, RB } }, | ||
4270 | { "divwo", XO(31,491,1,0), XO_MASK, PPC, { RT, RA, RB } }, | ||
4271 | { "divwo.", XO(31,491,1,1), XO_MASK, PPC, { RT, RA, RB } }, | ||
4272 | 5123 | ||
4273 | { "icbtlse", X(31,494), X_MASK, PPCCHLK64, { CT, RA, RB }}, | 5124 | {"eqv", XRC(31,284,0), X_MASK, COM, 0, {RA, RS, RB}}, |
5125 | {"eqv.", XRC(31,284,1), X_MASK, COM, 0, {RA, RS, RB}}, | ||
4274 | 5126 | ||
4275 | { "slbia", X(31,498), 0xffffffff, PPC64, { 0 } }, | 5127 | {"lhepx", X(31,287), X_MASK, E500MC|PPCA2, 0, {RT, RA0, RB}}, |
4276 | 5128 | ||
4277 | { "cli", X(31,502), XRB_MASK, POWER, { RT, RA } }, | 5129 | {"mfdcrux", X(31,291), X_MASK, PPC464, 0, {RS, RA}}, |
4278 | 5130 | ||
4279 | { "stdcxe.", XRC(31,511,1), X_MASK, BOOKE64, { RS, RA, RB } }, | 5131 | {"lvexhx", X(31,293), X_MASK, PPCVEC2, 0, {VD, RA0, RB}}, |
5132 | {"lvepx", X(31,295), X_MASK, PPCVEC2, 0, {VD, RA0, RB}}, | ||
4280 | 5133 | ||
4281 | { "mcrxr", X(31,512), XRARB_MASK|(3<<21), COM, { BF } }, | 5134 | {"lxvll", X(31,301), XX1_MASK, PPCVSX3, 0, {XT6, RA0, RB}}, |
4282 | 5135 | ||
4283 | { "bblels", X(31,518), X_MASK, PPCBRLK, { 0 }}, | 5136 | {"mfbhrbe", X(31,302), X_MASK, POWER8, 0, {RT, BHRBE}}, |
4284 | { "mcrxr64", X(31,544), XRARB_MASK|(3<<21), BOOKE64, { BF } }, | 5137 | |
5138 | {"tlbie", X(31,306), X_MASK|1<<20,POWER9, TITAN, {RB, RS, RIC, PRS, X_R}}, | ||
5139 | {"tlbie", X(31,306), XRA_MASK, POWER7, POWER9|TITAN, {RB, RS}}, | ||
5140 | {"tlbie", X(31,306), XRTLRA_MASK, PPC, E500|POWER7|TITAN, {RB, LOPT}}, | ||
5141 | {"tlbi", X(31,306), XRT_MASK, POWER, 0, {RA0, RB}}, | ||
5142 | |||
5143 | {"mfvsrld", X(31,307), XX1RB_MASK, PPCVSX3, 0, {RA, XS6}}, | ||
5144 | |||
5145 | {"ldmx", X(31,309), X_MASK, POWER9, 0, {RT, RA0, RB}}, | ||
5146 | |||
5147 | {"eciwx", X(31,310), X_MASK, PPC, E500|TITAN, {RT, RA0, RB}}, | ||
5148 | |||
5149 | {"lhzux", X(31,311), X_MASK, COM, 0, {RT, RAL, RB}}, | ||
5150 | |||
5151 | {"cbcdtd", X(31,314), XRB_MASK, POWER6, 0, {RA, RS}}, | ||
5152 | |||
5153 | {"xor", XRC(31,316,0), X_MASK, COM, 0, {RA, RS, RB}}, | ||
5154 | {"xor.", XRC(31,316,1), X_MASK, COM, 0, {RA, RS, RB}}, | ||
5155 | |||
5156 | {"dcbtep", XRT(31,319,0), X_MASK, E500MC|PPCA2, 0, {RT, RA0, RB}}, | ||
5157 | |||
5158 | {"mfexisr", XSPR(31,323, 64), XSPR_MASK, PPC403, 0, {RT}}, | ||
5159 | {"mfexier", XSPR(31,323, 66), XSPR_MASK, PPC403, 0, {RT}}, | ||
5160 | {"mfbr0", XSPR(31,323,128), XSPR_MASK, PPC403, 0, {RT}}, | ||
5161 | {"mfbr1", XSPR(31,323,129), XSPR_MASK, PPC403, 0, {RT}}, | ||
5162 | {"mfbr2", XSPR(31,323,130), XSPR_MASK, PPC403, 0, {RT}}, | ||
5163 | {"mfbr3", XSPR(31,323,131), XSPR_MASK, PPC403, 0, {RT}}, | ||
5164 | {"mfbr4", XSPR(31,323,132), XSPR_MASK, PPC403, 0, {RT}}, | ||
5165 | {"mfbr5", XSPR(31,323,133), XSPR_MASK, PPC403, 0, {RT}}, | ||
5166 | {"mfbr6", XSPR(31,323,134), XSPR_MASK, PPC403, 0, {RT}}, | ||
5167 | {"mfbr7", XSPR(31,323,135), XSPR_MASK, PPC403, 0, {RT}}, | ||
5168 | {"mfbear", XSPR(31,323,144), XSPR_MASK, PPC403, 0, {RT}}, | ||
5169 | {"mfbesr", XSPR(31,323,145), XSPR_MASK, PPC403, 0, {RT}}, | ||
5170 | {"mfiocr", XSPR(31,323,160), XSPR_MASK, PPC403, 0, {RT}}, | ||
5171 | {"mfdmacr0", XSPR(31,323,192), XSPR_MASK, PPC403, 0, {RT}}, | ||
5172 | {"mfdmact0", XSPR(31,323,193), XSPR_MASK, PPC403, 0, {RT}}, | ||
5173 | {"mfdmada0", XSPR(31,323,194), XSPR_MASK, PPC403, 0, {RT}}, | ||
5174 | {"mfdmasa0", XSPR(31,323,195), XSPR_MASK, PPC403, 0, {RT}}, | ||
5175 | {"mfdmacc0", XSPR(31,323,196), XSPR_MASK, PPC403, 0, {RT}}, | ||
5176 | {"mfdmacr1", XSPR(31,323,200), XSPR_MASK, PPC403, 0, {RT}}, | ||
5177 | {"mfdmact1", XSPR(31,323,201), XSPR_MASK, PPC403, 0, {RT}}, | ||
5178 | {"mfdmada1", XSPR(31,323,202), XSPR_MASK, PPC403, 0, {RT}}, | ||
5179 | {"mfdmasa1", XSPR(31,323,203), XSPR_MASK, PPC403, 0, {RT}}, | ||
5180 | {"mfdmacc1", XSPR(31,323,204), XSPR_MASK, PPC403, 0, {RT}}, | ||
5181 | {"mfdmacr2", XSPR(31,323,208), XSPR_MASK, PPC403, 0, {RT}}, | ||
5182 | {"mfdmact2", XSPR(31,323,209), XSPR_MASK, PPC403, 0, {RT}}, | ||
5183 | {"mfdmada2", XSPR(31,323,210), XSPR_MASK, PPC403, 0, {RT}}, | ||
5184 | {"mfdmasa2", XSPR(31,323,211), XSPR_MASK, PPC403, 0, {RT}}, | ||
5185 | {"mfdmacc2", XSPR(31,323,212), XSPR_MASK, PPC403, 0, {RT}}, | ||
5186 | {"mfdmacr3", XSPR(31,323,216), XSPR_MASK, PPC403, 0, {RT}}, | ||
5187 | {"mfdmact3", XSPR(31,323,217), XSPR_MASK, PPC403, 0, {RT}}, | ||
5188 | {"mfdmada3", XSPR(31,323,218), XSPR_MASK, PPC403, 0, {RT}}, | ||
5189 | {"mfdmasa3", XSPR(31,323,219), XSPR_MASK, PPC403, 0, {RT}}, | ||
5190 | {"mfdmacc3", XSPR(31,323,220), XSPR_MASK, PPC403, 0, {RT}}, | ||
5191 | {"mfdmasr", XSPR(31,323,224), XSPR_MASK, PPC403, 0, {RT}}, | ||
5192 | {"mfdcr", X(31,323), X_MASK, PPC403|BOOKE|PPCA2|PPC476, E500|TITAN, {RT, SPR}}, | ||
5193 | {"mfdcr.", XRC(31,323,1), X_MASK, PPCA2, 0, {RT, SPR}}, | ||
5194 | |||
5195 | {"lvexwx", X(31,325), X_MASK, PPCVEC2, 0, {VD, RA0, RB}}, | ||
5196 | |||
5197 | {"dcread", X(31,326), X_MASK, PPC476|TITAN, 0, {RT, RA0, RB}}, | ||
5198 | |||
5199 | {"div", XO(31,331,0,0), XO_MASK, M601, 0, {RT, RA, RB}}, | ||
5200 | {"div.", XO(31,331,0,1), XO_MASK, M601, 0, {RT, RA, RB}}, | ||
5201 | |||
5202 | {"lxvdsx", X(31,332), XX1_MASK, PPCVSX, 0, {XT6, RA0, RB}}, | ||
5203 | |||
5204 | {"mfpmr", X(31,334), X_MASK, PPCPMR|PPCE300, 0, {RT, PMR}}, | ||
5205 | {"mftmr", X(31,366), X_MASK, PPCTMR|E6500, 0, {RT, TMR}}, | ||
5206 | |||
5207 | {"slbsync", X(31,338), 0xffffffff, POWER9, 0, {0}}, | ||
5208 | |||
5209 | {"mfmq", XSPR(31,339, 0), XSPR_MASK, M601, 0, {RT}}, | ||
5210 | {"mfxer", XSPR(31,339, 1), XSPR_MASK, COM, 0, {RT}}, | ||
5211 | {"mfrtcu", XSPR(31,339, 4), XSPR_MASK, COM, TITAN, {RT}}, | ||
5212 | {"mfrtcl", XSPR(31,339, 5), XSPR_MASK, COM, TITAN, {RT}}, | ||
5213 | {"mfdec", XSPR(31,339, 6), XSPR_MASK, MFDEC1, 0, {RT}}, | ||
5214 | {"mflr", XSPR(31,339, 8), XSPR_MASK, COM, 0, {RT}}, | ||
5215 | {"mfctr", XSPR(31,339, 9), XSPR_MASK, COM, 0, {RT}}, | ||
5216 | {"mfdscr", XSPR(31,339, 17), XSPR_MASK, POWER6, 0, {RT}}, | ||
5217 | {"mftid", XSPR(31,339, 17), XSPR_MASK, POWER, 0, {RT}}, | ||
5218 | {"mfdsisr", XSPR(31,339, 18), XSPR_MASK, COM, TITAN, {RT}}, | ||
5219 | {"mfdar", XSPR(31,339, 19), XSPR_MASK, COM, TITAN, {RT}}, | ||
5220 | {"mfdec", XSPR(31,339, 22), XSPR_MASK, MFDEC2, MFDEC1, {RT}}, | ||
5221 | {"mfsdr0", XSPR(31,339, 24), XSPR_MASK, POWER, 0, {RT}}, | ||
5222 | {"mfsdr1", XSPR(31,339, 25), XSPR_MASK, COM, TITAN, {RT}}, | ||
5223 | {"mfsrr0", XSPR(31,339, 26), XSPR_MASK, COM, 0, {RT}}, | ||
5224 | {"mfsrr1", XSPR(31,339, 27), XSPR_MASK, COM, 0, {RT}}, | ||
5225 | {"mfcfar", XSPR(31,339, 28), XSPR_MASK, POWER6, 0, {RT}}, | ||
5226 | {"mfpid", XSPR(31,339, 48), XSPR_MASK, BOOKE, 0, {RT}}, | ||
5227 | {"mfcsrr0", XSPR(31,339, 58), XSPR_MASK, BOOKE, 0, {RT}}, | ||
5228 | {"mfcsrr1", XSPR(31,339, 59), XSPR_MASK, BOOKE, 0, {RT}}, | ||
5229 | {"mfdear", XSPR(31,339, 61), XSPR_MASK, BOOKE, 0, {RT}}, | ||
5230 | {"mfesr", XSPR(31,339, 62), XSPR_MASK, BOOKE, 0, {RT}}, | ||
5231 | {"mfivpr", XSPR(31,339, 63), XSPR_MASK, BOOKE, 0, {RT}}, | ||
5232 | {"mfctrl", XSPR(31,339,136), XSPR_MASK, POWER4, 0, {RT}}, | ||
5233 | {"mfcmpa", XSPR(31,339,144), XSPR_MASK, PPC860, 0, {RT}}, | ||
5234 | {"mfcmpb", XSPR(31,339,145), XSPR_MASK, PPC860, 0, {RT}}, | ||
5235 | {"mfcmpc", XSPR(31,339,146), XSPR_MASK, PPC860, 0, {RT}}, | ||
5236 | {"mfcmpd", XSPR(31,339,147), XSPR_MASK, PPC860, 0, {RT}}, | ||
5237 | {"mficr", XSPR(31,339,148), XSPR_MASK, PPC860, 0, {RT}}, | ||
5238 | {"mfder", XSPR(31,339,149), XSPR_MASK, PPC860, 0, {RT}}, | ||
5239 | {"mfcounta", XSPR(31,339,150), XSPR_MASK, PPC860, 0, {RT}}, | ||
5240 | {"mfcountb", XSPR(31,339,151), XSPR_MASK, PPC860, 0, {RT}}, | ||
5241 | {"mfcmpe", XSPR(31,339,152), XSPR_MASK, PPC860, 0, {RT}}, | ||
5242 | {"mfcmpf", XSPR(31,339,153), XSPR_MASK, PPC860, 0, {RT}}, | ||
5243 | {"mfcmpg", XSPR(31,339,154), XSPR_MASK, PPC860, 0, {RT}}, | ||
5244 | {"mfcmph", XSPR(31,339,155), XSPR_MASK, PPC860, 0, {RT}}, | ||
5245 | {"mflctrl1", XSPR(31,339,156), XSPR_MASK, PPC860, 0, {RT}}, | ||
5246 | {"mflctrl2", XSPR(31,339,157), XSPR_MASK, PPC860, 0, {RT}}, | ||
5247 | {"mfictrl", XSPR(31,339,158), XSPR_MASK, PPC860, 0, {RT}}, | ||
5248 | {"mfbar", XSPR(31,339,159), XSPR_MASK, PPC860, 0, {RT}}, | ||
5249 | {"mfvrsave", XSPR(31,339,256), XSPR_MASK, PPCVEC, 0, {RT}}, | ||
5250 | {"mfusprg0", XSPR(31,339,256), XSPR_MASK, BOOKE, 0, {RT}}, | ||
5251 | {"mfsprg", XSPR(31,339,256), XSPRG_MASK, PPC, 0, {RT, SPRG}}, | ||
5252 | {"mfsprg4", XSPR(31,339,260), XSPR_MASK, PPC405|BOOKE, 0, {RT}}, | ||
5253 | {"mfsprg5", XSPR(31,339,261), XSPR_MASK, PPC405|BOOKE, 0, {RT}}, | ||
5254 | {"mfsprg6", XSPR(31,339,262), XSPR_MASK, PPC405|BOOKE, 0, {RT}}, | ||
5255 | {"mfsprg7", XSPR(31,339,263), XSPR_MASK, PPC405|BOOKE, 0, {RT}}, | ||
5256 | {"mftbu", XSPR(31,339,269), XSPR_MASK, POWER4|BOOKE, 0, {RT}}, | ||
5257 | {"mftb", X(31,339), X_MASK, POWER4|BOOKE, 0, {RT, TBR}}, | ||
5258 | {"mftbl", XSPR(31,339,268), XSPR_MASK, POWER4|BOOKE, 0, {RT}}, | ||
5259 | {"mfsprg0", XSPR(31,339,272), XSPR_MASK, PPC, 0, {RT}}, | ||
5260 | {"mfsprg1", XSPR(31,339,273), XSPR_MASK, PPC, 0, {RT}}, | ||
5261 | {"mfsprg2", XSPR(31,339,274), XSPR_MASK, PPC, 0, {RT}}, | ||
5262 | {"mfsprg3", XSPR(31,339,275), XSPR_MASK, PPC, 0, {RT}}, | ||
5263 | {"mfasr", XSPR(31,339,280), XSPR_MASK, PPC64, 0, {RT}}, | ||
5264 | {"mfear", XSPR(31,339,282), XSPR_MASK, PPC, TITAN, {RT}}, | ||
5265 | {"mfpir", XSPR(31,339,286), XSPR_MASK, BOOKE, 0, {RT}}, | ||
5266 | {"mfpvr", XSPR(31,339,287), XSPR_MASK, PPC, 0, {RT}}, | ||
5267 | {"mfdbsr", XSPR(31,339,304), XSPR_MASK, BOOKE, 0, {RT}}, | ||
5268 | {"mfdbcr0", XSPR(31,339,308), XSPR_MASK, BOOKE, 0, {RT}}, | ||
5269 | {"mfdbcr1", XSPR(31,339,309), XSPR_MASK, BOOKE, 0, {RT}}, | ||
5270 | {"mfdbcr2", XSPR(31,339,310), XSPR_MASK, BOOKE, 0, {RT}}, | ||
5271 | {"mfiac1", XSPR(31,339,312), XSPR_MASK, BOOKE, 0, {RT}}, | ||
5272 | {"mfiac2", XSPR(31,339,313), XSPR_MASK, BOOKE, 0, {RT}}, | ||
5273 | {"mfiac3", XSPR(31,339,314), XSPR_MASK, BOOKE, 0, {RT}}, | ||
5274 | {"mfiac4", XSPR(31,339,315), XSPR_MASK, BOOKE, 0, {RT}}, | ||
5275 | {"mfdac1", XSPR(31,339,316), XSPR_MASK, BOOKE, 0, {RT}}, | ||
5276 | {"mfdac2", XSPR(31,339,317), XSPR_MASK, BOOKE, 0, {RT}}, | ||
5277 | {"mfdvc1", XSPR(31,339,318), XSPR_MASK, BOOKE, 0, {RT}}, | ||
5278 | {"mfdvc2", XSPR(31,339,319), XSPR_MASK, BOOKE, 0, {RT}}, | ||
5279 | {"mftsr", XSPR(31,339,336), XSPR_MASK, BOOKE, 0, {RT}}, | ||
5280 | {"mftcr", XSPR(31,339,340), XSPR_MASK, BOOKE, 0, {RT}}, | ||
5281 | {"mfivor0", XSPR(31,339,400), XSPR_MASK, BOOKE, 0, {RT}}, | ||
5282 | {"mfivor1", XSPR(31,339,401), XSPR_MASK, BOOKE, 0, {RT}}, | ||
5283 | {"mfivor2", XSPR(31,339,402), XSPR_MASK, BOOKE, 0, {RT}}, | ||
5284 | {"mfivor3", XSPR(31,339,403), XSPR_MASK, BOOKE, 0, {RT}}, | ||
5285 | {"mfivor4", XSPR(31,339,404), XSPR_MASK, BOOKE, 0, {RT}}, | ||
5286 | {"mfivor5", XSPR(31,339,405), XSPR_MASK, BOOKE, 0, {RT}}, | ||
5287 | {"mfivor6", XSPR(31,339,406), XSPR_MASK, BOOKE, 0, {RT}}, | ||
5288 | {"mfivor7", XSPR(31,339,407), XSPR_MASK, BOOKE, 0, {RT}}, | ||
5289 | {"mfivor8", XSPR(31,339,408), XSPR_MASK, BOOKE, 0, {RT}}, | ||
5290 | {"mfivor9", XSPR(31,339,409), XSPR_MASK, BOOKE, 0, {RT}}, | ||
5291 | {"mfivor10", XSPR(31,339,410), XSPR_MASK, BOOKE, 0, {RT}}, | ||
5292 | {"mfivor11", XSPR(31,339,411), XSPR_MASK, BOOKE, 0, {RT}}, | ||
5293 | {"mfivor12", XSPR(31,339,412), XSPR_MASK, BOOKE, 0, {RT}}, | ||
5294 | {"mfivor13", XSPR(31,339,413), XSPR_MASK, BOOKE, 0, {RT}}, | ||
5295 | {"mfivor14", XSPR(31,339,414), XSPR_MASK, BOOKE, 0, {RT}}, | ||
5296 | {"mfivor15", XSPR(31,339,415), XSPR_MASK, BOOKE, 0, {RT}}, | ||
5297 | {"mfspefscr", XSPR(31,339,512), XSPR_MASK, PPCSPE, 0, {RT}}, | ||
5298 | {"mfbbear", XSPR(31,339,513), XSPR_MASK, PPCBRLK, 0, {RT}}, | ||
5299 | {"mfbbtar", XSPR(31,339,514), XSPR_MASK, PPCBRLK, 0, {RT}}, | ||
5300 | {"mfivor32", XSPR(31,339,528), XSPR_MASK, PPCSPE, 0, {RT}}, | ||
5301 | {"mfibatu", XSPR(31,339,528), XSPRBAT_MASK, PPC, TITAN, {RT, SPRBAT}}, | ||
5302 | {"mfivor33", XSPR(31,339,529), XSPR_MASK, PPCSPE, 0, {RT}}, | ||
5303 | {"mfibatl", XSPR(31,339,529), XSPRBAT_MASK, PPC, TITAN, {RT, SPRBAT}}, | ||
5304 | {"mfivor34", XSPR(31,339,530), XSPR_MASK, PPCSPE, 0, {RT}}, | ||
5305 | {"mfivor35", XSPR(31,339,531), XSPR_MASK, PPCPMR, 0, {RT}}, | ||
5306 | {"mfdbatu", XSPR(31,339,536), XSPRBAT_MASK, PPC, TITAN, {RT, SPRBAT}}, | ||
5307 | {"mfdbatl", XSPR(31,339,537), XSPRBAT_MASK, PPC, TITAN, {RT, SPRBAT}}, | ||
5308 | {"mfic_cst", XSPR(31,339,560), XSPR_MASK, PPC860, 0, {RT}}, | ||
5309 | {"mfic_adr", XSPR(31,339,561), XSPR_MASK, PPC860, 0, {RT}}, | ||
5310 | {"mfic_dat", XSPR(31,339,562), XSPR_MASK, PPC860, 0, {RT}}, | ||
5311 | {"mfdc_cst", XSPR(31,339,568), XSPR_MASK, PPC860, 0, {RT}}, | ||
5312 | {"mfdc_adr", XSPR(31,339,569), XSPR_MASK, PPC860, 0, {RT}}, | ||
5313 | {"mfdc_dat", XSPR(31,339,570), XSPR_MASK, PPC860, 0, {RT}}, | ||
5314 | {"mfmcsrr0", XSPR(31,339,570), XSPR_MASK, PPCRFMCI, 0, {RT}}, | ||
5315 | {"mfmcsrr1", XSPR(31,339,571), XSPR_MASK, PPCRFMCI, 0, {RT}}, | ||
5316 | {"mfmcsr", XSPR(31,339,572), XSPR_MASK, PPCRFMCI, 0, {RT}}, | ||
5317 | {"mfmcar", XSPR(31,339,573), XSPR_MASK, PPCRFMCI, TITAN, {RT}}, | ||
5318 | {"mfdpdr", XSPR(31,339,630), XSPR_MASK, PPC860, 0, {RT}}, | ||
5319 | {"mfdpir", XSPR(31,339,631), XSPR_MASK, PPC860, 0, {RT}}, | ||
5320 | {"mfimmr", XSPR(31,339,638), XSPR_MASK, PPC860, 0, {RT}}, | ||
5321 | {"mfmi_ctr", XSPR(31,339,784), XSPR_MASK, PPC860, 0, {RT}}, | ||
5322 | {"mfmi_ap", XSPR(31,339,786), XSPR_MASK, PPC860, 0, {RT}}, | ||
5323 | {"mfmi_epn", XSPR(31,339,787), XSPR_MASK, PPC860, 0, {RT}}, | ||
5324 | {"mfmi_twc", XSPR(31,339,789), XSPR_MASK, PPC860, 0, {RT}}, | ||
5325 | {"mfmi_rpn", XSPR(31,339,790), XSPR_MASK, PPC860, 0, {RT}}, | ||
5326 | {"mfmd_ctr", XSPR(31,339,792), XSPR_MASK, PPC860, 0, {RT}}, | ||
5327 | {"mfm_casid", XSPR(31,339,793), XSPR_MASK, PPC860, 0, {RT}}, | ||
5328 | {"mfmd_ap", XSPR(31,339,794), XSPR_MASK, PPC860, 0, {RT}}, | ||
5329 | {"mfmd_epn", XSPR(31,339,795), XSPR_MASK, PPC860, 0, {RT}}, | ||
5330 | {"mfmd_twb", XSPR(31,339,796), XSPR_MASK, PPC860, 0, {RT}}, | ||
5331 | {"mfmd_twc", XSPR(31,339,797), XSPR_MASK, PPC860, 0, {RT}}, | ||
5332 | {"mfmd_rpn", XSPR(31,339,798), XSPR_MASK, PPC860, 0, {RT}}, | ||
5333 | {"mfm_tw", XSPR(31,339,799), XSPR_MASK, PPC860, 0, {RT}}, | ||
5334 | {"mfmi_dbcam", XSPR(31,339,816), XSPR_MASK, PPC860, 0, {RT}}, | ||
5335 | {"mfmi_dbram0", XSPR(31,339,817), XSPR_MASK, PPC860, 0, {RT}}, | ||
5336 | {"mfmi_dbram1", XSPR(31,339,818), XSPR_MASK, PPC860, 0, {RT}}, | ||
5337 | {"mfmd_dbcam", XSPR(31,339,824), XSPR_MASK, PPC860, 0, {RT}}, | ||
5338 | {"mfmd_dbram0", XSPR(31,339,825), XSPR_MASK, PPC860, 0, {RT}}, | ||
5339 | {"mfmd_dbram1", XSPR(31,339,826), XSPR_MASK, PPC860, 0, {RT}}, | ||
5340 | {"mfivndx", XSPR(31,339,880), XSPR_MASK, TITAN, 0, {RT}}, | ||
5341 | {"mfdvndx", XSPR(31,339,881), XSPR_MASK, TITAN, 0, {RT}}, | ||
5342 | {"mfivlim", XSPR(31,339,882), XSPR_MASK, TITAN, 0, {RT}}, | ||
5343 | {"mfdvlim", XSPR(31,339,883), XSPR_MASK, TITAN, 0, {RT}}, | ||
5344 | {"mfclcsr", XSPR(31,339,884), XSPR_MASK, TITAN, 0, {RT}}, | ||
5345 | {"mfccr1", XSPR(31,339,888), XSPR_MASK, TITAN, 0, {RT}}, | ||
5346 | {"mfppr", XSPR(31,339,896), XSPR_MASK, POWER7, 0, {RT}}, | ||
5347 | {"mfppr32", XSPR(31,339,898), XSPR_MASK, POWER7, 0, {RT}}, | ||
5348 | {"mfrstcfg", XSPR(31,339,923), XSPR_MASK, TITAN, 0, {RT}}, | ||
5349 | {"mfdcdbtrl", XSPR(31,339,924), XSPR_MASK, TITAN, 0, {RT}}, | ||
5350 | {"mfdcdbtrh", XSPR(31,339,925), XSPR_MASK, TITAN, 0, {RT}}, | ||
5351 | {"mficdbtr", XSPR(31,339,927), XSPR_MASK, TITAN, 0, {RT}}, | ||
5352 | {"mfummcr0", XSPR(31,339,936), XSPR_MASK, PPC750, 0, {RT}}, | ||
5353 | {"mfupmc1", XSPR(31,339,937), XSPR_MASK, PPC750, 0, {RT}}, | ||
5354 | {"mfupmc2", XSPR(31,339,938), XSPR_MASK, PPC750, 0, {RT}}, | ||
5355 | {"mfusia", XSPR(31,339,939), XSPR_MASK, PPC750, 0, {RT}}, | ||
5356 | {"mfummcr1", XSPR(31,339,940), XSPR_MASK, PPC750, 0, {RT}}, | ||
5357 | {"mfupmc3", XSPR(31,339,941), XSPR_MASK, PPC750, 0, {RT}}, | ||
5358 | {"mfupmc4", XSPR(31,339,942), XSPR_MASK, PPC750, 0, {RT}}, | ||
5359 | {"mfzpr", XSPR(31,339,944), XSPR_MASK, PPC403, 0, {RT}}, | ||
5360 | {"mfpid", XSPR(31,339,945), XSPR_MASK, PPC403, 0, {RT}}, | ||
5361 | {"mfmmucr", XSPR(31,339,946), XSPR_MASK, TITAN, 0, {RT}}, | ||
5362 | {"mfccr0", XSPR(31,339,947), XSPR_MASK, PPC405|TITAN, 0, {RT}}, | ||
5363 | {"mfiac3", XSPR(31,339,948), XSPR_MASK, PPC405, 0, {RT}}, | ||
5364 | {"mfiac4", XSPR(31,339,949), XSPR_MASK, PPC405, 0, {RT}}, | ||
5365 | {"mfdvc1", XSPR(31,339,950), XSPR_MASK, PPC405, 0, {RT}}, | ||
5366 | {"mfdvc2", XSPR(31,339,951), XSPR_MASK, PPC405, 0, {RT}}, | ||
5367 | {"mfmmcr0", XSPR(31,339,952), XSPR_MASK, PPC750, 0, {RT}}, | ||
5368 | {"mfpmc1", XSPR(31,339,953), XSPR_MASK, PPC750, 0, {RT}}, | ||
5369 | {"mfsgr", XSPR(31,339,953), XSPR_MASK, PPC403, 0, {RT}}, | ||
5370 | {"mfdcwr", XSPR(31,339,954), XSPR_MASK, PPC403, 0, {RT}}, | ||
5371 | {"mfpmc2", XSPR(31,339,954), XSPR_MASK, PPC750, 0, {RT}}, | ||
5372 | {"mfsia", XSPR(31,339,955), XSPR_MASK, PPC750, 0, {RT}}, | ||
5373 | {"mfsler", XSPR(31,339,955), XSPR_MASK, PPC405, 0, {RT}}, | ||
5374 | {"mfmmcr1", XSPR(31,339,956), XSPR_MASK, PPC750, 0, {RT}}, | ||
5375 | {"mfsu0r", XSPR(31,339,956), XSPR_MASK, PPC405, 0, {RT}}, | ||
5376 | {"mfdbcr1", XSPR(31,339,957), XSPR_MASK, PPC405, 0, {RT}}, | ||
5377 | {"mfpmc3", XSPR(31,339,957), XSPR_MASK, PPC750, 0, {RT}}, | ||
5378 | {"mfpmc4", XSPR(31,339,958), XSPR_MASK, PPC750, 0, {RT}}, | ||
5379 | {"mficdbdr", XSPR(31,339,979), XSPR_MASK, PPC403|TITAN, 0, {RT}}, | ||
5380 | {"mfesr", XSPR(31,339,980), XSPR_MASK, PPC403, 0, {RT}}, | ||
5381 | {"mfdear", XSPR(31,339,981), XSPR_MASK, PPC403, 0, {RT}}, | ||
5382 | {"mfevpr", XSPR(31,339,982), XSPR_MASK, PPC403, 0, {RT}}, | ||
5383 | {"mfcdbcr", XSPR(31,339,983), XSPR_MASK, PPC403, 0, {RT}}, | ||
5384 | {"mftsr", XSPR(31,339,984), XSPR_MASK, PPC403, 0, {RT}}, | ||
5385 | {"mftcr", XSPR(31,339,986), XSPR_MASK, PPC403, 0, {RT}}, | ||
5386 | {"mfpit", XSPR(31,339,987), XSPR_MASK, PPC403, 0, {RT}}, | ||
5387 | {"mftbhi", XSPR(31,339,988), XSPR_MASK, PPC403, 0, {RT}}, | ||
5388 | {"mftblo", XSPR(31,339,989), XSPR_MASK, PPC403, 0, {RT}}, | ||
5389 | {"mfsrr2", XSPR(31,339,990), XSPR_MASK, PPC403, 0, {RT}}, | ||
5390 | {"mfsrr3", XSPR(31,339,991), XSPR_MASK, PPC403, 0, {RT}}, | ||
5391 | {"mfdbsr", XSPR(31,339,1008), XSPR_MASK, PPC403, 0, {RT}}, | ||
5392 | {"mfdbcr0", XSPR(31,339,1010), XSPR_MASK, PPC405, 0, {RT}}, | ||
5393 | {"mfdbdr", XSPR(31,339,1011), XSPR_MASK, TITAN, 0, {RS}}, | ||
5394 | {"mfiac1", XSPR(31,339,1012), XSPR_MASK, PPC403, 0, {RT}}, | ||
5395 | {"mfiac2", XSPR(31,339,1013), XSPR_MASK, PPC403, 0, {RT}}, | ||
5396 | {"mfdac1", XSPR(31,339,1014), XSPR_MASK, PPC403, 0, {RT}}, | ||
5397 | {"mfdac2", XSPR(31,339,1015), XSPR_MASK, PPC403, 0, {RT}}, | ||
5398 | {"mfl2cr", XSPR(31,339,1017), XSPR_MASK, PPC750, 0, {RT}}, | ||
5399 | {"mfdccr", XSPR(31,339,1018), XSPR_MASK, PPC403, 0, {RT}}, | ||
5400 | {"mficcr", XSPR(31,339,1019), XSPR_MASK, PPC403, 0, {RT}}, | ||
5401 | {"mfictc", XSPR(31,339,1019), XSPR_MASK, PPC750, 0, {RT}}, | ||
5402 | {"mfpbl1", XSPR(31,339,1020), XSPR_MASK, PPC403, 0, {RT}}, | ||
5403 | {"mfthrm1", XSPR(31,339,1020), XSPR_MASK, PPC750, 0, {RT}}, | ||
5404 | {"mfpbu1", XSPR(31,339,1021), XSPR_MASK, PPC403, 0, {RT}}, | ||
5405 | {"mfthrm2", XSPR(31,339,1021), XSPR_MASK, PPC750, 0, {RT}}, | ||
5406 | {"mfpbl2", XSPR(31,339,1022), XSPR_MASK, PPC403, 0, {RT}}, | ||
5407 | {"mfthrm3", XSPR(31,339,1022), XSPR_MASK, PPC750, 0, {RT}}, | ||
5408 | {"mfpbu2", XSPR(31,339,1023), XSPR_MASK, PPC403, 0, {RT}}, | ||
5409 | {"mfspr", X(31,339), X_MASK, COM, 0, {RT, SPR}}, | ||
5410 | |||
5411 | {"lwax", X(31,341), X_MASK, PPC64, 0, {RT, RA0, RB}}, | ||
5412 | |||
5413 | {"dst", XDSS(31,342,0), XDSS_MASK, PPCVEC, 0, {RA, RB, STRM}}, | ||
5414 | |||
5415 | {"lhax", X(31,343), X_MASK, COM, 0, {RT, RA0, RB}}, | ||
5416 | |||
5417 | {"lvxl", X(31,359), X_MASK, PPCVEC, 0, {VD, RA0, RB}}, | ||
5418 | |||
5419 | {"abs", XO(31,360,0,0), XORB_MASK, M601, 0, {RT, RA}}, | ||
5420 | {"abs.", XO(31,360,0,1), XORB_MASK, M601, 0, {RT, RA}}, | ||
5421 | |||
5422 | {"divs", XO(31,363,0,0), XO_MASK, M601, 0, {RT, RA, RB}}, | ||
5423 | {"divs.", XO(31,363,0,1), XO_MASK, M601, 0, {RT, RA, RB}}, | ||
5424 | |||
5425 | {"lxvwsx", X(31,364), XX1_MASK, PPCVSX3, 0, {XT6, RA0, RB}}, | ||
5426 | |||
5427 | {"tlbia", X(31,370), 0xffffffff, PPC, E500|TITAN, {0}}, | ||
5428 | |||
5429 | {"mftbu", XSPR(31,371,269), XSPR_MASK, PPC, NO371|POWER4, {RT}}, | ||
5430 | {"mftb", X(31,371), X_MASK, PPC, NO371|POWER4, {RT, TBR}}, | ||
5431 | {"mftbl", XSPR(31,371,268), XSPR_MASK, PPC, NO371|POWER4, {RT}}, | ||
5432 | |||
5433 | {"lwaux", X(31,373), X_MASK, PPC64, 0, {RT, RAL, RB}}, | ||
5434 | |||
5435 | {"dstst", XDSS(31,374,0), XDSS_MASK, PPCVEC, 0, {RA, RB, STRM}}, | ||
5436 | |||
5437 | {"lhaux", X(31,375), X_MASK, COM, 0, {RT, RAL, RB}}, | ||
5438 | |||
5439 | {"popcntw", X(31,378), XRB_MASK, POWER7|PPCA2, 0, {RA, RS}}, | ||
5440 | |||
5441 | {"mtdcrx", X(31,387), X_MASK, BOOKE|PPCA2|PPC476, TITAN, {RA, RS}}, | ||
5442 | {"mtdcrx.", XRC(31,387,1), X_MASK, PPCA2, 0, {RA, RS}}, | ||
5443 | |||
5444 | {"stvexbx", X(31,389), X_MASK, PPCVEC2, 0, {VS, RA0, RB}}, | ||
5445 | |||
5446 | {"dcblc", X(31,390), X_MASK, PPCCHLK|PPC476|TITAN, 0, {CT, RA0, RB}}, | ||
5447 | {"stdfcmx", APU(31,391,0), APU_MASK, PPC405, 0, {FCRT, RA, RB}}, | ||
5448 | |||
5449 | {"divdeu", XO(31,393,0,0), XO_MASK, POWER7|PPCA2, 0, {RT, RA, RB}}, | ||
5450 | {"divdeu.", XO(31,393,0,1), XO_MASK, POWER7|PPCA2, 0, {RT, RA, RB}}, | ||
5451 | {"divweu", XO(31,395,0,0), XO_MASK, POWER7|PPCA2, 0, {RT, RA, RB}}, | ||
5452 | {"divweu.", XO(31,395,0,1), XO_MASK, POWER7|PPCA2, 0, {RT, RA, RB}}, | ||
5453 | |||
5454 | {"stxvx", X(31,396), XX1_MASK, PPCVSX3, 0, {XS6, RA0, RB}}, | ||
5455 | {"stxvl", X(31,397), XX1_MASK, PPCVSX3, 0, {XS6, RA0, RB}}, | ||
5456 | |||
5457 | {"dcblce", X(31,398), X_MASK, PPCCHLK, E500MC, {CT, RA, RB}}, | ||
5458 | |||
5459 | {"slbmte", X(31,402), XRA_MASK, PPC64, 0, {RS, RB}}, | ||
5460 | |||
5461 | {"mtvsrws", X(31,403), XX1RB_MASK, PPCVSX3, 0, {XT6, RA}}, | ||
5462 | |||
5463 | {"pbt.", XRC(31,404,1), X_MASK, POWER8, 0, {RS, RA0, RB}}, | ||
5464 | |||
5465 | {"icswx", XRC(31,406,0), X_MASK, POWER7|PPCA2, 0, {RS, RA, RB}}, | ||
5466 | {"icswx.", XRC(31,406,1), X_MASK, POWER7|PPCA2, 0, {RS, RA, RB}}, | ||
5467 | |||
5468 | {"sthx", X(31,407), X_MASK, COM, 0, {RS, RA0, RB}}, | ||
5469 | |||
5470 | {"orc", XRC(31,412,0), X_MASK, COM, 0, {RA, RS, RB}}, | ||
5471 | {"orc.", XRC(31,412,1), X_MASK, COM, 0, {RA, RS, RB}}, | ||
5472 | |||
5473 | {"sthepx", X(31,415), X_MASK, E500MC|PPCA2, 0, {RS, RA0, RB}}, | ||
5474 | |||
5475 | {"mtdcrux", X(31,419), X_MASK, PPC464, 0, {RA, RS}}, | ||
5476 | |||
5477 | {"stvexhx", X(31,421), X_MASK, PPCVEC2, 0, {VS, RA0, RB}}, | ||
5478 | |||
5479 | {"dcblq.", XRC(31,422,1), X_MASK, E6500, 0, {CT, RA0, RB}}, | ||
5480 | |||
5481 | {"divde", XO(31,425,0,0), XO_MASK, POWER7|PPCA2, 0, {RT, RA, RB}}, | ||
5482 | {"divde.", XO(31,425,0,1), XO_MASK, POWER7|PPCA2, 0, {RT, RA, RB}}, | ||
5483 | {"divwe", XO(31,427,0,0), XO_MASK, POWER7|PPCA2, 0, {RT, RA, RB}}, | ||
5484 | {"divwe.", XO(31,427,0,1), XO_MASK, POWER7|PPCA2, 0, {RT, RA, RB}}, | ||
5485 | |||
5486 | {"stxvll", X(31,429), XX1_MASK, PPCVSX3, 0, {XS6, RA0, RB}}, | ||
5487 | |||
5488 | {"clrbhrb", X(31,430), 0xffffffff, POWER8, 0, {0}}, | ||
5489 | |||
5490 | {"slbie", X(31,434), XRTRA_MASK, PPC64, 0, {RB}}, | ||
5491 | |||
5492 | {"mtvsrdd", X(31,435), XX1_MASK, PPCVSX3, 0, {XT6, RA0, RB}}, | ||
5493 | |||
5494 | {"ecowx", X(31,438), X_MASK, PPC, E500|TITAN, {RT, RA0, RB}}, | ||
5495 | |||
5496 | {"sthux", X(31,439), X_MASK, COM, 0, {RS, RAS, RB}}, | ||
5497 | |||
5498 | {"mdors", 0x7f9ce378, 0xffffffff, E500MC, 0, {0}}, | ||
5499 | |||
5500 | {"miso", 0x7f5ad378, 0xffffffff, E6500, 0, {0}}, | ||
5501 | |||
5502 | /* The "yield", "mdoio" and "mdoom" instructions are extended mnemonics for | ||
5503 | "or rX,rX,rX", with rX being r27, r29 and r30 respectively. */ | ||
5504 | {"yield", 0x7f7bdb78, 0xffffffff, POWER7, 0, {0}}, | ||
5505 | {"mdoio", 0x7fbdeb78, 0xffffffff, POWER7, 0, {0}}, | ||
5506 | {"mdoom", 0x7fdef378, 0xffffffff, POWER7, 0, {0}}, | ||
5507 | {"mr", XRC(31,444,0), X_MASK, COM, 0, {RA, RS, RBS}}, | ||
5508 | {"or", XRC(31,444,0), X_MASK, COM, 0, {RA, RS, RB}}, | ||
5509 | {"mr.", XRC(31,444,1), X_MASK, COM, 0, {RA, RS, RBS}}, | ||
5510 | {"or.", XRC(31,444,1), X_MASK, COM, 0, {RA, RS, RB}}, | ||
5511 | |||
5512 | {"mtexisr", XSPR(31,451, 64), XSPR_MASK, PPC403, 0, {RS}}, | ||
5513 | {"mtexier", XSPR(31,451, 66), XSPR_MASK, PPC403, 0, {RS}}, | ||
5514 | {"mtbr0", XSPR(31,451,128), XSPR_MASK, PPC403, 0, {RS}}, | ||
5515 | {"mtbr1", XSPR(31,451,129), XSPR_MASK, PPC403, 0, {RS}}, | ||
5516 | {"mtbr2", XSPR(31,451,130), XSPR_MASK, PPC403, 0, {RS}}, | ||
5517 | {"mtbr3", XSPR(31,451,131), XSPR_MASK, PPC403, 0, {RS}}, | ||
5518 | {"mtbr4", XSPR(31,451,132), XSPR_MASK, PPC403, 0, {RS}}, | ||
5519 | {"mtbr5", XSPR(31,451,133), XSPR_MASK, PPC403, 0, {RS}}, | ||
5520 | {"mtbr6", XSPR(31,451,134), XSPR_MASK, PPC403, 0, {RS}}, | ||
5521 | {"mtbr7", XSPR(31,451,135), XSPR_MASK, PPC403, 0, {RS}}, | ||
5522 | {"mtbear", XSPR(31,451,144), XSPR_MASK, PPC403, 0, {RS}}, | ||
5523 | {"mtbesr", XSPR(31,451,145), XSPR_MASK, PPC403, 0, {RS}}, | ||
5524 | {"mtiocr", XSPR(31,451,160), XSPR_MASK, PPC403, 0, {RS}}, | ||
5525 | {"mtdmacr0", XSPR(31,451,192), XSPR_MASK, PPC403, 0, {RS}}, | ||
5526 | {"mtdmact0", XSPR(31,451,193), XSPR_MASK, PPC403, 0, {RS}}, | ||
5527 | {"mtdmada0", XSPR(31,451,194), XSPR_MASK, PPC403, 0, {RS}}, | ||
5528 | {"mtdmasa0", XSPR(31,451,195), XSPR_MASK, PPC403, 0, {RS}}, | ||
5529 | {"mtdmacc0", XSPR(31,451,196), XSPR_MASK, PPC403, 0, {RS}}, | ||
5530 | {"mtdmacr1", XSPR(31,451,200), XSPR_MASK, PPC403, 0, {RS}}, | ||
5531 | {"mtdmact1", XSPR(31,451,201), XSPR_MASK, PPC403, 0, {RS}}, | ||
5532 | {"mtdmada1", XSPR(31,451,202), XSPR_MASK, PPC403, 0, {RS}}, | ||
5533 | {"mtdmasa1", XSPR(31,451,203), XSPR_MASK, PPC403, 0, {RS}}, | ||
5534 | {"mtdmacc1", XSPR(31,451,204), XSPR_MASK, PPC403, 0, {RS}}, | ||
5535 | {"mtdmacr2", XSPR(31,451,208), XSPR_MASK, PPC403, 0, {RS}}, | ||
5536 | {"mtdmact2", XSPR(31,451,209), XSPR_MASK, PPC403, 0, {RS}}, | ||
5537 | {"mtdmada2", XSPR(31,451,210), XSPR_MASK, PPC403, 0, {RS}}, | ||
5538 | {"mtdmasa2", XSPR(31,451,211), XSPR_MASK, PPC403, 0, {RS}}, | ||
5539 | {"mtdmacc2", XSPR(31,451,212), XSPR_MASK, PPC403, 0, {RS}}, | ||
5540 | {"mtdmacr3", XSPR(31,451,216), XSPR_MASK, PPC403, 0, {RS}}, | ||
5541 | {"mtdmact3", XSPR(31,451,217), XSPR_MASK, PPC403, 0, {RS}}, | ||
5542 | {"mtdmada3", XSPR(31,451,218), XSPR_MASK, PPC403, 0, {RS}}, | ||
5543 | {"mtdmasa3", XSPR(31,451,219), XSPR_MASK, PPC403, 0, {RS}}, | ||
5544 | {"mtdmacc3", XSPR(31,451,220), XSPR_MASK, PPC403, 0, {RS}}, | ||
5545 | {"mtdmasr", XSPR(31,451,224), XSPR_MASK, PPC403, 0, {RS}}, | ||
5546 | {"mtdcr", X(31,451), X_MASK, PPC403|BOOKE|PPCA2|PPC476, E500|TITAN, {SPR, RS}}, | ||
5547 | {"mtdcr.", XRC(31,451,1), X_MASK, PPCA2, 0, {SPR, RS}}, | ||
5548 | |||
5549 | {"stvexwx", X(31,453), X_MASK, PPCVEC2, 0, {VS, RA0, RB}}, | ||
5550 | |||
5551 | {"dccci", X(31,454), XRT_MASK, PPC403|PPC440|TITAN|PPCA2, 0, {RAOPT, RBOPT}}, | ||
5552 | {"dci", X(31,454), XRARB_MASK, PPCA2|PPC476, 0, {CT}}, | ||
5553 | |||
5554 | {"divdu", XO(31,457,0,0), XO_MASK, PPC64, 0, {RT, RA, RB}}, | ||
5555 | {"divdu.", XO(31,457,0,1), XO_MASK, PPC64, 0, {RT, RA, RB}}, | ||
5556 | |||
5557 | {"divwu", XO(31,459,0,0), XO_MASK, PPC, 0, {RT, RA, RB}}, | ||
5558 | {"divwu.", XO(31,459,0,1), XO_MASK, PPC, 0, {RT, RA, RB}}, | ||
5559 | |||
5560 | {"mtpmr", X(31,462), X_MASK, PPCPMR|PPCE300, 0, {PMR, RS}}, | ||
5561 | {"mttmr", X(31,494), X_MASK, PPCTMR|E6500, 0, {TMR, RS}}, | ||
5562 | |||
5563 | {"slbieg", X(31,466), XRA_MASK, POWER9, 0, {RS, RB}}, | ||
5564 | |||
5565 | {"mtmq", XSPR(31,467, 0), XSPR_MASK, M601, 0, {RS}}, | ||
5566 | {"mtxer", XSPR(31,467, 1), XSPR_MASK, COM, 0, {RS}}, | ||
5567 | {"mtlr", XSPR(31,467, 8), XSPR_MASK, COM, 0, {RS}}, | ||
5568 | {"mtctr", XSPR(31,467, 9), XSPR_MASK, COM, 0, {RS}}, | ||
5569 | {"mtdscr", XSPR(31,467, 17), XSPR_MASK, POWER6, 0, {RS}}, | ||
5570 | {"mttid", XSPR(31,467, 17), XSPR_MASK, POWER, 0, {RS}}, | ||
5571 | {"mtdsisr", XSPR(31,467, 18), XSPR_MASK, COM, TITAN, {RS}}, | ||
5572 | {"mtdar", XSPR(31,467, 19), XSPR_MASK, COM, TITAN, {RS}}, | ||
5573 | {"mtrtcu", XSPR(31,467, 20), XSPR_MASK, COM, TITAN, {RS}}, | ||
5574 | {"mtrtcl", XSPR(31,467, 21), XSPR_MASK, COM, TITAN, {RS}}, | ||
5575 | {"mtdec", XSPR(31,467, 22), XSPR_MASK, COM, 0, {RS}}, | ||
5576 | {"mtsdr0", XSPR(31,467, 24), XSPR_MASK, POWER, 0, {RS}}, | ||
5577 | {"mtsdr1", XSPR(31,467, 25), XSPR_MASK, COM, TITAN, {RS}}, | ||
5578 | {"mtsrr0", XSPR(31,467, 26), XSPR_MASK, COM, 0, {RS}}, | ||
5579 | {"mtsrr1", XSPR(31,467, 27), XSPR_MASK, COM, 0, {RS}}, | ||
5580 | {"mtcfar", XSPR(31,467, 28), XSPR_MASK, POWER6, 0, {RS}}, | ||
5581 | {"mtpid", XSPR(31,467, 48), XSPR_MASK, BOOKE, 0, {RS}}, | ||
5582 | {"mtdecar", XSPR(31,467, 54), XSPR_MASK, BOOKE, 0, {RS}}, | ||
5583 | {"mtcsrr0", XSPR(31,467, 58), XSPR_MASK, BOOKE, 0, {RS}}, | ||
5584 | {"mtcsrr1", XSPR(31,467, 59), XSPR_MASK, BOOKE, 0, {RS}}, | ||
5585 | {"mtdear", XSPR(31,467, 61), XSPR_MASK, BOOKE, 0, {RS}}, | ||
5586 | {"mtesr", XSPR(31,467, 62), XSPR_MASK, BOOKE, 0, {RS}}, | ||
5587 | {"mtivpr", XSPR(31,467, 63), XSPR_MASK, BOOKE, 0, {RS}}, | ||
5588 | {"mtcmpa", XSPR(31,467,144), XSPR_MASK, PPC860, 0, {RS}}, | ||
5589 | {"mtcmpb", XSPR(31,467,145), XSPR_MASK, PPC860, 0, {RS}}, | ||
5590 | {"mtcmpc", XSPR(31,467,146), XSPR_MASK, PPC860, 0, {RS}}, | ||
5591 | {"mtcmpd", XSPR(31,467,147), XSPR_MASK, PPC860, 0, {RS}}, | ||
5592 | {"mticr", XSPR(31,467,148), XSPR_MASK, PPC860, 0, {RS}}, | ||
5593 | {"mtder", XSPR(31,467,149), XSPR_MASK, PPC860, 0, {RS}}, | ||
5594 | {"mtcounta", XSPR(31,467,150), XSPR_MASK, PPC860, 0, {RS}}, | ||
5595 | {"mtcountb", XSPR(31,467,151), XSPR_MASK, PPC860, 0, {RS}}, | ||
5596 | {"mtctrl", XSPR(31,467,152), XSPR_MASK, POWER4, 0, {RS}}, | ||
5597 | {"mtcmpe", XSPR(31,467,152), XSPR_MASK, PPC860, 0, {RS}}, | ||
5598 | {"mtcmpf", XSPR(31,467,153), XSPR_MASK, PPC860, 0, {RS}}, | ||
5599 | {"mtcmpg", XSPR(31,467,154), XSPR_MASK, PPC860, 0, {RS}}, | ||
5600 | {"mtcmph", XSPR(31,467,155), XSPR_MASK, PPC860, 0, {RS}}, | ||
5601 | {"mtlctrl1", XSPR(31,467,156), XSPR_MASK, PPC860, 0, {RS}}, | ||
5602 | {"mtlctrl2", XSPR(31,467,157), XSPR_MASK, PPC860, 0, {RS}}, | ||
5603 | {"mtictrl", XSPR(31,467,158), XSPR_MASK, PPC860, 0, {RS}}, | ||
5604 | {"mtbar", XSPR(31,467,159), XSPR_MASK, PPC860, 0, {RS}}, | ||
5605 | {"mtvrsave", XSPR(31,467,256), XSPR_MASK, PPCVEC, 0, {RS}}, | ||
5606 | {"mtusprg0", XSPR(31,467,256), XSPR_MASK, BOOKE, 0, {RS}}, | ||
5607 | {"mtsprg", XSPR(31,467,256), XSPRG_MASK, PPC, 0, {SPRG, RS}}, | ||
5608 | {"mtsprg0", XSPR(31,467,272), XSPR_MASK, PPC, 0, {RS}}, | ||
5609 | {"mtsprg1", XSPR(31,467,273), XSPR_MASK, PPC, 0, {RS}}, | ||
5610 | {"mtsprg2", XSPR(31,467,274), XSPR_MASK, PPC, 0, {RS}}, | ||
5611 | {"mtsprg3", XSPR(31,467,275), XSPR_MASK, PPC, 0, {RS}}, | ||
5612 | {"mtsprg4", XSPR(31,467,276), XSPR_MASK, PPC405|BOOKE, 0, {RS}}, | ||
5613 | {"mtsprg5", XSPR(31,467,277), XSPR_MASK, PPC405|BOOKE, 0, {RS}}, | ||
5614 | {"mtsprg6", XSPR(31,467,278), XSPR_MASK, PPC405|BOOKE, 0, {RS}}, | ||
5615 | {"mtsprg7", XSPR(31,467,279), XSPR_MASK, PPC405|BOOKE, 0, {RS}}, | ||
5616 | {"mtasr", XSPR(31,467,280), XSPR_MASK, PPC64, 0, {RS}}, | ||
5617 | {"mtear", XSPR(31,467,282), XSPR_MASK, PPC, TITAN, {RS}}, | ||
5618 | {"mttbl", XSPR(31,467,284), XSPR_MASK, PPC, 0, {RS}}, | ||
5619 | {"mttbu", XSPR(31,467,285), XSPR_MASK, PPC, 0, {RS}}, | ||
5620 | {"mtdbsr", XSPR(31,467,304), XSPR_MASK, BOOKE, 0, {RS}}, | ||
5621 | {"mtdbcr0", XSPR(31,467,308), XSPR_MASK, BOOKE, 0, {RS}}, | ||
5622 | {"mtdbcr1", XSPR(31,467,309), XSPR_MASK, BOOKE, 0, {RS}}, | ||
5623 | {"mtdbcr2", XSPR(31,467,310), XSPR_MASK, BOOKE, 0, {RS}}, | ||
5624 | {"mtiac1", XSPR(31,467,312), XSPR_MASK, BOOKE, 0, {RS}}, | ||
5625 | {"mtiac2", XSPR(31,467,313), XSPR_MASK, BOOKE, 0, {RS}}, | ||
5626 | {"mtiac3", XSPR(31,467,314), XSPR_MASK, BOOKE, 0, {RS}}, | ||
5627 | {"mtiac4", XSPR(31,467,315), XSPR_MASK, BOOKE, 0, {RS}}, | ||
5628 | {"mtdac1", XSPR(31,467,316), XSPR_MASK, BOOKE, 0, {RS}}, | ||
5629 | {"mtdac2", XSPR(31,467,317), XSPR_MASK, BOOKE, 0, {RS}}, | ||
5630 | {"mtdvc1", XSPR(31,467,318), XSPR_MASK, BOOKE, 0, {RS}}, | ||
5631 | {"mtdvc2", XSPR(31,467,319), XSPR_MASK, BOOKE, 0, {RS}}, | ||
5632 | {"mttsr", XSPR(31,467,336), XSPR_MASK, BOOKE, 0, {RS}}, | ||
5633 | {"mttcr", XSPR(31,467,340), XSPR_MASK, BOOKE, 0, {RS}}, | ||
5634 | {"mtivor0", XSPR(31,467,400), XSPR_MASK, BOOKE, 0, {RS}}, | ||
5635 | {"mtivor1", XSPR(31,467,401), XSPR_MASK, BOOKE, 0, {RS}}, | ||
5636 | {"mtivor2", XSPR(31,467,402), XSPR_MASK, BOOKE, 0, {RS}}, | ||
5637 | {"mtivor3", XSPR(31,467,403), XSPR_MASK, BOOKE, 0, {RS}}, | ||
5638 | {"mtivor4", XSPR(31,467,404), XSPR_MASK, BOOKE, 0, {RS}}, | ||
5639 | {"mtivor5", XSPR(31,467,405), XSPR_MASK, BOOKE, 0, {RS}}, | ||
5640 | {"mtivor6", XSPR(31,467,406), XSPR_MASK, BOOKE, 0, {RS}}, | ||
5641 | {"mtivor7", XSPR(31,467,407), XSPR_MASK, BOOKE, 0, {RS}}, | ||
5642 | {"mtivor8", XSPR(31,467,408), XSPR_MASK, BOOKE, 0, {RS}}, | ||
5643 | {"mtivor9", XSPR(31,467,409), XSPR_MASK, BOOKE, 0, {RS}}, | ||
5644 | {"mtivor10", XSPR(31,467,410), XSPR_MASK, BOOKE, 0, {RS}}, | ||
5645 | {"mtivor11", XSPR(31,467,411), XSPR_MASK, BOOKE, 0, {RS}}, | ||
5646 | {"mtivor12", XSPR(31,467,412), XSPR_MASK, BOOKE, 0, {RS}}, | ||
5647 | {"mtivor13", XSPR(31,467,413), XSPR_MASK, BOOKE, 0, {RS}}, | ||
5648 | {"mtivor14", XSPR(31,467,414), XSPR_MASK, BOOKE, 0, {RS}}, | ||
5649 | {"mtivor15", XSPR(31,467,415), XSPR_MASK, BOOKE, 0, {RS}}, | ||
5650 | {"mtspefscr", XSPR(31,467,512), XSPR_MASK, PPCSPE, 0, {RS}}, | ||
5651 | {"mtbbear", XSPR(31,467,513), XSPR_MASK, PPCBRLK, 0, {RS}}, | ||
5652 | {"mtbbtar", XSPR(31,467,514), XSPR_MASK, PPCBRLK, 0, {RS}}, | ||
5653 | {"mtivor32", XSPR(31,467,528), XSPR_MASK, PPCSPE, 0, {RS}}, | ||
5654 | {"mtibatu", XSPR(31,467,528), XSPRBAT_MASK, PPC, TITAN, {SPRBAT, RS}}, | ||
5655 | {"mtivor33", XSPR(31,467,529), XSPR_MASK, PPCSPE, 0, {RS}}, | ||
5656 | {"mtibatl", XSPR(31,467,529), XSPRBAT_MASK, PPC, TITAN, {SPRBAT, RS}}, | ||
5657 | {"mtivor34", XSPR(31,467,530), XSPR_MASK, PPCSPE, 0, {RS}}, | ||
5658 | {"mtivor35", XSPR(31,467,531), XSPR_MASK, PPCPMR, 0, {RS}}, | ||
5659 | {"mtdbatu", XSPR(31,467,536), XSPRBAT_MASK, PPC, TITAN, {SPRBAT, RS}}, | ||
5660 | {"mtdbatl", XSPR(31,467,537), XSPRBAT_MASK, PPC, TITAN, {SPRBAT, RS}}, | ||
5661 | {"mtmcsrr0", XSPR(31,467,570), XSPR_MASK, PPCRFMCI, 0, {RS}}, | ||
5662 | {"mtmcsrr1", XSPR(31,467,571), XSPR_MASK, PPCRFMCI, 0, {RS}}, | ||
5663 | {"mtmcsr", XSPR(31,467,572), XSPR_MASK, PPCRFMCI, 0, {RS}}, | ||
5664 | {"mtivndx", XSPR(31,467,880), XSPR_MASK, TITAN, 0, {RS}}, | ||
5665 | {"mtdvndx", XSPR(31,467,881), XSPR_MASK, TITAN, 0, {RS}}, | ||
5666 | {"mtivlim", XSPR(31,467,882), XSPR_MASK, TITAN, 0, {RS}}, | ||
5667 | {"mtdvlim", XSPR(31,467,883), XSPR_MASK, TITAN, 0, {RS}}, | ||
5668 | {"mtclcsr", XSPR(31,467,884), XSPR_MASK, TITAN, 0, {RS}}, | ||
5669 | {"mtccr1", XSPR(31,467,888), XSPR_MASK, TITAN, 0, {RS}}, | ||
5670 | {"mtppr", XSPR(31,467,896), XSPR_MASK, POWER7, 0, {RS}}, | ||
5671 | {"mtppr32", XSPR(31,467,898), XSPR_MASK, POWER7, 0, {RS}}, | ||
5672 | {"mtummcr0", XSPR(31,467,936), XSPR_MASK, PPC750, 0, {RS}}, | ||
5673 | {"mtupmc1", XSPR(31,467,937), XSPR_MASK, PPC750, 0, {RS}}, | ||
5674 | {"mtupmc2", XSPR(31,467,938), XSPR_MASK, PPC750, 0, {RS}}, | ||
5675 | {"mtusia", XSPR(31,467,939), XSPR_MASK, PPC750, 0, {RS}}, | ||
5676 | {"mtummcr1", XSPR(31,467,940), XSPR_MASK, PPC750, 0, {RS}}, | ||
5677 | {"mtupmc3", XSPR(31,467,941), XSPR_MASK, PPC750, 0, {RS}}, | ||
5678 | {"mtupmc4", XSPR(31,467,942), XSPR_MASK, PPC750, 0, {RS}}, | ||
5679 | {"mtzpr", XSPR(31,467,944), XSPR_MASK, PPC403, 0, {RS}}, | ||
5680 | {"mtpid", XSPR(31,467,945), XSPR_MASK, PPC403, 0, {RS}}, | ||
5681 | {"mtrmmucr", XSPR(31,467,946), XSPR_MASK, TITAN, 0, {RS}}, | ||
5682 | {"mtccr0", XSPR(31,467,947), XSPR_MASK, PPC405|TITAN, 0, {RS}}, | ||
5683 | {"mtiac3", XSPR(31,467,948), XSPR_MASK, PPC405, 0, {RS}}, | ||
5684 | {"mtiac4", XSPR(31,467,949), XSPR_MASK, PPC405, 0, {RS}}, | ||
5685 | {"mtdvc1", XSPR(31,467,950), XSPR_MASK, PPC405, 0, {RS}}, | ||
5686 | {"mtdvc2", XSPR(31,467,951), XSPR_MASK, PPC405, 0, {RS}}, | ||
5687 | {"mtmmcr0", XSPR(31,467,952), XSPR_MASK, PPC750, 0, {RS}}, | ||
5688 | {"mtpmc1", XSPR(31,467,953), XSPR_MASK, PPC750, 0, {RS}}, | ||
5689 | {"mtsgr", XSPR(31,467,953), XSPR_MASK, PPC403, 0, {RS}}, | ||
5690 | {"mtdcwr", XSPR(31,467,954), XSPR_MASK, PPC403, 0, {RS}}, | ||
5691 | {"mtpmc2", XSPR(31,467,954), XSPR_MASK, PPC750, 0, {RS}}, | ||
5692 | {"mtsia", XSPR(31,467,955), XSPR_MASK, PPC750, 0, {RS}}, | ||
5693 | {"mtsler", XSPR(31,467,955), XSPR_MASK, PPC405, 0, {RS}}, | ||
5694 | {"mtmmcr1", XSPR(31,467,956), XSPR_MASK, PPC750, 0, {RS}}, | ||
5695 | {"mtsu0r", XSPR(31,467,956), XSPR_MASK, PPC405, 0, {RS}}, | ||
5696 | {"mtdbcr1", XSPR(31,467,957), XSPR_MASK, PPC405, 0, {RS}}, | ||
5697 | {"mtpmc3", XSPR(31,467,957), XSPR_MASK, PPC750, 0, {RS}}, | ||
5698 | {"mtpmc4", XSPR(31,467,958), XSPR_MASK, PPC750, 0, {RS}}, | ||
5699 | {"mticdbdr", XSPR(31,467,979), XSPR_MASK, PPC403, 0, {RS}}, | ||
5700 | {"mtesr", XSPR(31,467,980), XSPR_MASK, PPC403, 0, {RS}}, | ||
5701 | {"mtdear", XSPR(31,467,981), XSPR_MASK, PPC403, 0, {RS}}, | ||
5702 | {"mtevpr", XSPR(31,467,982), XSPR_MASK, PPC403, 0, {RS}}, | ||
5703 | {"mtcdbcr", XSPR(31,467,983), XSPR_MASK, PPC403, 0, {RS}}, | ||
5704 | {"mttsr", XSPR(31,467,984), XSPR_MASK, PPC403, 0, {RS}}, | ||
5705 | {"mttcr", XSPR(31,467,986), XSPR_MASK, PPC403, 0, {RS}}, | ||
5706 | {"mtpit", XSPR(31,467,987), XSPR_MASK, PPC403, 0, {RS}}, | ||
5707 | {"mttbhi", XSPR(31,467,988), XSPR_MASK, PPC403, 0, {RS}}, | ||
5708 | {"mttblo", XSPR(31,467,989), XSPR_MASK, PPC403, 0, {RS}}, | ||
5709 | {"mtsrr2", XSPR(31,467,990), XSPR_MASK, PPC403, 0, {RS}}, | ||
5710 | {"mtsrr3", XSPR(31,467,991), XSPR_MASK, PPC403, 0, {RS}}, | ||
5711 | {"mtdbsr", XSPR(31,467,1008), XSPR_MASK, PPC403, 0, {RS}}, | ||
5712 | {"mtdbdr", XSPR(31,467,1011), XSPR_MASK, TITAN, 0, {RS}}, | ||
5713 | {"mtdbcr0", XSPR(31,467,1010), XSPR_MASK, PPC405, 0, {RS}}, | ||
5714 | {"mtiac1", XSPR(31,467,1012), XSPR_MASK, PPC403, 0, {RS}}, | ||
5715 | {"mtiac2", XSPR(31,467,1013), XSPR_MASK, PPC403, 0, {RS}}, | ||
5716 | {"mtdac1", XSPR(31,467,1014), XSPR_MASK, PPC403, 0, {RS}}, | ||
5717 | {"mtdac2", XSPR(31,467,1015), XSPR_MASK, PPC403, 0, {RS}}, | ||
5718 | {"mtl2cr", XSPR(31,467,1017), XSPR_MASK, PPC750, 0, {RS}}, | ||
5719 | {"mtdccr", XSPR(31,467,1018), XSPR_MASK, PPC403, 0, {RS}}, | ||
5720 | {"mticcr", XSPR(31,467,1019), XSPR_MASK, PPC403, 0, {RS}}, | ||
5721 | {"mtictc", XSPR(31,467,1019), XSPR_MASK, PPC750, 0, {RS}}, | ||
5722 | {"mtpbl1", XSPR(31,467,1020), XSPR_MASK, PPC403, 0, {RS}}, | ||
5723 | {"mtthrm1", XSPR(31,467,1020), XSPR_MASK, PPC750, 0, {RS}}, | ||
5724 | {"mtpbu1", XSPR(31,467,1021), XSPR_MASK, PPC403, 0, {RS}}, | ||
5725 | {"mtthrm2", XSPR(31,467,1021), XSPR_MASK, PPC750, 0, {RS}}, | ||
5726 | {"mtpbl2", XSPR(31,467,1022), XSPR_MASK, PPC403, 0, {RS}}, | ||
5727 | {"mtthrm3", XSPR(31,467,1022), XSPR_MASK, PPC750, 0, {RS}}, | ||
5728 | {"mtpbu2", XSPR(31,467,1023), XSPR_MASK, PPC403, 0, {RS}}, | ||
5729 | {"mtspr", X(31,467), X_MASK, COM, 0, {SPR, RS}}, | ||
5730 | |||
5731 | {"dcbi", X(31,470), XRT_MASK, PPC, 0, {RA0, RB}}, | ||
5732 | |||
5733 | {"nand", XRC(31,476,0), X_MASK, COM, 0, {RA, RS, RB}}, | ||
5734 | {"nand.", XRC(31,476,1), X_MASK, COM, 0, {RA, RS, RB}}, | ||
5735 | |||
5736 | {"dsn", X(31,483), XRT_MASK, E500MC, 0, {RA, RB}}, | ||
5737 | |||
5738 | {"dcread", X(31,486), X_MASK, PPC403|PPC440, PPCA2|PPC476, {RT, RA0, RB}}, | ||
5739 | |||
5740 | {"icbtls", X(31,486), X_MASK, PPCCHLK|PPC476|TITAN, 0, {CT, RA0, RB}}, | ||
5741 | |||
5742 | {"stvxl", X(31,487), X_MASK, PPCVEC, 0, {VS, RA0, RB}}, | ||
5743 | |||
5744 | {"nabs", XO(31,488,0,0), XORB_MASK, M601, 0, {RT, RA}}, | ||
5745 | {"nabs.", XO(31,488,0,1), XORB_MASK, M601, 0, {RT, RA}}, | ||
5746 | |||
5747 | {"divd", XO(31,489,0,0), XO_MASK, PPC64, 0, {RT, RA, RB}}, | ||
5748 | {"divd.", XO(31,489,0,1), XO_MASK, PPC64, 0, {RT, RA, RB}}, | ||
5749 | |||
5750 | {"divw", XO(31,491,0,0), XO_MASK, PPC, 0, {RT, RA, RB}}, | ||
5751 | {"divw.", XO(31,491,0,1), XO_MASK, PPC, 0, {RT, RA, RB}}, | ||
5752 | |||
5753 | {"icbtlse", X(31,494), X_MASK, PPCCHLK, E500MC, {CT, RA, RB}}, | ||
5754 | |||
5755 | {"slbia", X(31,498), 0xff1fffff, POWER6, 0, {IH}}, | ||
5756 | {"slbia", X(31,498), 0xffffffff, PPC64, POWER6, {0}}, | ||
5757 | |||
5758 | {"cli", X(31,502), XRB_MASK, POWER, 0, {RT, RA}}, | ||
5759 | |||
5760 | {"popcntd", X(31,506), XRB_MASK, POWER7|PPCA2, 0, {RA, RS}}, | ||
5761 | |||
5762 | {"cmpb", X(31,508), X_MASK, POWER6|PPCA2|PPC476, 0, {RA, RS, RB}}, | ||
5763 | |||
5764 | {"mcrxr", X(31,512), XBFRARB_MASK, COM, POWER7, {BF}}, | ||
5765 | |||
5766 | {"lbdcbx", X(31,514), X_MASK, E200Z4, 0, {RT, RA, RB}}, | ||
5767 | {"lbdx", X(31,515), X_MASK, E500MC, 0, {RT, RA, RB}}, | ||
4285 | 5768 | ||
4286 | { "clcs", X(31,531), XRB_MASK, M601, { RT, RA } }, | 5769 | {"bblels", X(31,518), X_MASK, PPCBRLK, 0, {0}}, |
4287 | 5770 | ||
4288 | { "ldbrx", X(31,532), X_MASK, CELL, { RT, RA0, RB } }, | 5771 | {"lvlx", X(31,519), X_MASK, CELL, 0, {VD, RA0, RB}}, |
5772 | {"lbfcmux", APU(31,519,0), APU_MASK, PPC405, 0, {FCRT, RA, RB}}, | ||
4289 | 5773 | ||
4290 | { "lswx", X(31,533), X_MASK, PPCCOM, { RT, RA0, RB } }, | 5774 | {"subfco", XO(31,8,1,0), XO_MASK, PPCCOM, 0, {RT, RA, RB}}, |
4291 | { "lsx", X(31,533), X_MASK, PWRCOM, { RT, RA, RB } }, | 5775 | {"sfo", XO(31,8,1,0), XO_MASK, PWRCOM, 0, {RT, RA, RB}}, |
5776 | {"subco", XO(31,8,1,0), XO_MASK, PPCCOM, 0, {RT, RB, RA}}, | ||
5777 | {"subfco.", XO(31,8,1,1), XO_MASK, PPCCOM, 0, {RT, RA, RB}}, | ||
5778 | {"sfo.", XO(31,8,1,1), XO_MASK, PWRCOM, 0, {RT, RA, RB}}, | ||
5779 | {"subco.", XO(31,8,1,1), XO_MASK, PPCCOM, 0, {RT, RB, RA}}, | ||
4292 | 5780 | ||
4293 | { "lwbrx", X(31,534), X_MASK, PPCCOM, { RT, RA0, RB } }, | 5781 | {"addco", XO(31,10,1,0), XO_MASK, PPCCOM, 0, {RT, RA, RB}}, |
4294 | { "lbrx", X(31,534), X_MASK, PWRCOM, { RT, RA, RB } }, | 5782 | {"ao", XO(31,10,1,0), XO_MASK, PWRCOM, 0, {RT, RA, RB}}, |
5783 | {"addco.", XO(31,10,1,1), XO_MASK, PPCCOM, 0, {RT, RA, RB}}, | ||
5784 | {"ao.", XO(31,10,1,1), XO_MASK, PWRCOM, 0, {RT, RA, RB}}, | ||
4295 | 5785 | ||
4296 | { "lfsx", X(31,535), X_MASK, COM, { FRT, RA0, RB } }, | 5786 | {"lxsspx", X(31,524), XX1_MASK, PPCVSX2, 0, {XT6, RA0, RB}}, |
4297 | 5787 | ||
4298 | { "srw", XRC(31,536,0), X_MASK, PPCCOM, { RA, RS, RB } }, | 5788 | {"clcs", X(31,531), XRB_MASK, M601, 0, {RT, RA}}, |
4299 | { "sr", XRC(31,536,0), X_MASK, PWRCOM, { RA, RS, RB } }, | ||
4300 | { "srw.", XRC(31,536,1), X_MASK, PPCCOM, { RA, RS, RB } }, | ||
4301 | { "sr.", XRC(31,536,1), X_MASK, PWRCOM, { RA, RS, RB } }, | ||
4302 | 5789 | ||
4303 | { "rrib", XRC(31,537,0), X_MASK, M601, { RA, RS, RB } }, | 5790 | {"ldbrx", X(31,532), X_MASK, CELL|POWER7|PPCA2, 0, {RT, RA0, RB}}, |
4304 | { "rrib.", XRC(31,537,1), X_MASK, M601, { RA, RS, RB } }, | ||
4305 | 5791 | ||
4306 | { "srd", XRC(31,539,0), X_MASK, PPC64, { RA, RS, RB } }, | 5792 | {"lswx", X(31,533), X_MASK, PPCCOM, E500|E500MC, {RT, RAX, RBX}}, |
4307 | { "srd.", XRC(31,539,1), X_MASK, PPC64, { RA, RS, RB } }, | 5793 | {"lsx", X(31,533), X_MASK, PWRCOM, 0, {RT, RA, RB}}, |
4308 | 5794 | ||
4309 | { "maskir", XRC(31,541,0), X_MASK, M601, { RA, RS, RB } }, | 5795 | {"lwbrx", X(31,534), X_MASK, PPCCOM, 0, {RT, RA0, RB}}, |
4310 | { "maskir.", XRC(31,541,1), X_MASK, M601, { RA, RS, RB } }, | 5796 | {"lbrx", X(31,534), X_MASK, PWRCOM, 0, {RT, RA, RB}}, |
4311 | 5797 | ||
4312 | { "lwbrxe", X(31,542), X_MASK, BOOKE64, { RT, RA0, RB } }, | 5798 | {"lfsx", X(31,535), X_MASK, COM, PPCEFS, {FRT, RA0, RB}}, |
4313 | 5799 | ||
4314 | { "lfsxe", X(31,543), X_MASK, BOOKE64, { FRT, RA0, RB } }, | 5800 | {"srw", XRC(31,536,0), X_MASK, PPCCOM, 0, {RA, RS, RB}}, |
5801 | {"sr", XRC(31,536,0), X_MASK, PWRCOM, 0, {RA, RS, RB}}, | ||
5802 | {"srw.", XRC(31,536,1), X_MASK, PPCCOM, 0, {RA, RS, RB}}, | ||
5803 | {"sr.", XRC(31,536,1), X_MASK, PWRCOM, 0, {RA, RS, RB}}, | ||
4315 | 5804 | ||
4316 | { "bbelr", X(31,550), X_MASK, PPCBRLK, { 0 }}, | 5805 | {"rrib", XRC(31,537,0), X_MASK, M601, 0, {RA, RS, RB}}, |
5806 | {"rrib.", XRC(31,537,1), X_MASK, M601, 0, {RA, RS, RB}}, | ||
4317 | 5807 | ||
4318 | { "tlbsync", X(31,566), 0xffffffff, PPC, { 0 } }, | 5808 | {"cnttzw", XRC(31,538,0), XRB_MASK, POWER9, 0, {RA, RS}}, |
5809 | {"cnttzw.", XRC(31,538,1), XRB_MASK, POWER9, 0, {RA, RS}}, | ||
4319 | 5810 | ||
4320 | { "lfsux", X(31,567), X_MASK, COM, { FRT, RAS, RB } }, | 5811 | {"srd", XRC(31,539,0), X_MASK, PPC64, 0, {RA, RS, RB}}, |
5812 | {"srd.", XRC(31,539,1), X_MASK, PPC64, 0, {RA, RS, RB}}, | ||
4321 | 5813 | ||
4322 | { "lfsuxe", X(31,575), X_MASK, BOOKE64, { FRT, RAS, RB } }, | 5814 | {"maskir", XRC(31,541,0), X_MASK, M601, 0, {RA, RS, RB}}, |
5815 | {"maskir.", XRC(31,541,1), X_MASK, M601, 0, {RA, RS, RB}}, | ||
4323 | 5816 | ||
4324 | { "mfsr", X(31,595), XRB_MASK|(1<<20), COM32, { RT, SR } }, | 5817 | {"lhdcbx", X(31,546), X_MASK, E200Z4, 0, {RT, RA, RB}}, |
5818 | {"lhdx", X(31,547), X_MASK, E500MC, 0, {RT, RA, RB}}, | ||
4325 | 5819 | ||
4326 | { "lswi", X(31,597), X_MASK, PPCCOM, { RT, RA0, NB } }, | 5820 | {"lvtrx", X(31,549), X_MASK, PPCVEC2, 0, {VD, RA0, RB}}, |
4327 | { "lsi", X(31,597), X_MASK, PWRCOM, { RT, RA0, NB } }, | ||
4328 | 5821 | ||
4329 | { "lwsync", XSYNC(31,598,1), 0xffffffff, PPC, { 0 } }, | 5822 | {"bbelr", X(31,550), X_MASK, PPCBRLK, 0, {0}}, |
4330 | { "ptesync", XSYNC(31,598,2), 0xffffffff, PPC64, { 0 } }, | ||
4331 | { "msync", X(31,598), 0xffffffff, BOOKE, { 0 } }, | ||
4332 | { "sync", X(31,598), XSYNC_MASK, PPCCOM, { LS } }, | ||
4333 | { "dcs", X(31,598), 0xffffffff, PWRCOM, { 0 } }, | ||
4334 | 5823 | ||
4335 | { "lfdx", X(31,599), X_MASK, COM, { FRT, RA0, RB } }, | 5824 | {"lvrx", X(31,551), X_MASK, CELL, 0, {VD, RA0, RB}}, |
5825 | {"lhfcmux", APU(31,551,0), APU_MASK, PPC405, 0, {FCRT, RA, RB}}, | ||
4336 | 5826 | ||
4337 | { "lfdxe", X(31,607), X_MASK, BOOKE64, { FRT, RA0, RB } }, | 5827 | {"subfo", XO(31,40,1,0), XO_MASK, PPC, 0, {RT, RA, RB}}, |
5828 | {"subo", XO(31,40,1,0), XO_MASK, PPC, 0, {RT, RB, RA}}, | ||
5829 | {"subfo.", XO(31,40,1,1), XO_MASK, PPC, 0, {RT, RA, RB}}, | ||
5830 | {"subo.", XO(31,40,1,1), XO_MASK, PPC, 0, {RT, RB, RA}}, | ||
4338 | 5831 | ||
4339 | { "mffgpr", XRC(31,607,0), XRA_MASK, POWER6, { FRT, RB } }, | 5832 | {"tlbsync", X(31,566), 0xffffffff, PPC, 0, {0}}, |
4340 | 5833 | ||
4341 | { "mfsri", X(31,627), X_MASK, PWRCOM, { RT, RA, RB } }, | 5834 | {"lfsux", X(31,567), X_MASK, COM, PPCEFS, {FRT, RAS, RB}}, |
4342 | 5835 | ||
4343 | { "dclst", X(31,630), XRB_MASK, PWRCOM, { RS, RA } }, | 5836 | {"cnttzd", XRC(31,570,0), XRB_MASK, POWER9, 0, {RA, RS}}, |
5837 | {"cnttzd.", XRC(31,570,1), XRB_MASK, POWER9, 0, {RA, RS}}, | ||
4344 | 5838 | ||
4345 | { "lfdux", X(31,631), X_MASK, COM, { FRT, RAS, RB } }, | 5839 | {"mcrxrx", X(31,576), XBFRARB_MASK, POWER9, 0, {BF}}, |
4346 | 5840 | ||
4347 | { "lfduxe", X(31,639), X_MASK, BOOKE64, { FRT, RAS, RB } }, | 5841 | {"lwdcbx", X(31,578), X_MASK, E200Z4, 0, {RT, RA, RB}}, |
5842 | {"lwdx", X(31,579), X_MASK, E500MC, 0, {RT, RA, RB}}, | ||
4348 | 5843 | ||
4349 | { "mfsrin", X(31,659), XRA_MASK, PPC32, { RT, RB } }, | 5844 | {"lvtlx", X(31,581), X_MASK, PPCVEC2, 0, {VD, RA0, RB}}, |
4350 | 5845 | ||
4351 | { "stdbrx", X(31,660), X_MASK, CELL, { RS, RA0, RB } }, | 5846 | {"lwat", X(31,582), X_MASK, POWER9, 0, {RT, RA0, FC}}, |
4352 | 5847 | ||
4353 | { "stswx", X(31,661), X_MASK, PPCCOM, { RS, RA0, RB } }, | 5848 | {"lwfcmux", APU(31,583,0), APU_MASK, PPC405, 0, {FCRT, RA, RB}}, |
4354 | { "stsx", X(31,661), X_MASK, PWRCOM, { RS, RA0, RB } }, | ||
4355 | 5849 | ||
4356 | { "stwbrx", X(31,662), X_MASK, PPCCOM, { RS, RA0, RB } }, | 5850 | {"lxsdx", X(31,588), XX1_MASK, PPCVSX, 0, {XT6, RA0, RB}}, |
4357 | { "stbrx", X(31,662), X_MASK, PWRCOM, { RS, RA0, RB } }, | ||
4358 | 5851 | ||
4359 | { "stfsx", X(31,663), X_MASK, COM, { FRS, RA0, RB } }, | 5852 | {"mfsr", X(31,595), XRB_MASK|(1<<20), COM, NON32, {RT, SR}}, |
4360 | 5853 | ||
4361 | { "srq", XRC(31,664,0), X_MASK, M601, { RA, RS, RB } }, | 5854 | {"lswi", X(31,597), X_MASK, PPCCOM, E500|E500MC, {RT, RAX, NBI}}, |
4362 | { "srq.", XRC(31,664,1), X_MASK, M601, { RA, RS, RB } }, | 5855 | {"lsi", X(31,597), X_MASK, PWRCOM, 0, {RT, RA0, NB}}, |
4363 | 5856 | ||
4364 | { "sre", XRC(31,665,0), X_MASK, M601, { RA, RS, RB } }, | 5857 | {"hwsync", XSYNC(31,598,0), 0xffffffff, POWER4, BOOKE|PPC476, {0}}, |
4365 | { "sre.", XRC(31,665,1), X_MASK, M601, { RA, RS, RB } }, | 5858 | {"lwsync", XSYNC(31,598,1), 0xffffffff, PPC, E500, {0}}, |
5859 | {"ptesync", XSYNC(31,598,2), 0xffffffff, PPC64, 0, {0}}, | ||
5860 | {"sync", X(31,598), XSYNCLE_MASK, E6500, 0, {LS, ESYNC}}, | ||
5861 | {"sync", X(31,598), XSYNC_MASK, PPCCOM, BOOKE|PPC476, {LS}}, | ||
5862 | {"msync", X(31,598), 0xffffffff, BOOKE|PPCA2|PPC476, 0, {0}}, | ||
5863 | {"sync", X(31,598), 0xffffffff, BOOKE|PPC476, E6500, {0}}, | ||
5864 | {"lwsync", X(31,598), 0xffffffff, E500, 0, {0}}, | ||
5865 | {"dcs", X(31,598), 0xffffffff, PWRCOM, 0, {0}}, | ||
4366 | 5866 | ||
4367 | { "stwbrxe", X(31,670), X_MASK, BOOKE64, { RS, RA0, RB } }, | 5867 | {"lfdx", X(31,599), X_MASK, COM, PPCEFS, {FRT, RA0, RB}}, |
4368 | 5868 | ||
4369 | { "stfsxe", X(31,671), X_MASK, BOOKE64, { FRS, RA0, RB } }, | 5869 | {"mffgpr", XRC(31,607,0), XRA_MASK, POWER6, POWER7, {FRT, RB}}, |
5870 | {"lfdepx", X(31,607), X_MASK, E500MC|PPCA2, 0, {FRT, RA0, RB}}, | ||
4370 | 5871 | ||
4371 | { "stfsux", X(31,695), X_MASK, COM, { FRS, RAS, RB } }, | 5872 | {"lddx", X(31,611), X_MASK, E500MC, 0, {RT, RA, RB}}, |
4372 | 5873 | ||
4373 | { "sriq", XRC(31,696,0), X_MASK, M601, { RA, RS, SH } }, | 5874 | {"lvswx", X(31,613), X_MASK, PPCVEC2, 0, {VD, RA0, RB}}, |
4374 | { "sriq.", XRC(31,696,1), X_MASK, M601, { RA, RS, SH } }, | ||
4375 | 5875 | ||
4376 | { "stfsuxe", X(31,703), X_MASK, BOOKE64, { FRS, RAS, RB } }, | 5876 | {"ldat", X(31,614), X_MASK, POWER9, 0, {RT, RA0, FC}}, |
4377 | 5877 | ||
4378 | { "stswi", X(31,725), X_MASK, PPCCOM, { RS, RA0, NB } }, | 5878 | {"lqfcmux", APU(31,615,0), APU_MASK, PPC405, 0, {FCRT, RA, RB}}, |
4379 | { "stsi", X(31,725), X_MASK, PWRCOM, { RS, RA0, NB } }, | ||
4380 | 5879 | ||
4381 | { "stfdx", X(31,727), X_MASK, COM, { FRS, RA0, RB } }, | 5880 | {"nego", XO(31,104,1,0), XORB_MASK, COM, 0, {RT, RA}}, |
5881 | {"nego.", XO(31,104,1,1), XORB_MASK, COM, 0, {RT, RA}}, | ||
4382 | 5882 | ||
4383 | { "srlq", XRC(31,728,0), X_MASK, M601, { RA, RS, RB } }, | 5883 | {"mulo", XO(31,107,1,0), XO_MASK, M601, 0, {RT, RA, RB}}, |
4384 | { "srlq.", XRC(31,728,1), X_MASK, M601, { RA, RS, RB } }, | 5884 | {"mulo.", XO(31,107,1,1), XO_MASK, M601, 0, {RT, RA, RB}}, |
4385 | 5885 | ||
4386 | { "sreq", XRC(31,729,0), X_MASK, M601, { RA, RS, RB } }, | 5886 | {"mfsri", X(31,627), X_MASK, M601, 0, {RT, RA, RB}}, |
4387 | { "sreq.", XRC(31,729,1), X_MASK, M601, { RA, RS, RB } }, | ||
4388 | 5887 | ||
4389 | { "stfdxe", X(31,735), X_MASK, BOOKE64, { FRS, RA0, RB } }, | 5888 | {"dclst", X(31,630), XRB_MASK, M601, 0, {RS, RA}}, |
4390 | 5889 | ||
4391 | { "mftgpr", XRC(31,735,0), XRA_MASK, POWER6, { RT, FRB } }, | 5890 | {"lfdux", X(31,631), X_MASK, COM, PPCEFS, {FRT, RAS, RB}}, |
4392 | 5891 | ||
4393 | { "dcba", X(31,758), XRT_MASK, PPC405 | BOOKE, { RA, RB } }, | 5892 | {"stbdcbx", X(31,642), X_MASK, E200Z4, 0, {RS, RA, RB}}, |
5893 | {"stbdx", X(31,643), X_MASK, E500MC, 0, {RS, RA, RB}}, | ||
4394 | 5894 | ||
4395 | { "stfdux", X(31,759), X_MASK, COM, { FRS, RAS, RB } }, | 5895 | {"stvlx", X(31,647), X_MASK, CELL, 0, {VS, RA0, RB}}, |
5896 | {"stbfcmux", APU(31,647,0), APU_MASK, PPC405, 0, {FCRT, RA, RB}}, | ||
4396 | 5897 | ||
4397 | { "srliq", XRC(31,760,0), X_MASK, M601, { RA, RS, SH } }, | 5898 | {"stxsspx", X(31,652), XX1_MASK, PPCVSX2, 0, {XS6, RA0, RB}}, |
4398 | { "srliq.", XRC(31,760,1), X_MASK, M601, { RA, RS, SH } }, | ||
4399 | 5899 | ||
4400 | { "dcbae", X(31,766), XRT_MASK, BOOKE64, { RA, RB } }, | 5900 | {"tbegin.", XRC(31,654,1), XRTLRARB_MASK, PPCHTM, 0, {HTM_R}}, |
4401 | 5901 | ||
4402 | { "stfduxe", X(31,767), X_MASK, BOOKE64, { FRS, RAS, RB } }, | 5902 | {"subfeo", XO(31,136,1,0), XO_MASK, PPCCOM, 0, {RT, RA, RB}}, |
5903 | {"sfeo", XO(31,136,1,0), XO_MASK, PWRCOM, 0, {RT, RA, RB}}, | ||
5904 | {"subfeo.", XO(31,136,1,1), XO_MASK, PPCCOM, 0, {RT, RA, RB}}, | ||
5905 | {"sfeo.", XO(31,136,1,1), XO_MASK, PWRCOM, 0, {RT, RA, RB}}, | ||
4403 | 5906 | ||
4404 | { "tlbivax", X(31,786), XRT_MASK, BOOKE, { RA, RB } }, | 5907 | {"addeo", XO(31,138,1,0), XO_MASK, PPCCOM, 0, {RT, RA, RB}}, |
4405 | { "tlbivaxe",X(31,787), XRT_MASK, BOOKE64, { RA, RB } }, | 5908 | {"aeo", XO(31,138,1,0), XO_MASK, PWRCOM, 0, {RT, RA, RB}}, |
5909 | {"addeo.", XO(31,138,1,1), XO_MASK, PPCCOM, 0, {RT, RA, RB}}, | ||
5910 | {"aeo.", XO(31,138,1,1), XO_MASK, PWRCOM, 0, {RT, RA, RB}}, | ||
4406 | 5911 | ||
4407 | { "lwzcix", X(31,789), X_MASK, POWER6, { RT, RA0, RB } }, | 5912 | {"mfsrin", X(31,659), XRA_MASK, PPC, NON32, {RT, RB}}, |
4408 | 5913 | ||
4409 | { "lhbrx", X(31,790), X_MASK, COM, { RT, RA0, RB } }, | 5914 | {"stdbrx", X(31,660), X_MASK, CELL|POWER7|PPCA2, 0, {RS, RA0, RB}}, |
4410 | 5915 | ||
4411 | { "sraw", XRC(31,792,0), X_MASK, PPCCOM, { RA, RS, RB } }, | 5916 | {"stswx", X(31,661), X_MASK, PPCCOM, E500|E500MC, {RS, RA0, RB}}, |
4412 | { "sra", XRC(31,792,0), X_MASK, PWRCOM, { RA, RS, RB } }, | 5917 | {"stsx", X(31,661), X_MASK, PWRCOM, 0, {RS, RA0, RB}}, |
4413 | { "sraw.", XRC(31,792,1), X_MASK, PPCCOM, { RA, RS, RB } }, | ||
4414 | { "sra.", XRC(31,792,1), X_MASK, PWRCOM, { RA, RS, RB } }, | ||
4415 | 5918 | ||
4416 | { "srad", XRC(31,794,0), X_MASK, PPC64, { RA, RS, RB } }, | 5919 | {"stwbrx", X(31,662), X_MASK, PPCCOM, 0, {RS, RA0, RB}}, |
4417 | { "srad.", XRC(31,794,1), X_MASK, PPC64, { RA, RS, RB } }, | 5920 | {"stbrx", X(31,662), X_MASK, PWRCOM, 0, {RS, RA0, RB}}, |
4418 | 5921 | ||
4419 | { "lhbrxe", X(31,798), X_MASK, BOOKE64, { RT, RA0, RB } }, | 5922 | {"stfsx", X(31,663), X_MASK, COM, PPCEFS, {FRS, RA0, RB}}, |
4420 | 5923 | ||
4421 | { "ldxe", X(31,799), X_MASK, BOOKE64, { RT, RA0, RB } }, | 5924 | {"srq", XRC(31,664,0), X_MASK, M601, 0, {RA, RS, RB}}, |
4422 | { "lduxe", X(31,831), X_MASK, BOOKE64, { RT, RA0, RB } }, | 5925 | {"srq.", XRC(31,664,1), X_MASK, M601, 0, {RA, RS, RB}}, |
4423 | 5926 | ||
4424 | { "rac", X(31,818), X_MASK, PWRCOM, { RT, RA, RB } }, | 5927 | {"sre", XRC(31,665,0), X_MASK, M601, 0, {RA, RS, RB}}, |
5928 | {"sre.", XRC(31,665,1), X_MASK, M601, 0, {RA, RS, RB}}, | ||
4425 | 5929 | ||
4426 | { "lhzcix", X(31,821), X_MASK, POWER6, { RT, RA0, RB } }, | 5930 | {"sthdcbx", X(31,674), X_MASK, E200Z4, 0, {RS, RA, RB}}, |
5931 | {"sthdx", X(31,675), X_MASK, E500MC, 0, {RS, RA, RB}}, | ||
4427 | 5932 | ||
4428 | { "dss", XDSS(31,822,0), XDSS_MASK, PPCVEC, { STRM } }, | 5933 | {"stvfrx", X(31,677), X_MASK, PPCVEC2, 0, {VS, RA0, RB}}, |
4429 | { "dssall", XDSS(31,822,1), XDSS_MASK, PPCVEC, { 0 } }, | ||
4430 | 5934 | ||
4431 | { "srawi", XRC(31,824,0), X_MASK, PPCCOM, { RA, RS, SH } }, | 5935 | {"stvrx", X(31,679), X_MASK, CELL, 0, {VS, RA0, RB}}, |
4432 | { "srai", XRC(31,824,0), X_MASK, PWRCOM, { RA, RS, SH } }, | 5936 | {"sthfcmux", APU(31,679,0), APU_MASK, PPC405, 0, {FCRT, RA, RB}}, |
4433 | { "srawi.", XRC(31,824,1), X_MASK, PPCCOM, { RA, RS, SH } }, | ||
4434 | { "srai.", XRC(31,824,1), X_MASK, PWRCOM, { RA, RS, SH } }, | ||
4435 | 5937 | ||
4436 | { "slbmfev", X(31,851), XRA_MASK, PPC64, { RT, RB } }, | 5938 | {"tendall.", XRC(31,686,1)|(1<<25), XRTRARB_MASK, PPCHTM, 0, {0}}, |
5939 | {"tend.", XRC(31,686,1), XRTARARB_MASK, PPCHTM, 0, {HTM_A}}, | ||
4437 | 5940 | ||
4438 | { "lbzcix", X(31,853), X_MASK, POWER6, { RT, RA0, RB } }, | 5941 | {"stbcx.", XRC(31,694,1), X_MASK, POWER8|E6500, 0, {RS, RA0, RB}}, |
4439 | 5942 | ||
4440 | { "mbar", X(31,854), X_MASK, BOOKE, { MO } }, | 5943 | {"stfsux", X(31,695), X_MASK, COM, PPCEFS, {FRS, RAS, RB}}, |
4441 | { "eieio", X(31,854), 0xffffffff, PPC, { 0 } }, | ||
4442 | 5944 | ||
4443 | { "lfiwax", X(31,855), X_MASK, POWER6, { FRT, RA0, RB } }, | 5945 | {"sriq", XRC(31,696,0), X_MASK, M601, 0, {RA, RS, SH}}, |
5946 | {"sriq.", XRC(31,696,1), X_MASK, M601, 0, {RA, RS, SH}}, | ||
4444 | 5947 | ||
4445 | { "ldcix", X(31,885), X_MASK, POWER6, { RT, RA0, RB } }, | 5948 | {"stwdcbx", X(31,706), X_MASK, E200Z4, 0, {RS, RA, RB}}, |
5949 | {"stwdx", X(31,707), X_MASK, E500MC, 0, {RS, RA, RB}}, | ||
4446 | 5950 | ||
4447 | { "tlbsx", XRC(31,914,0), X_MASK, PPC403|BOOKE, { RTO, RA, RB } }, | 5951 | {"stvflx", X(31,709), X_MASK, PPCVEC2, 0, {VS, RA0, RB}}, |
4448 | { "tlbsx.", XRC(31,914,1), X_MASK, PPC403|BOOKE, { RTO, RA, RB } }, | ||
4449 | { "tlbsxe", XRC(31,915,0), X_MASK, BOOKE64, { RA, RB } }, | ||
4450 | { "tlbsxe.", XRC(31,915,1), X_MASK, BOOKE64, { RA, RB } }, | ||
4451 | 5952 | ||
4452 | { "slbmfee", X(31,915), XRA_MASK, PPC64, { RT, RB } }, | 5953 | {"stwat", X(31,710), X_MASK, POWER9, 0, {RS, RA0, FC}}, |
4453 | 5954 | ||
4454 | { "stwcix", X(31,917), X_MASK, POWER6, { RS, RA0, RB } }, | 5955 | {"stwfcmux", APU(31,711,0), APU_MASK, PPC405, 0, {FCRT, RA, RB}}, |
4455 | 5956 | ||
4456 | { "sthbrx", X(31,918), X_MASK, COM, { RS, RA0, RB } }, | 5957 | {"stxsdx", X(31,716), XX1_MASK, PPCVSX, 0, {XS6, RA0, RB}}, |
4457 | 5958 | ||
4458 | { "sraq", XRC(31,920,0), X_MASK, M601, { RA, RS, RB } }, | 5959 | {"tcheck", X(31,718), XRTBFRARB_MASK, PPCHTM, 0, {BF}}, |
4459 | { "sraq.", XRC(31,920,1), X_MASK, M601, { RA, RS, RB } }, | ||
4460 | 5960 | ||
4461 | { "srea", XRC(31,921,0), X_MASK, M601, { RA, RS, RB } }, | 5961 | {"subfzeo", XO(31,200,1,0), XORB_MASK, PPCCOM, 0, {RT, RA}}, |
4462 | { "srea.", XRC(31,921,1), X_MASK, M601, { RA, RS, RB } }, | 5962 | {"sfzeo", XO(31,200,1,0), XORB_MASK, PWRCOM, 0, {RT, RA}}, |
5963 | {"subfzeo.", XO(31,200,1,1), XORB_MASK, PPCCOM, 0, {RT, RA}}, | ||
5964 | {"sfzeo.", XO(31,200,1,1), XORB_MASK, PWRCOM, 0, {RT, RA}}, | ||
4463 | 5965 | ||
4464 | { "extsh", XRC(31,922,0), XRB_MASK, PPCCOM, { RA, RS } }, | 5966 | {"addzeo", XO(31,202,1,0), XORB_MASK, PPCCOM, 0, {RT, RA}}, |
4465 | { "exts", XRC(31,922,0), XRB_MASK, PWRCOM, { RA, RS } }, | 5967 | {"azeo", XO(31,202,1,0), XORB_MASK, PWRCOM, 0, {RT, RA}}, |
4466 | { "extsh.", XRC(31,922,1), XRB_MASK, PPCCOM, { RA, RS } }, | 5968 | {"addzeo.", XO(31,202,1,1), XORB_MASK, PPCCOM, 0, {RT, RA}}, |
4467 | { "exts.", XRC(31,922,1), XRB_MASK, PWRCOM, { RA, RS } }, | 5969 | {"azeo.", XO(31,202,1,1), XORB_MASK, PWRCOM, 0, {RT, RA}}, |
4468 | 5970 | ||
4469 | { "sthbrxe", X(31,926), X_MASK, BOOKE64, { RS, RA0, RB } }, | 5971 | {"stswi", X(31,725), X_MASK, PPCCOM, E500|E500MC, {RS, RA0, NB}}, |
5972 | {"stsi", X(31,725), X_MASK, PWRCOM, 0, {RS, RA0, NB}}, | ||
4470 | 5973 | ||
4471 | { "stdxe", X(31,927), X_MASK, BOOKE64, { RS, RA0, RB } }, | 5974 | {"sthcx.", XRC(31,726,1), X_MASK, POWER8|E6500, 0, {RS, RA0, RB}}, |
4472 | 5975 | ||
4473 | { "tlbrehi", XTLB(31,946,0), XTLB_MASK, PPC403, { RT, RA } }, | 5976 | {"stfdx", X(31,727), X_MASK, COM, PPCEFS, {FRS, RA0, RB}}, |
4474 | { "tlbrelo", XTLB(31,946,1), XTLB_MASK, PPC403, { RT, RA } }, | ||
4475 | { "tlbre", X(31,946), X_MASK, PPC403|BOOKE, { RSO, RAOPT, SHO } }, | ||
4476 | 5977 | ||
4477 | { "sthcix", X(31,949), X_MASK, POWER6, { RS, RA0, RB } }, | 5978 | {"srlq", XRC(31,728,0), X_MASK, M601, 0, {RA, RS, RB}}, |
5979 | {"srlq.", XRC(31,728,1), X_MASK, M601, 0, {RA, RS, RB}}, | ||
4478 | 5980 | ||
4479 | { "sraiq", XRC(31,952,0), X_MASK, M601, { RA, RS, SH } }, | 5981 | {"sreq", XRC(31,729,0), X_MASK, M601, 0, {RA, RS, RB}}, |
4480 | { "sraiq.", XRC(31,952,1), X_MASK, M601, { RA, RS, SH } }, | 5982 | {"sreq.", XRC(31,729,1), X_MASK, M601, 0, {RA, RS, RB}}, |
4481 | 5983 | ||
4482 | { "extsb", XRC(31,954,0), XRB_MASK, PPC, { RA, RS} }, | 5984 | {"mftgpr", XRC(31,735,0), XRA_MASK, POWER6, POWER7, {RT, FRB}}, |
4483 | { "extsb.", XRC(31,954,1), XRB_MASK, PPC, { RA, RS} }, | 5985 | {"stfdepx", X(31,735), X_MASK, E500MC|PPCA2, 0, {FRS, RA0, RB}}, |
4484 | 5986 | ||
4485 | { "stduxe", X(31,959), X_MASK, BOOKE64, { RS, RAS, RB } }, | 5987 | {"stddx", X(31,739), X_MASK, E500MC, 0, {RS, RA, RB}}, |
4486 | 5988 | ||
4487 | { "iccci", X(31,966), XRT_MASK, PPC403|PPC440, { RA, RB } }, | 5989 | {"stvswx", X(31,741), X_MASK, PPCVEC2, 0, {VS, RA0, RB}}, |
4488 | 5990 | ||
4489 | { "tlbwehi", XTLB(31,978,0), XTLB_MASK, PPC403, { RT, RA } }, | 5991 | {"stdat", X(31,742), X_MASK, POWER9, 0, {RS, RA0, FC}}, |
4490 | { "tlbwelo", XTLB(31,978,1), XTLB_MASK, PPC403, { RT, RA } }, | ||
4491 | { "tlbwe", X(31,978), X_MASK, PPC403|BOOKE, { RSO, RAOPT, SHO } }, | ||
4492 | { "tlbld", X(31,978), XRTRA_MASK, PPC, { RB } }, | ||
4493 | 5992 | ||
4494 | { "stbcix", X(31,981), X_MASK, POWER6, { RS, RA0, RB } }, | 5993 | {"stqfcmux", APU(31,743,0), APU_MASK, PPC405, 0, {FCRT, RA, RB}}, |
4495 | 5994 | ||
4496 | { "icbi", X(31,982), XRT_MASK, PPC, { RA, RB } }, | 5995 | {"subfmeo", XO(31,232,1,0), XORB_MASK, PPCCOM, 0, {RT, RA}}, |
5996 | {"sfmeo", XO(31,232,1,0), XORB_MASK, PWRCOM, 0, {RT, RA}}, | ||
5997 | {"subfmeo.", XO(31,232,1,1), XORB_MASK, PPCCOM, 0, {RT, RA}}, | ||
5998 | {"sfmeo.", XO(31,232,1,1), XORB_MASK, PWRCOM, 0, {RT, RA}}, | ||
4497 | 5999 | ||
4498 | { "stfiwx", X(31,983), X_MASK, PPC, { FRS, RA0, RB } }, | 6000 | {"mulldo", XO(31,233,1,0), XO_MASK, PPC64, 0, {RT, RA, RB}}, |
6001 | {"mulldo.", XO(31,233,1,1), XO_MASK, PPC64, 0, {RT, RA, RB}}, | ||
4499 | 6002 | ||
4500 | { "extsw", XRC(31,986,0), XRB_MASK, PPC64 | BOOKE64,{ RA, RS } }, | 6003 | {"addmeo", XO(31,234,1,0), XORB_MASK, PPCCOM, 0, {RT, RA}}, |
4501 | { "extsw.", XRC(31,986,1), XRB_MASK, PPC64, { RA, RS } }, | 6004 | {"ameo", XO(31,234,1,0), XORB_MASK, PWRCOM, 0, {RT, RA}}, |
6005 | {"addmeo.", XO(31,234,1,1), XORB_MASK, PPCCOM, 0, {RT, RA}}, | ||
6006 | {"ameo.", XO(31,234,1,1), XORB_MASK, PWRCOM, 0, {RT, RA}}, | ||
4502 | 6007 | ||
4503 | { "icread", X(31,998), XRT_MASK, PPC403|PPC440, { RA, RB } }, | 6008 | {"mullwo", XO(31,235,1,0), XO_MASK, PPCCOM, 0, {RT, RA, RB}}, |
6009 | {"mulso", XO(31,235,1,0), XO_MASK, PWRCOM, 0, {RT, RA, RB}}, | ||
6010 | {"mullwo.", XO(31,235,1,1), XO_MASK, PPCCOM, 0, {RT, RA, RB}}, | ||
6011 | {"mulso.", XO(31,235,1,1), XO_MASK, PWRCOM, 0, {RT, RA, RB}}, | ||
4504 | 6012 | ||
4505 | { "icbie", X(31,990), XRT_MASK, BOOKE64, { RA, RB } }, | 6013 | {"tsuspend.", XRCL(31,750,0,1), XRTRARB_MASK,PPCHTM, 0, {0}}, |
4506 | { "stfiwxe", X(31,991), X_MASK, BOOKE64, { FRS, RA0, RB } }, | 6014 | {"tresume.", XRCL(31,750,1,1), XRTRARB_MASK,PPCHTM, 0, {0}}, |
6015 | {"tsr.", XRC(31,750,1), XRTLRARB_MASK,PPCHTM, 0, {L}}, | ||
4507 | 6016 | ||
4508 | { "tlbli", X(31,1010), XRTRA_MASK, PPC, { RB } }, | 6017 | {"darn", X(31,755), XLRAND_MASK, POWER9, 0, {RT, LRAND}}, |
4509 | 6018 | ||
4510 | { "stdcix", X(31,1013), X_MASK, POWER6, { RS, RA0, RB } }, | 6019 | {"dcba", X(31,758), XRT_MASK, PPC405|PPC7450|BOOKE|PPCA2|PPC476, 0, {RA0, RB}}, |
6020 | {"dcbal", XOPL(31,758,1), XRT_MASK, E500MC, 0, {RA0, RB}}, | ||
4511 | 6021 | ||
4512 | { "dcbzl", XOPL(31,1014,1), XRT_MASK,POWER4, { RA, RB } }, | 6022 | {"stfdux", X(31,759), X_MASK, COM, PPCEFS, {FRS, RAS, RB}}, |
4513 | { "dcbz", X(31,1014), XRT_MASK, PPC, { RA, RB } }, | ||
4514 | { "dclz", X(31,1014), XRT_MASK, PPC, { RA, RB } }, | ||
4515 | 6023 | ||
4516 | { "dcbze", X(31,1022), XRT_MASK, BOOKE64, { RA, RB } }, | 6024 | {"srliq", XRC(31,760,0), X_MASK, M601, 0, {RA, RS, SH}}, |
6025 | {"srliq.", XRC(31,760,1), X_MASK, M601, 0, {RA, RS, SH}}, | ||
4517 | 6026 | ||
4518 | { "lvebx", X(31, 7), X_MASK, PPCVEC, { VD, RA, RB } }, | 6027 | {"lvsm", X(31,773), X_MASK, PPCVEC2, 0, {VD, RA0, RB}}, |
4519 | { "lvehx", X(31, 39), X_MASK, PPCVEC, { VD, RA, RB } }, | ||
4520 | { "lvewx", X(31, 71), X_MASK, PPCVEC, { VD, RA, RB } }, | ||
4521 | { "lvsl", X(31, 6), X_MASK, PPCVEC, { VD, RA, RB } }, | ||
4522 | { "lvsr", X(31, 38), X_MASK, PPCVEC, { VD, RA, RB } }, | ||
4523 | { "lvx", X(31, 103), X_MASK, PPCVEC, { VD, RA, RB } }, | ||
4524 | { "lvxl", X(31, 359), X_MASK, PPCVEC, { VD, RA, RB } }, | ||
4525 | { "stvebx", X(31, 135), X_MASK, PPCVEC, { VS, RA, RB } }, | ||
4526 | { "stvehx", X(31, 167), X_MASK, PPCVEC, { VS, RA, RB } }, | ||
4527 | { "stvewx", X(31, 199), X_MASK, PPCVEC, { VS, RA, RB } }, | ||
4528 | { "stvx", X(31, 231), X_MASK, PPCVEC, { VS, RA, RB } }, | ||
4529 | { "stvxl", X(31, 487), X_MASK, PPCVEC, { VS, RA, RB } }, | ||
4530 | 6028 | ||
4531 | /* New load/store left/right index vector instructions that are in the Cell only. */ | 6029 | {"copy", XOPL(31,774,1), XRT_MASK, POWER9, 0, {RA0, RB}}, |
4532 | { "lvlx", X(31, 519), X_MASK, CELL, { VD, RA0, RB } }, | ||
4533 | { "lvlxl", X(31, 775), X_MASK, CELL, { VD, RA0, RB } }, | ||
4534 | { "lvrx", X(31, 551), X_MASK, CELL, { VD, RA0, RB } }, | ||
4535 | { "lvrxl", X(31, 807), X_MASK, CELL, { VD, RA0, RB } }, | ||
4536 | { "stvlx", X(31, 647), X_MASK, CELL, { VS, RA0, RB } }, | ||
4537 | { "stvlxl", X(31, 903), X_MASK, CELL, { VS, RA0, RB } }, | ||
4538 | { "stvrx", X(31, 679), X_MASK, CELL, { VS, RA0, RB } }, | ||
4539 | { "stvrxl", X(31, 935), X_MASK, CELL, { VS, RA0, RB } }, | ||
4540 | 6030 | ||
4541 | { "lwz", OP(32), OP_MASK, PPCCOM, { RT, D, RA0 } }, | 6031 | {"stvepxl", X(31,775), X_MASK, PPCVEC2, 0, {VS, RA0, RB}}, |
4542 | { "l", OP(32), OP_MASK, PWRCOM, { RT, D, RA0 } }, | 6032 | {"lvlxl", X(31,775), X_MASK, CELL, 0, {VD, RA0, RB}}, |
6033 | {"ldfcmux", APU(31,775,0), APU_MASK, PPC405, 0, {FCRT, RA, RB}}, | ||
4543 | 6034 | ||
4544 | { "lwzu", OP(33), OP_MASK, PPCCOM, { RT, D, RAL } }, | 6035 | {"dozo", XO(31,264,1,0), XO_MASK, M601, 0, {RT, RA, RB}}, |
4545 | { "lu", OP(33), OP_MASK, PWRCOM, { RT, D, RA0 } }, | 6036 | {"dozo.", XO(31,264,1,1), XO_MASK, M601, 0, {RT, RA, RB}}, |
4546 | 6037 | ||
4547 | { "lbz", OP(34), OP_MASK, COM, { RT, D, RA0 } }, | 6038 | {"addo", XO(31,266,1,0), XO_MASK, PPCCOM, 0, {RT, RA, RB}}, |
6039 | {"caxo", XO(31,266,1,0), XO_MASK, PWRCOM, 0, {RT, RA, RB}}, | ||
6040 | {"addo.", XO(31,266,1,1), XO_MASK, PPCCOM, 0, {RT, RA, RB}}, | ||
6041 | {"caxo.", XO(31,266,1,1), XO_MASK, PWRCOM, 0, {RT, RA, RB}}, | ||
4548 | 6042 | ||
4549 | { "lbzu", OP(35), OP_MASK, COM, { RT, D, RAL } }, | 6043 | {"modsd", X(31,777), X_MASK, POWER9, 0, {RT, RA, RB}}, |
6044 | {"modsw", X(31,779), X_MASK, POWER9, 0, {RT, RA, RB}}, | ||
4550 | 6045 | ||
4551 | { "stw", OP(36), OP_MASK, PPCCOM, { RS, D, RA0 } }, | 6046 | {"lxvw4x", X(31,780), XX1_MASK, PPCVSX, 0, {XT6, RA0, RB}}, |
4552 | { "st", OP(36), OP_MASK, PWRCOM, { RS, D, RA0 } }, | 6047 | {"lxsibzx", X(31,781), XX1_MASK, PPCVSX3, 0, {XT6, RA0, RB}}, |
4553 | 6048 | ||
4554 | { "stwu", OP(37), OP_MASK, PPCCOM, { RS, D, RAS } }, | 6049 | {"tabortwc.", XRC(31,782,1), X_MASK, PPCHTM, 0, {TO, RA, RB}}, |
4555 | { "stu", OP(37), OP_MASK, PWRCOM, { RS, D, RA0 } }, | ||
4556 | 6050 | ||
4557 | { "stb", OP(38), OP_MASK, COM, { RS, D, RA0 } }, | 6051 | {"tlbivax", X(31,786), XRT_MASK, BOOKE|PPCA2|PPC476, 0, {RA0, RB}}, |
4558 | 6052 | ||
4559 | { "stbu", OP(39), OP_MASK, COM, { RS, D, RAS } }, | 6053 | {"lwzcix", X(31,789), X_MASK, POWER6, 0, {RT, RA0, RB}}, |
4560 | 6054 | ||
4561 | { "lhz", OP(40), OP_MASK, COM, { RT, D, RA0 } }, | 6055 | {"lhbrx", X(31,790), X_MASK, COM, 0, {RT, RA0, RB}}, |
4562 | 6056 | ||
4563 | { "lhzu", OP(41), OP_MASK, COM, { RT, D, RAL } }, | 6057 | {"lfdpx", X(31,791), X_MASK, POWER6, POWER7, {FRTp, RA0, RB}}, |
6058 | {"lfqx", X(31,791), X_MASK, POWER2, 0, {FRT, RA, RB}}, | ||
4564 | 6059 | ||
4565 | { "lha", OP(42), OP_MASK, COM, { RT, D, RA0 } }, | 6060 | {"sraw", XRC(31,792,0), X_MASK, PPCCOM, 0, {RA, RS, RB}}, |
6061 | {"sra", XRC(31,792,0), X_MASK, PWRCOM, 0, {RA, RS, RB}}, | ||
6062 | {"sraw.", XRC(31,792,1), X_MASK, PPCCOM, 0, {RA, RS, RB}}, | ||
6063 | {"sra.", XRC(31,792,1), X_MASK, PWRCOM, 0, {RA, RS, RB}}, | ||
4566 | 6064 | ||
4567 | { "lhau", OP(43), OP_MASK, COM, { RT, D, RAL } }, | 6065 | {"srad", XRC(31,794,0), X_MASK, PPC64, 0, {RA, RS, RB}}, |
6066 | {"srad.", XRC(31,794,1), X_MASK, PPC64, 0, {RA, RS, RB}}, | ||
4568 | 6067 | ||
4569 | { "sth", OP(44), OP_MASK, COM, { RS, D, RA0 } }, | 6068 | {"lfddx", X(31,803), X_MASK, E500MC, 0, {FRT, RA, RB}}, |
4570 | 6069 | ||
4571 | { "sthu", OP(45), OP_MASK, COM, { RS, D, RAS } }, | 6070 | {"lvtrxl", X(31,805), X_MASK, PPCVEC2, 0, {VD, RA0, RB}}, |
6071 | {"stvepx", X(31,807), X_MASK, PPCVEC2, 0, {VS, RA0, RB}}, | ||
6072 | {"lvrxl", X(31,807), X_MASK, CELL, 0, {VD, RA0, RB}}, | ||
4572 | 6073 | ||
4573 | { "lmw", OP(46), OP_MASK, PPCCOM, { RT, D, RAM } }, | 6074 | {"lxvh8x", X(31,812), XX1_MASK, PPCVSX3, 0, {XT6, RA0, RB}}, |
4574 | { "lm", OP(46), OP_MASK, PWRCOM, { RT, D, RA0 } }, | 6075 | {"lxsihzx", X(31,813), XX1_MASK, PPCVSX3, 0, {XT6, RA0, RB}}, |
4575 | 6076 | ||
4576 | { "stmw", OP(47), OP_MASK, PPCCOM, { RS, D, RA0 } }, | 6077 | {"tabortdc.", XRC(31,814,1), X_MASK, PPCHTM, 0, {TO, RA, RB}}, |
4577 | { "stm", OP(47), OP_MASK, PWRCOM, { RS, D, RA0 } }, | ||
4578 | 6078 | ||
4579 | { "lfs", OP(48), OP_MASK, COM, { FRT, D, RA0 } }, | 6079 | {"rac", X(31,818), X_MASK, M601, 0, {RT, RA, RB}}, |
4580 | 6080 | ||
4581 | { "lfsu", OP(49), OP_MASK, COM, { FRT, D, RAS } }, | 6081 | {"erativax", X(31,819), X_MASK, PPCA2, 0, {RS, RA0, RB}}, |
4582 | 6082 | ||
4583 | { "lfd", OP(50), OP_MASK, COM, { FRT, D, RA0 } }, | 6083 | {"lhzcix", X(31,821), X_MASK, POWER6, 0, {RT, RA0, RB}}, |
4584 | 6084 | ||
4585 | { "lfdu", OP(51), OP_MASK, COM, { FRT, D, RAS } }, | 6085 | {"dss", XDSS(31,822,0), XDSS_MASK, PPCVEC, 0, {STRM}}, |
4586 | 6086 | ||
4587 | { "stfs", OP(52), OP_MASK, COM, { FRS, D, RA0 } }, | 6087 | {"lfqux", X(31,823), X_MASK, POWER2, 0, {FRT, RA, RB}}, |
4588 | 6088 | ||
4589 | { "stfsu", OP(53), OP_MASK, COM, { FRS, D, RAS } }, | 6089 | {"srawi", XRC(31,824,0), X_MASK, PPCCOM, 0, {RA, RS, SH}}, |
6090 | {"srai", XRC(31,824,0), X_MASK, PWRCOM, 0, {RA, RS, SH}}, | ||
6091 | {"srawi.", XRC(31,824,1), X_MASK, PPCCOM, 0, {RA, RS, SH}}, | ||
6092 | {"srai.", XRC(31,824,1), X_MASK, PWRCOM, 0, {RA, RS, SH}}, | ||
4590 | 6093 | ||
4591 | { "stfd", OP(54), OP_MASK, COM, { FRS, D, RA0 } }, | 6094 | {"sradi", XS(31,413,0), XS_MASK, PPC64, 0, {RA, RS, SH6}}, |
6095 | {"sradi.", XS(31,413,1), XS_MASK, PPC64, 0, {RA, RS, SH6}}, | ||
4592 | 6096 | ||
4593 | { "stfdu", OP(55), OP_MASK, COM, { FRS, D, RAS } }, | 6097 | {"lvtlxl", X(31,837), X_MASK, PPCVEC2, 0, {VD, RA0, RB}}, |
4594 | 6098 | ||
4595 | { "lq", OP(56), OP_MASK, POWER4, { RTQ, DQ, RAQ } }, | 6099 | {"cpabort", X(31,838), XRTRARB_MASK,POWER9, 0, {0}}, |
4596 | 6100 | ||
4597 | { "lfq", OP(56), OP_MASK, POWER2, { FRT, D, RA0 } }, | 6101 | {"divo", XO(31,331,1,0), XO_MASK, M601, 0, {RT, RA, RB}}, |
6102 | {"divo.", XO(31,331,1,1), XO_MASK, M601, 0, {RT, RA, RB}}, | ||
4598 | 6103 | ||
4599 | { "lfqu", OP(57), OP_MASK, POWER2, { FRT, D, RA0 } }, | 6104 | {"lxvd2x", X(31,844), XX1_MASK, PPCVSX, 0, {XT6, RA0, RB}}, |
6105 | {"lxvx", X(31,844), XX1_MASK, POWER8, POWER9|PPCVSX3, {XT6, RA0, RB}}, | ||
4600 | 6106 | ||
4601 | { "lfdp", OP(57), OP_MASK, POWER6, { FRT, D, RA0 } }, | 6107 | {"tabortwci.", XRC(31,846,1), X_MASK, PPCHTM, 0, {TO, RA, HTM_SI}}, |
4602 | 6108 | ||
4603 | { "lbze", DEO(58,0), DE_MASK, BOOKE64, { RT, DE, RA0 } }, | 6109 | {"tlbsrx.", XRC(31,850,1), XRT_MASK, PPCA2, 0, {RA0, RB}}, |
4604 | { "lbzue", DEO(58,1), DE_MASK, BOOKE64, { RT, DE, RAL } }, | ||
4605 | { "lhze", DEO(58,2), DE_MASK, BOOKE64, { RT, DE, RA0 } }, | ||
4606 | { "lhzue", DEO(58,3), DE_MASK, BOOKE64, { RT, DE, RAL } }, | ||
4607 | { "lhae", DEO(58,4), DE_MASK, BOOKE64, { RT, DE, RA0 } }, | ||
4608 | { "lhaue", DEO(58,5), DE_MASK, BOOKE64, { RT, DE, RAL } }, | ||
4609 | { "lwze", DEO(58,6), DE_MASK, BOOKE64, { RT, DE, RA0 } }, | ||
4610 | { "lwzue", DEO(58,7), DE_MASK, BOOKE64, { RT, DE, RAL } }, | ||
4611 | { "stbe", DEO(58,8), DE_MASK, BOOKE64, { RS, DE, RA0 } }, | ||
4612 | { "stbue", DEO(58,9), DE_MASK, BOOKE64, { RS, DE, RAS } }, | ||
4613 | { "sthe", DEO(58,10), DE_MASK, BOOKE64, { RS, DE, RA0 } }, | ||
4614 | { "sthue", DEO(58,11), DE_MASK, BOOKE64, { RS, DE, RAS } }, | ||
4615 | { "stwe", DEO(58,14), DE_MASK, BOOKE64, { RS, DE, RA0 } }, | ||
4616 | { "stwue", DEO(58,15), DE_MASK, BOOKE64, { RS, DE, RAS } }, | ||
4617 | 6110 | ||
4618 | { "ld", DSO(58,0), DS_MASK, PPC64, { RT, DS, RA0 } }, | 6111 | {"slbiag", X(31,850), XRARB_MASK, POWER9, 0, {RS}}, |
6112 | {"slbmfev", X(31,851), XRLA_MASK, POWER9, 0, {RT, RB, A_L}}, | ||
6113 | {"slbmfev", X(31,851), XRA_MASK, PPC64, POWER9, {RT, RB}}, | ||
4619 | 6114 | ||
4620 | { "ldu", DSO(58,1), DS_MASK, PPC64, { RT, DS, RAL } }, | 6115 | {"lbzcix", X(31,853), X_MASK, POWER6, 0, {RT, RA0, RB}}, |
4621 | 6116 | ||
4622 | { "lwa", DSO(58,2), DS_MASK, PPC64, { RT, DS, RA0 } }, | 6117 | {"eieio", X(31,854), 0xffffffff, PPC, BOOKE|PPCA2|PPC476, {0}}, |
6118 | {"mbar", X(31,854), X_MASK, BOOKE|PPCA2|PPC476, 0, {MO}}, | ||
6119 | {"eieio", XMBAR(31,854,1),0xffffffff, E500, 0, {0}}, | ||
6120 | {"eieio", X(31,854), 0xffffffff, PPCA2|PPC476, 0, {0}}, | ||
4623 | 6121 | ||
4624 | { "dadd", XRC(59,2,0), X_MASK, POWER6, { FRT, FRA, FRB } }, | 6122 | {"lfiwax", X(31,855), X_MASK, POWER6|PPCA2|PPC476, 0, {FRT, RA0, RB}}, |
4625 | { "dadd.", XRC(59,2,1), X_MASK, POWER6, { FRT, FRA, FRB } }, | ||
4626 | 6123 | ||
4627 | { "dqua", ZRC(59,3,0), Z_MASK, POWER6, { FRT, FRA, FRB, RMC } }, | 6124 | {"lvswxl", X(31,869), X_MASK, PPCVEC2, 0, {VD, RA0, RB}}, |
4628 | { "dqua.", ZRC(59,3,1), Z_MASK, POWER6, { FRT, FRA, FRB, RMC } }, | ||
4629 | 6125 | ||
4630 | { "fdivs", A(59,18,0), AFRC_MASK, PPC, { FRT, FRA, FRB } }, | 6126 | {"abso", XO(31,360,1,0), XORB_MASK, M601, 0, {RT, RA}}, |
4631 | { "fdivs.", A(59,18,1), AFRC_MASK, PPC, { FRT, FRA, FRB } }, | 6127 | {"abso.", XO(31,360,1,1), XORB_MASK, M601, 0, {RT, RA}}, |
4632 | 6128 | ||
4633 | { "fsubs", A(59,20,0), AFRC_MASK, PPC, { FRT, FRA, FRB } }, | 6129 | {"divso", XO(31,363,1,0), XO_MASK, M601, 0, {RT, RA, RB}}, |
4634 | { "fsubs.", A(59,20,1), AFRC_MASK, PPC, { FRT, FRA, FRB } }, | 6130 | {"divso.", XO(31,363,1,1), XO_MASK, M601, 0, {RT, RA, RB}}, |
4635 | 6131 | ||
4636 | { "fadds", A(59,21,0), AFRC_MASK, PPC, { FRT, FRA, FRB } }, | 6132 | {"lxvb16x", X(31,876), XX1_MASK, PPCVSX3, 0, {XT6, RA0, RB}}, |
4637 | { "fadds.", A(59,21,1), AFRC_MASK, PPC, { FRT, FRA, FRB } }, | ||
4638 | 6133 | ||
4639 | { "fsqrts", A(59,22,0), AFRAFRC_MASK, PPC, { FRT, FRB } }, | 6134 | {"tabortdci.", XRC(31,878,1), X_MASK, PPCHTM, 0, {TO, RA, HTM_SI}}, |
4640 | { "fsqrts.", A(59,22,1), AFRAFRC_MASK, PPC, { FRT, FRB } }, | ||
4641 | 6135 | ||
4642 | { "fres", A(59,24,0), AFRALFRC_MASK, PPC, { FRT, FRB, A_L } }, | 6136 | {"rmieg", X(31,882), XRTRA_MASK, POWER9, 0, {RB}}, |
4643 | { "fres.", A(59,24,1), AFRALFRC_MASK, PPC, { FRT, FRB, A_L } }, | ||
4644 | 6137 | ||
4645 | { "fmuls", A(59,25,0), AFRB_MASK, PPC, { FRT, FRA, FRC } }, | 6138 | {"ldcix", X(31,885), X_MASK, POWER6, 0, {RT, RA0, RB}}, |
4646 | { "fmuls.", A(59,25,1), AFRB_MASK, PPC, { FRT, FRA, FRC } }, | ||
4647 | 6139 | ||
4648 | { "frsqrtes", A(59,26,0), AFRALFRC_MASK,POWER5, { FRT, FRB, A_L } }, | 6140 | {"msgsync", X(31,886), 0xffffffff, POWER9, 0, {0}}, |
4649 | { "frsqrtes.",A(59,26,1), AFRALFRC_MASK,POWER5, { FRT, FRB, A_L } }, | ||
4650 | 6141 | ||
4651 | { "fmsubs", A(59,28,0), A_MASK, PPC, { FRT,FRA,FRC,FRB } }, | 6142 | {"lfiwzx", X(31,887), X_MASK, POWER7|PPCA2, 0, {FRT, RA0, RB}}, |
4652 | { "fmsubs.", A(59,28,1), A_MASK, PPC, { FRT,FRA,FRC,FRB } }, | ||
4653 | 6143 | ||
4654 | { "fmadds", A(59,29,0), A_MASK, PPC, { FRT,FRA,FRC,FRB } }, | 6144 | {"extswsli", XS(31,445,0), XS_MASK, POWER9, 0, {RA, RS, SH6}}, |
4655 | { "fmadds.", A(59,29,1), A_MASK, PPC, { FRT,FRA,FRC,FRB } }, | 6145 | {"extswsli.", XS(31,445,1), XS_MASK, POWER9, 0, {RA, RS, SH6}}, |
4656 | 6146 | ||
4657 | { "fnmsubs", A(59,30,0), A_MASK, PPC, { FRT,FRA,FRC,FRB } }, | 6147 | {"paste.", XRCL(31,902,1,1),XRT_MASK, POWER9, 0, {RA0, RB}}, |
4658 | { "fnmsubs.",A(59,30,1), A_MASK, PPC, { FRT,FRA,FRC,FRB } }, | ||
4659 | 6148 | ||
4660 | { "fnmadds", A(59,31,0), A_MASK, PPC, { FRT,FRA,FRC,FRB } }, | 6149 | {"stvlxl", X(31,903), X_MASK, CELL, 0, {VS, RA0, RB}}, |
4661 | { "fnmadds.",A(59,31,1), A_MASK, PPC, { FRT,FRA,FRC,FRB } }, | 6150 | {"stdfcmux", APU(31,903,0), APU_MASK, PPC405, 0, {FCRT, RA, RB}}, |
4662 | 6151 | ||
4663 | { "dmul", XRC(59,34,0), X_MASK, POWER6, { FRT, FRA, FRB } }, | 6152 | {"divdeuo", XO(31,393,1,0), XO_MASK, POWER7|PPCA2, 0, {RT, RA, RB}}, |
4664 | { "dmul.", XRC(59,34,1), X_MASK, POWER6, { FRT, FRA, FRB } }, | 6153 | {"divdeuo.", XO(31,393,1,1), XO_MASK, POWER7|PPCA2, 0, {RT, RA, RB}}, |
6154 | {"divweuo", XO(31,395,1,0), XO_MASK, POWER7|PPCA2, 0, {RT, RA, RB}}, | ||
6155 | {"divweuo.", XO(31,395,1,1), XO_MASK, POWER7|PPCA2, 0, {RT, RA, RB}}, | ||
4665 | 6156 | ||
4666 | { "drrnd", ZRC(59,35,0), Z_MASK, POWER6, { FRT, FRA, FRB, RMC } }, | 6157 | {"stxvw4x", X(31,908), XX1_MASK, PPCVSX, 0, {XS6, RA0, RB}}, |
4667 | { "drrnd.", ZRC(59,35,1), Z_MASK, POWER6, { FRT, FRA, FRB, RMC } }, | 6158 | {"stxsibx", X(31,909), XX1_MASK, PPCVSX3, 0, {XS6, RA0, RB}}, |
4668 | 6159 | ||
4669 | { "dscli", ZRC(59,66,0), Z_MASK, POWER6, { FRT, FRA, SH16 } }, | 6160 | {"tabort.", XRC(31,910,1), XRTRB_MASK, PPCHTM, 0, {RA}}, |
4670 | { "dscli.", ZRC(59,66,1), Z_MASK, POWER6, { FRT, FRA, SH16 } }, | ||
4671 | 6161 | ||
4672 | { "dquai", ZRC(59,67,0), Z_MASK, POWER6, { TE, FRT, FRB, RMC } }, | 6162 | {"tlbsx", XRC(31,914,0), X_MASK, PPC403|BOOKE|PPCA2|PPC476, 0, {RTO, RA0, RB}}, |
4673 | { "dquai.", ZRC(59,67,1), Z_MASK, POWER6, { TE, FRT, FRB, RMC } }, | 6163 | {"tlbsx.", XRC(31,914,1), X_MASK, PPC403|BOOKE|PPCA2|PPC476, 0, {RTO, RA0, RB}}, |
4674 | 6164 | ||
4675 | { "dscri", ZRC(59,98,0), Z_MASK, POWER6, { FRT, FRA, SH16 } }, | 6165 | {"slbmfee", X(31,915), XRLA_MASK, POWER9, 0, {RT, RB, A_L}}, |
4676 | { "dscri.", ZRC(59,98,1), Z_MASK, POWER6, { FRT, FRA, SH16 } }, | 6166 | {"slbmfee", X(31,915), XRA_MASK, PPC64, POWER9, {RT, RB}}, |
4677 | 6167 | ||
4678 | { "drintx", ZRC(59,99,0), Z_MASK, POWER6, { R, FRT, FRB, RMC } }, | 6168 | {"stwcix", X(31,917), X_MASK, POWER6, 0, {RS, RA0, RB}}, |
4679 | { "drintx.", ZRC(59,99,1), Z_MASK, POWER6, { R, FRT, FRB, RMC } }, | ||
4680 | 6169 | ||
4681 | { "dcmpo", X(59,130), X_MASK, POWER6, { BF, FRA, FRB } }, | 6170 | {"sthbrx", X(31,918), X_MASK, COM, 0, {RS, RA0, RB}}, |
4682 | 6171 | ||
4683 | { "dtstex", X(59,162), X_MASK, POWER6, { BF, FRA, FRB } }, | 6172 | {"stfdpx", X(31,919), X_MASK, POWER6, POWER7, {FRSp, RA0, RB}}, |
4684 | { "dtstdc", Z(59,194), Z_MASK, POWER6, { BF, FRA, DCM } }, | 6173 | {"stfqx", X(31,919), X_MASK, POWER2, 0, {FRS, RA0, RB}}, |
4685 | { "dtstdg", Z(59,226), Z_MASK, POWER6, { BF, FRA, DGM } }, | ||
4686 | 6174 | ||
4687 | { "drintn", ZRC(59,227,0), Z_MASK, POWER6, { R, FRT, FRB, RMC } }, | 6175 | {"sraq", XRC(31,920,0), X_MASK, M601, 0, {RA, RS, RB}}, |
4688 | { "drintn.", ZRC(59,227,1), Z_MASK, POWER6, { R, FRT, FRB, RMC } }, | 6176 | {"sraq.", XRC(31,920,1), X_MASK, M601, 0, {RA, RS, RB}}, |
4689 | 6177 | ||
4690 | { "dctdp", XRC(59,258,0), X_MASK, POWER6, { FRT, FRB } }, | 6178 | {"srea", XRC(31,921,0), X_MASK, M601, 0, {RA, RS, RB}}, |
4691 | { "dctdp.", XRC(59,258,1), X_MASK, POWER6, { FRT, FRB } }, | 6179 | {"srea.", XRC(31,921,1), X_MASK, M601, 0, {RA, RS, RB}}, |
4692 | 6180 | ||
4693 | { "dctfix", XRC(59,290,0), X_MASK, POWER6, { FRT, FRB } }, | 6181 | {"extsh", XRC(31,922,0), XRB_MASK, PPCCOM, 0, {RA, RS}}, |
4694 | { "dctfix.", XRC(59,290,1), X_MASK, POWER6, { FRT, FRB } }, | 6182 | {"exts", XRC(31,922,0), XRB_MASK, PWRCOM, 0, {RA, RS}}, |
6183 | {"extsh.", XRC(31,922,1), XRB_MASK, PPCCOM, 0, {RA, RS}}, | ||
6184 | {"exts.", XRC(31,922,1), XRB_MASK, PWRCOM, 0, {RA, RS}}, | ||
4695 | 6185 | ||
4696 | { "ddedpd", XRC(59,322,0), X_MASK, POWER6, { SP, FRT, FRB } }, | 6186 | {"stfddx", X(31,931), X_MASK, E500MC, 0, {FRS, RA, RB}}, |
4697 | { "ddedpd.", XRC(59,322,1), X_MASK, POWER6, { SP, FRT, FRB } }, | ||
4698 | 6187 | ||
4699 | { "dxex", XRC(59,354,0), X_MASK, POWER6, { FRT, FRB } }, | 6188 | {"stvfrxl", X(31,933), X_MASK, PPCVEC2, 0, {VS, RA0, RB}}, |
4700 | { "dxex.", XRC(59,354,1), X_MASK, POWER6, { FRT, FRB } }, | ||
4701 | 6189 | ||
4702 | { "dsub", XRC(59,514,0), X_MASK, POWER6, { FRT, FRA, FRB } }, | 6190 | {"wclrone", XOPL2(31,934,2),XRT_MASK, PPCA2, 0, {RA0, RB}}, |
4703 | { "dsub.", XRC(59,514,1), X_MASK, POWER6, { FRT, FRA, FRB } }, | 6191 | {"wclrall", X(31,934), XRARB_MASK, PPCA2, 0, {L2}}, |
6192 | {"wclr", X(31,934), X_MASK, PPCA2, 0, {L2, RA0, RB}}, | ||
4704 | 6193 | ||
4705 | { "ddiv", XRC(59,546,0), X_MASK, POWER6, { FRT, FRA, FRB } }, | 6194 | {"stvrxl", X(31,935), X_MASK, CELL, 0, {VS, RA0, RB}}, |
4706 | { "ddiv.", XRC(59,546,1), X_MASK, POWER6, { FRT, FRA, FRB } }, | ||
4707 | 6195 | ||
4708 | { "dcmpu", X(59,642), X_MASK, POWER6, { BF, FRA, FRB } }, | 6196 | {"divdeo", XO(31,425,1,0), XO_MASK, POWER7|PPCA2, 0, {RT, RA, RB}}, |
6197 | {"divdeo.", XO(31,425,1,1), XO_MASK, POWER7|PPCA2, 0, {RT, RA, RB}}, | ||
6198 | {"divweo", XO(31,427,1,0), XO_MASK, POWER7|PPCA2, 0, {RT, RA, RB}}, | ||
6199 | {"divweo.", XO(31,427,1,1), XO_MASK, POWER7|PPCA2, 0, {RT, RA, RB}}, | ||
4709 | 6200 | ||
4710 | { "dtstsf", X(59,674), X_MASK, POWER6, { BF, FRA, FRB } }, | 6201 | {"stxvh8x", X(31,940), XX1_MASK, PPCVSX3, 0, {XS6, RA0, RB}}, |
6202 | {"stxsihx", X(31,941), XX1_MASK, PPCVSX3, 0, {XS6, RA0, RB}}, | ||
4711 | 6203 | ||
4712 | { "drsp", XRC(59,770,0), X_MASK, POWER6, { FRT, FRB } }, | 6204 | {"treclaim.", XRC(31,942,1), XRTRB_MASK, PPCHTM, 0, {RA}}, |
4713 | { "drsp.", XRC(59,770,1), X_MASK, POWER6, { FRT, FRB } }, | ||
4714 | 6205 | ||
4715 | { "dcffix", XRC(59,802,0), X_MASK, POWER6, { FRT, FRB } }, | 6206 | {"tlbrehi", XTLB(31,946,0), XTLB_MASK, PPC403, PPCA2, {RT, RA}}, |
4716 | { "dcffix.", XRC(59,802,1), X_MASK, POWER6, { FRT, FRB } }, | 6207 | {"tlbrelo", XTLB(31,946,1), XTLB_MASK, PPC403, PPCA2, {RT, RA}}, |
6208 | {"tlbre", X(31,946), X_MASK, PPC403|BOOKE|PPCA2|PPC476, 0, {RSO, RAOPT, SHO}}, | ||
4717 | 6209 | ||
4718 | { "denbcd", XRC(59,834,0), X_MASK, POWER6, { S, FRT, FRB } }, | 6210 | {"sthcix", X(31,949), X_MASK, POWER6, 0, {RS, RA0, RB}}, |
4719 | { "denbcd.", XRC(59,834,1), X_MASK, POWER6, { S, FRT, FRB } }, | ||
4720 | 6211 | ||
4721 | { "diex", XRC(59,866,0), X_MASK, POWER6, { FRT, FRA, FRB } }, | 6212 | {"icswepx", XRC(31,950,0), X_MASK, PPCA2, 0, {RS, RA, RB}}, |
4722 | { "diex.", XRC(59,866,1), X_MASK, POWER6, { FRT, FRA, FRB } }, | 6213 | {"icswepx.", XRC(31,950,1), X_MASK, PPCA2, 0, {RS, RA, RB}}, |
4723 | 6214 | ||
4724 | { "stfq", OP(60), OP_MASK, POWER2, { FRS, D, RA } }, | 6215 | {"stfqux", X(31,951), X_MASK, POWER2, 0, {FRS, RA, RB}}, |
4725 | 6216 | ||
4726 | { "stfqu", OP(61), OP_MASK, POWER2, { FRS, D, RA } }, | 6217 | {"sraiq", XRC(31,952,0), X_MASK, M601, 0, {RA, RS, SH}}, |
6218 | {"sraiq.", XRC(31,952,1), X_MASK, M601, 0, {RA, RS, SH}}, | ||
4727 | 6219 | ||
4728 | { "stfdp", OP(61), OP_MASK, POWER6, { FRT, D, RA0 } }, | 6220 | {"extsb", XRC(31,954,0), XRB_MASK, PPC, 0, {RA, RS}}, |
6221 | {"extsb.", XRC(31,954,1), XRB_MASK, PPC, 0, {RA, RS}}, | ||
4729 | 6222 | ||
4730 | { "lde", DEO(62,0), DE_MASK, BOOKE64, { RT, DES, RA0 } }, | 6223 | {"stvflxl", X(31,965), X_MASK, PPCVEC2, 0, {VS, RA0, RB}}, |
4731 | { "ldue", DEO(62,1), DE_MASK, BOOKE64, { RT, DES, RA0 } }, | ||
4732 | { "lfse", DEO(62,4), DE_MASK, BOOKE64, { FRT, DES, RA0 } }, | ||
4733 | { "lfsue", DEO(62,5), DE_MASK, BOOKE64, { FRT, DES, RAS } }, | ||
4734 | { "lfde", DEO(62,6), DE_MASK, BOOKE64, { FRT, DES, RA0 } }, | ||
4735 | { "lfdue", DEO(62,7), DE_MASK, BOOKE64, { FRT, DES, RAS } }, | ||
4736 | { "stde", DEO(62,8), DE_MASK, BOOKE64, { RS, DES, RA0 } }, | ||
4737 | { "stdue", DEO(62,9), DE_MASK, BOOKE64, { RS, DES, RAS } }, | ||
4738 | { "stfse", DEO(62,12), DE_MASK, BOOKE64, { FRS, DES, RA0 } }, | ||
4739 | { "stfsue", DEO(62,13), DE_MASK, BOOKE64, { FRS, DES, RAS } }, | ||
4740 | { "stfde", DEO(62,14), DE_MASK, BOOKE64, { FRS, DES, RA0 } }, | ||
4741 | { "stfdue", DEO(62,15), DE_MASK, BOOKE64, { FRS, DES, RAS } }, | ||
4742 | 6224 | ||
4743 | { "std", DSO(62,0), DS_MASK, PPC64, { RS, DS, RA0 } }, | 6225 | {"iccci", X(31,966), XRT_MASK, PPC403|PPC440|TITAN|PPCA2, 0, {RAOPT, RBOPT}}, |
6226 | {"ici", X(31,966), XRARB_MASK, PPCA2|PPC476, 0, {CT}}, | ||
4744 | 6227 | ||
4745 | { "stdu", DSO(62,1), DS_MASK, PPC64, { RS, DS, RAS } }, | 6228 | {"divduo", XO(31,457,1,0), XO_MASK, PPC64, 0, {RT, RA, RB}}, |
6229 | {"divduo.", XO(31,457,1,1), XO_MASK, PPC64, 0, {RT, RA, RB}}, | ||
4746 | 6230 | ||
4747 | { "stq", DSO(62,2), DS_MASK, POWER4, { RSQ, DS, RA0 } }, | 6231 | {"divwuo", XO(31,459,1,0), XO_MASK, PPC, 0, {RT, RA, RB}}, |
6232 | {"divwuo.", XO(31,459,1,1), XO_MASK, PPC, 0, {RT, RA, RB}}, | ||
4748 | 6233 | ||
4749 | { "fcmpu", X(63,0), X_MASK|(3<<21), COM, { BF, FRA, FRB } }, | 6234 | {"stxvd2x", X(31,972), XX1_MASK, PPCVSX, 0, {XS6, RA0, RB}}, |
6235 | {"stxvx", X(31,972), XX1_MASK, POWER8, POWER9|PPCVSX3, {XS6, RA0, RB}}, | ||
4750 | 6236 | ||
4751 | { "daddq", XRC(63,2,0), X_MASK, POWER6, { FRT, FRA, FRB } }, | 6237 | {"tlbld", X(31,978), XRTRA_MASK, PPC, PPC403|BOOKE|PPCA2|PPC476, {RB}}, |
4752 | { "daddq.", XRC(63,2,1), X_MASK, POWER6, { FRT, FRA, FRB } }, | 6238 | {"tlbwehi", XTLB(31,978,0), XTLB_MASK, PPC403, 0, {RT, RA}}, |
6239 | {"tlbwelo", XTLB(31,978,1), XTLB_MASK, PPC403, 0, {RT, RA}}, | ||
6240 | {"tlbwe", X(31,978), X_MASK, PPC403|BOOKE|PPCA2|PPC476, 0, {RSO, RAOPT, SHO}}, | ||
4753 | 6241 | ||
4754 | { "dquaq", ZRC(63,3,0), Z_MASK, POWER6, { FRT, FRA, FRB, RMC } }, | 6242 | {"slbfee.", XRC(31,979,1), XRA_MASK, POWER6, 0, {RT, RB}}, |
4755 | { "dquaq.", ZRC(63,3,1), Z_MASK, POWER6, { FRT, FRA, FRB, RMC } }, | ||
4756 | 6243 | ||
4757 | { "fcpsgn", XRC(63,8,0), X_MASK, POWER6, { FRT, FRA, FRB } }, | 6244 | {"stbcix", X(31,981), X_MASK, POWER6, 0, {RS, RA0, RB}}, |
4758 | { "fcpsgn.", XRC(63,8,1), X_MASK, POWER6, { FRT, FRA, FRB } }, | ||
4759 | 6245 | ||
4760 | { "frsp", XRC(63,12,0), XRA_MASK, COM, { FRT, FRB } }, | 6246 | {"icbi", X(31,982), XRT_MASK, PPC, 0, {RA0, RB}}, |
4761 | { "frsp.", XRC(63,12,1), XRA_MASK, COM, { FRT, FRB } }, | ||
4762 | 6247 | ||
4763 | { "fctiw", XRC(63,14,0), XRA_MASK, PPCCOM, { FRT, FRB } }, | 6248 | {"stfiwx", X(31,983), X_MASK, PPC, PPCEFS, {FRS, RA0, RB}}, |
4764 | { "fcir", XRC(63,14,0), XRA_MASK, POWER2, { FRT, FRB } }, | ||
4765 | { "fctiw.", XRC(63,14,1), XRA_MASK, PPCCOM, { FRT, FRB } }, | ||
4766 | { "fcir.", XRC(63,14,1), XRA_MASK, POWER2, { FRT, FRB } }, | ||
4767 | 6249 | ||
4768 | { "fctiwz", XRC(63,15,0), XRA_MASK, PPCCOM, { FRT, FRB } }, | 6250 | {"extsw", XRC(31,986,0), XRB_MASK, PPC64, 0, {RA, RS}}, |
4769 | { "fcirz", XRC(63,15,0), XRA_MASK, POWER2, { FRT, FRB } }, | 6251 | {"extsw.", XRC(31,986,1), XRB_MASK, PPC64, 0, {RA, RS}}, |
4770 | { "fctiwz.", XRC(63,15,1), XRA_MASK, PPCCOM, { FRT, FRB } }, | ||
4771 | { "fcirz.", XRC(63,15,1), XRA_MASK, POWER2, { FRT, FRB } }, | ||
4772 | 6252 | ||
4773 | { "fdiv", A(63,18,0), AFRC_MASK, PPCCOM, { FRT, FRA, FRB } }, | 6253 | {"icbiep", XRT(31,991,0), XRT_MASK, E500MC|PPCA2, 0, {RA0, RB}}, |
4774 | { "fd", A(63,18,0), AFRC_MASK, PWRCOM, { FRT, FRA, FRB } }, | ||
4775 | { "fdiv.", A(63,18,1), AFRC_MASK, PPCCOM, { FRT, FRA, FRB } }, | ||
4776 | { "fd.", A(63,18,1), AFRC_MASK, PWRCOM, { FRT, FRA, FRB } }, | ||
4777 | 6254 | ||
4778 | { "fsub", A(63,20,0), AFRC_MASK, PPCCOM, { FRT, FRA, FRB } }, | 6255 | {"stvswxl", X(31,997), X_MASK, PPCVEC2, 0, {VS, RA0, RB}}, |
4779 | { "fs", A(63,20,0), AFRC_MASK, PWRCOM, { FRT, FRA, FRB } }, | ||
4780 | { "fsub.", A(63,20,1), AFRC_MASK, PPCCOM, { FRT, FRA, FRB } }, | ||
4781 | { "fs.", A(63,20,1), AFRC_MASK, PWRCOM, { FRT, FRA, FRB } }, | ||
4782 | 6256 | ||
4783 | { "fadd", A(63,21,0), AFRC_MASK, PPCCOM, { FRT, FRA, FRB } }, | 6257 | {"icread", X(31,998), XRT_MASK, PPC403|PPC440|PPC476|TITAN, 0, {RA0, RB}}, |
4784 | { "fa", A(63,21,0), AFRC_MASK, PWRCOM, { FRT, FRA, FRB } }, | ||
4785 | { "fadd.", A(63,21,1), AFRC_MASK, PPCCOM, { FRT, FRA, FRB } }, | ||
4786 | { "fa.", A(63,21,1), AFRC_MASK, PWRCOM, { FRT, FRA, FRB } }, | ||
4787 | 6258 | ||
4788 | { "fsqrt", A(63,22,0), AFRAFRC_MASK, PPCPWR2, { FRT, FRB } }, | 6259 | {"nabso", XO(31,488,1,0), XORB_MASK, M601, 0, {RT, RA}}, |
4789 | { "fsqrt.", A(63,22,1), AFRAFRC_MASK, PPCPWR2, { FRT, FRB } }, | 6260 | {"nabso.", XO(31,488,1,1), XORB_MASK, M601, 0, {RT, RA}}, |
4790 | 6261 | ||
4791 | { "fsel", A(63,23,0), A_MASK, PPC, { FRT,FRA,FRC,FRB } }, | 6262 | {"divdo", XO(31,489,1,0), XO_MASK, PPC64, 0, {RT, RA, RB}}, |
4792 | { "fsel.", A(63,23,1), A_MASK, PPC, { FRT,FRA,FRC,FRB } }, | 6263 | {"divdo.", XO(31,489,1,1), XO_MASK, PPC64, 0, {RT, RA, RB}}, |
4793 | 6264 | ||
4794 | { "fre", A(63,24,0), AFRALFRC_MASK, POWER5, { FRT, FRB, A_L } }, | 6265 | {"divwo", XO(31,491,1,0), XO_MASK, PPC, 0, {RT, RA, RB}}, |
4795 | { "fre.", A(63,24,1), AFRALFRC_MASK, POWER5, { FRT, FRB, A_L } }, | 6266 | {"divwo.", XO(31,491,1,1), XO_MASK, PPC, 0, {RT, RA, RB}}, |
4796 | 6267 | ||
4797 | { "fmul", A(63,25,0), AFRB_MASK, PPCCOM, { FRT, FRA, FRC } }, | 6268 | {"stxvb16x", X(31,1004), XX1_MASK, PPCVSX3, 0, {XS6, RA0, RB}}, |
4798 | { "fm", A(63,25,0), AFRB_MASK, PWRCOM, { FRT, FRA, FRC } }, | ||
4799 | { "fmul.", A(63,25,1), AFRB_MASK, PPCCOM, { FRT, FRA, FRC } }, | ||
4800 | { "fm.", A(63,25,1), AFRB_MASK, PWRCOM, { FRT, FRA, FRC } }, | ||
4801 | 6269 | ||
4802 | { "frsqrte", A(63,26,0), AFRALFRC_MASK, PPC, { FRT, FRB, A_L } }, | 6270 | {"trechkpt.", XRC(31,1006,1), XRTRARB_MASK,PPCHTM, 0, {0}}, |
4803 | { "frsqrte.",A(63,26,1), AFRALFRC_MASK, PPC, { FRT, FRB, A_L } }, | ||
4804 | 6271 | ||
4805 | { "fmsub", A(63,28,0), A_MASK, PPCCOM, { FRT,FRA,FRC,FRB } }, | 6272 | {"tlbli", X(31,1010), XRTRA_MASK, PPC, TITAN, {RB}}, |
4806 | { "fms", A(63,28,0), A_MASK, PWRCOM, { FRT,FRA,FRC,FRB } }, | ||
4807 | { "fmsub.", A(63,28,1), A_MASK, PPCCOM, { FRT,FRA,FRC,FRB } }, | ||
4808 | { "fms.", A(63,28,1), A_MASK, PWRCOM, { FRT,FRA,FRC,FRB } }, | ||
4809 | 6273 | ||
4810 | { "fmadd", A(63,29,0), A_MASK, PPCCOM, { FRT,FRA,FRC,FRB } }, | 6274 | {"stdcix", X(31,1013), X_MASK, POWER6, 0, {RS, RA0, RB}}, |
4811 | { "fma", A(63,29,0), A_MASK, PWRCOM, { FRT,FRA,FRC,FRB } }, | ||
4812 | { "fmadd.", A(63,29,1), A_MASK, PPCCOM, { FRT,FRA,FRC,FRB } }, | ||
4813 | { "fma.", A(63,29,1), A_MASK, PWRCOM, { FRT,FRA,FRC,FRB } }, | ||
4814 | 6275 | ||
4815 | { "fnmsub", A(63,30,0), A_MASK, PPCCOM, { FRT,FRA,FRC,FRB } }, | 6276 | {"dcbz", X(31,1014), XRT_MASK, PPC, 0, {RA0, RB}}, |
4816 | { "fnms", A(63,30,0), A_MASK, PWRCOM, { FRT,FRA,FRC,FRB } }, | 6277 | {"dclz", X(31,1014), XRT_MASK, PPC, 0, {RA0, RB}}, |
4817 | { "fnmsub.", A(63,30,1), A_MASK, PPCCOM, { FRT,FRA,FRC,FRB } }, | ||
4818 | { "fnms.", A(63,30,1), A_MASK, PWRCOM, { FRT,FRA,FRC,FRB } }, | ||
4819 | 6278 | ||
4820 | { "fnmadd", A(63,31,0), A_MASK, PPCCOM, { FRT,FRA,FRC,FRB } }, | 6279 | {"dcbzep", XRT(31,1023,0), XRT_MASK, E500MC|PPCA2, 0, {RA0, RB}}, |
4821 | { "fnma", A(63,31,0), A_MASK, PWRCOM, { FRT,FRA,FRC,FRB } }, | ||
4822 | { "fnmadd.", A(63,31,1), A_MASK, PPCCOM, { FRT,FRA,FRC,FRB } }, | ||
4823 | { "fnma.", A(63,31,1), A_MASK, PWRCOM, { FRT,FRA,FRC,FRB } }, | ||
4824 | 6280 | ||
4825 | { "fcmpo", X(63,32), X_MASK|(3<<21), COM, { BF, FRA, FRB } }, | 6281 | {"dcbzl", XOPL(31,1014,1), XRT_MASK, POWER4|E500MC, PPC476, {RA0, RB}}, |
4826 | 6282 | ||
4827 | { "dmulq", XRC(63,34,0), X_MASK, POWER6, { FRT, FRA, FRB } }, | 6283 | {"cctpl", 0x7c210b78, 0xffffffff, CELL, 0, {0}}, |
4828 | { "dmulq.", XRC(63,34,1), X_MASK, POWER6, { FRT, FRA, FRB } }, | 6284 | {"cctpm", 0x7c421378, 0xffffffff, CELL, 0, {0}}, |
6285 | {"cctph", 0x7c631b78, 0xffffffff, CELL, 0, {0}}, | ||
4829 | 6286 | ||
4830 | { "drrndq", ZRC(63,35,0), Z_MASK, POWER6, { FRT, FRA, FRB, RMC } }, | 6287 | {"dstt", XDSS(31,342,1), XDSS_MASK, PPCVEC, 0, {RA, RB, STRM}}, |
4831 | { "drrndq.", ZRC(63,35,1), Z_MASK, POWER6, { FRT, FRA, FRB, RMC } }, | 6288 | {"dststt", XDSS(31,374,1), XDSS_MASK, PPCVEC, 0, {RA, RB, STRM}}, |
6289 | {"dssall", XDSS(31,822,1), XDSS_MASK, PPCVEC, 0, {0}}, | ||
4832 | 6290 | ||
4833 | { "mtfsb1", XRC(63,38,0), XRARB_MASK, COM, { BT } }, | 6291 | {"db8cyc", 0x7f9ce378, 0xffffffff, CELL, 0, {0}}, |
4834 | { "mtfsb1.", XRC(63,38,1), XRARB_MASK, COM, { BT } }, | 6292 | {"db10cyc", 0x7fbdeb78, 0xffffffff, CELL, 0, {0}}, |
6293 | {"db12cyc", 0x7fdef378, 0xffffffff, CELL, 0, {0}}, | ||
6294 | {"db16cyc", 0x7ffffb78, 0xffffffff, CELL, 0, {0}}, | ||
4835 | 6295 | ||
4836 | { "fneg", XRC(63,40,0), XRA_MASK, COM, { FRT, FRB } }, | 6296 | {"lwz", OP(32), OP_MASK, PPCCOM, PPCVLE, {RT, D, RA0}}, |
4837 | { "fneg.", XRC(63,40,1), XRA_MASK, COM, { FRT, FRB } }, | 6297 | {"l", OP(32), OP_MASK, PWRCOM, PPCVLE, {RT, D, RA0}}, |
4838 | 6298 | ||
4839 | { "mcrfs", X(63,64), XRB_MASK|(3<<21)|(3<<16), COM, { BF, BFA } }, | 6299 | {"lwzu", OP(33), OP_MASK, PPCCOM, PPCVLE, {RT, D, RAL}}, |
6300 | {"lu", OP(33), OP_MASK, PWRCOM, PPCVLE, {RT, D, RA0}}, | ||
4840 | 6301 | ||
4841 | { "dscliq", ZRC(63,66,0), Z_MASK, POWER6, { FRT, FRA, SH16 } }, | 6302 | {"lbz", OP(34), OP_MASK, COM, PPCVLE, {RT, D, RA0}}, |
4842 | { "dscliq.", ZRC(63,66,1), Z_MASK, POWER6, { FRT, FRA, SH16 } }, | ||
4843 | 6303 | ||
4844 | { "dquaiq", ZRC(63,67,0), Z_MASK, POWER6, { TE, FRT, FRB, RMC } }, | 6304 | {"lbzu", OP(35), OP_MASK, COM, PPCVLE, {RT, D, RAL}}, |
4845 | { "dquaiq.", ZRC(63,67,1), Z_MASK, POWER6, { FRT, FRA, FRB, RMC } }, | ||
4846 | 6305 | ||
4847 | { "mtfsb0", XRC(63,70,0), XRARB_MASK, COM, { BT } }, | 6306 | {"stw", OP(36), OP_MASK, PPCCOM, PPCVLE, {RS, D, RA0}}, |
4848 | { "mtfsb0.", XRC(63,70,1), XRARB_MASK, COM, { BT } }, | 6307 | {"st", OP(36), OP_MASK, PWRCOM, PPCVLE, {RS, D, RA0}}, |
4849 | 6308 | ||
4850 | { "fmr", XRC(63,72,0), XRA_MASK, COM, { FRT, FRB } }, | 6309 | {"stwu", OP(37), OP_MASK, PPCCOM, PPCVLE, {RS, D, RAS}}, |
4851 | { "fmr.", XRC(63,72,1), XRA_MASK, COM, { FRT, FRB } }, | 6310 | {"stu", OP(37), OP_MASK, PWRCOM, PPCVLE, {RS, D, RA0}}, |
4852 | 6311 | ||
4853 | { "dscriq", ZRC(63,98,0), Z_MASK, POWER6, { FRT, FRA, SH16 } }, | 6312 | {"stb", OP(38), OP_MASK, COM, PPCVLE, {RS, D, RA0}}, |
4854 | { "dscriq.", ZRC(63,98,1), Z_MASK, POWER6, { FRT, FRA, SH16 } }, | ||
4855 | 6313 | ||
4856 | { "drintxq", ZRC(63,99,0), Z_MASK, POWER6, { R, FRT, FRB, RMC } }, | 6314 | {"stbu", OP(39), OP_MASK, COM, PPCVLE, {RS, D, RAS}}, |
4857 | { "drintxq.",ZRC(63,99,1), Z_MASK, POWER6, { R, FRT, FRB, RMC } }, | ||
4858 | 6315 | ||
4859 | { "dcmpoq", X(63,130), X_MASK, POWER6, { BF, FRA, FRB } }, | 6316 | {"lhz", OP(40), OP_MASK, COM, PPCVLE, {RT, D, RA0}}, |
4860 | 6317 | ||
4861 | { "mtfsfi", XRC(63,134,0), XRA_MASK|(3<<21)|(1<<11), COM, { BF, U } }, | 6318 | {"lhzu", OP(41), OP_MASK, COM, PPCVLE, {RT, D, RAL}}, |
4862 | { "mtfsfi.", XRC(63,134,1), XRA_MASK|(3<<21)|(1<<11), COM, { BF, U } }, | ||
4863 | 6319 | ||
4864 | { "fnabs", XRC(63,136,0), XRA_MASK, COM, { FRT, FRB } }, | 6320 | {"lha", OP(42), OP_MASK, COM, PPCVLE, {RT, D, RA0}}, |
4865 | { "fnabs.", XRC(63,136,1), XRA_MASK, COM, { FRT, FRB } }, | ||
4866 | 6321 | ||
4867 | { "dtstexq", X(63,162), X_MASK, POWER6, { BF, FRA, FRB } }, | 6322 | {"lhau", OP(43), OP_MASK, COM, PPCVLE, {RT, D, RAL}}, |
4868 | { "dtstdcq", Z(63,194), Z_MASK, POWER6, { BF, FRA, DCM } }, | ||
4869 | { "dtstdgq", Z(63,226), Z_MASK, POWER6, { BF, FRA, DGM } }, | ||
4870 | 6323 | ||
4871 | { "drintnq", ZRC(63,227,0), Z_MASK, POWER6, { R, FRT, FRB, RMC } }, | 6324 | {"sth", OP(44), OP_MASK, COM, PPCVLE, {RS, D, RA0}}, |
4872 | { "drintnq.",ZRC(63,227,1), Z_MASK, POWER6, { R, FRT, FRB, RMC } }, | ||
4873 | 6325 | ||
4874 | { "dctqpq", XRC(63,258,0), X_MASK, POWER6, { FRT, FRB } }, | 6326 | {"sthu", OP(45), OP_MASK, COM, PPCVLE, {RS, D, RAS}}, |
4875 | { "dctqpq.", XRC(63,258,1), X_MASK, POWER6, { FRT, FRB } }, | ||
4876 | 6327 | ||
4877 | { "fabs", XRC(63,264,0), XRA_MASK, COM, { FRT, FRB } }, | 6328 | {"lmw", OP(46), OP_MASK, PPCCOM, PPCVLE, {RT, D, RAM}}, |
4878 | { "fabs.", XRC(63,264,1), XRA_MASK, COM, { FRT, FRB } }, | 6329 | {"lm", OP(46), OP_MASK, PWRCOM, PPCVLE, {RT, D, RA0}}, |
4879 | 6330 | ||
4880 | { "dctfixq", XRC(63,290,0), X_MASK, POWER6, { FRT, FRB } }, | 6331 | {"stmw", OP(47), OP_MASK, PPCCOM, PPCVLE, {RS, D, RA0}}, |
4881 | { "dctfixq.",XRC(63,290,1), X_MASK, POWER6, { FRT, FRB } }, | 6332 | {"stm", OP(47), OP_MASK, PWRCOM, PPCVLE, {RS, D, RA0}}, |
4882 | 6333 | ||
4883 | { "ddedpdq", XRC(63,322,0), X_MASK, POWER6, { SP, FRT, FRB } }, | 6334 | {"lfs", OP(48), OP_MASK, COM, PPCEFS|PPCVLE, {FRT, D, RA0}}, |
4884 | { "ddedpdq.",XRC(63,322,1), X_MASK, POWER6, { SP, FRT, FRB } }, | ||
4885 | 6335 | ||
4886 | { "dxexq", XRC(63,354,0), X_MASK, POWER6, { FRT, FRB } }, | 6336 | {"lfsu", OP(49), OP_MASK, COM, PPCEFS|PPCVLE, {FRT, D, RAS}}, |
4887 | { "dxexq.", XRC(63,354,1), X_MASK, POWER6, { FRT, FRB } }, | ||
4888 | 6337 | ||
4889 | { "frin", XRC(63,392,0), XRA_MASK, POWER5, { FRT, FRB } }, | 6338 | {"lfd", OP(50), OP_MASK, COM, PPCEFS|PPCVLE, {FRT, D, RA0}}, |
4890 | { "frin.", XRC(63,392,1), XRA_MASK, POWER5, { FRT, FRB } }, | ||
4891 | { "friz", XRC(63,424,0), XRA_MASK, POWER5, { FRT, FRB } }, | ||
4892 | { "friz.", XRC(63,424,1), XRA_MASK, POWER5, { FRT, FRB } }, | ||
4893 | { "frip", XRC(63,456,0), XRA_MASK, POWER5, { FRT, FRB } }, | ||
4894 | { "frip.", XRC(63,456,1), XRA_MASK, POWER5, { FRT, FRB } }, | ||
4895 | { "frim", XRC(63,488,0), XRA_MASK, POWER5, { FRT, FRB } }, | ||
4896 | { "frim.", XRC(63,488,1), XRA_MASK, POWER5, { FRT, FRB } }, | ||
4897 | 6339 | ||
4898 | { "dsubq", XRC(63,514,0), X_MASK, POWER6, { FRT, FRA, FRB } }, | 6340 | {"lfdu", OP(51), OP_MASK, COM, PPCEFS|PPCVLE, {FRT, D, RAS}}, |
4899 | { "dsubq.", XRC(63,514,1), X_MASK, POWER6, { FRT, FRA, FRB } }, | ||
4900 | 6341 | ||
4901 | { "ddivq", XRC(63,546,0), X_MASK, POWER6, { FRT, FRA, FRB } }, | 6342 | {"stfs", OP(52), OP_MASK, COM, PPCEFS|PPCVLE, {FRS, D, RA0}}, |
4902 | { "ddivq.", XRC(63,546,1), X_MASK, POWER6, { FRT, FRA, FRB } }, | ||
4903 | 6343 | ||
4904 | { "mffs", XRC(63,583,0), XRARB_MASK, COM, { FRT } }, | 6344 | {"stfsu", OP(53), OP_MASK, COM, PPCEFS|PPCVLE, {FRS, D, RAS}}, |
4905 | { "mffs.", XRC(63,583,1), XRARB_MASK, COM, { FRT } }, | ||
4906 | 6345 | ||
4907 | { "dcmpuq", X(63,642), X_MASK, POWER6, { BF, FRA, FRB } }, | 6346 | {"stfd", OP(54), OP_MASK, COM, PPCEFS|PPCVLE, {FRS, D, RA0}}, |
4908 | 6347 | ||
4909 | { "dtstsfq", X(63,674), X_MASK, POWER6, { BF, FRA, FRB } }, | 6348 | {"stfdu", OP(55), OP_MASK, COM, PPCEFS|PPCVLE, {FRS, D, RAS}}, |
4910 | 6349 | ||
4911 | { "mtfsf", XFL(63,711,0), XFL_MASK, COM, { FLM, FRB } }, | 6350 | {"lq", OP(56), OP_MASK, POWER4, PPC476|PPCVLE, {RTQ, DQ, RAQ}}, |
4912 | { "mtfsf.", XFL(63,711,1), XFL_MASK, COM, { FLM, FRB } }, | 6351 | {"psq_l", OP(56), OP_MASK, PPCPS, PPCVLE, {FRT,PSD,RA,PSW,PSQ}}, |
6352 | {"lfq", OP(56), OP_MASK, POWER2, PPCVLE, {FRT, D, RA0}}, | ||
4913 | 6353 | ||
4914 | { "drdpq", XRC(63,770,0), X_MASK, POWER6, { FRT, FRB } }, | 6354 | {"lxsd", DSO(57,2), DS_MASK, PPCVSX3, PPCVLE, {VD, DS, RA0}}, |
4915 | { "drdpq.", XRC(63,770,1), X_MASK, POWER6, { FRT, FRB } }, | 6355 | {"lxssp", DSO(57,3), DS_MASK, PPCVSX3, PPCVLE, {VD, DS, RA0}}, |
6356 | {"lfdp", OP(57), OP_MASK, POWER6, POWER7|PPCVLE, {FRTp, DS, RA0}}, | ||
6357 | {"psq_lu", OP(57), OP_MASK, PPCPS, PPCVLE, {FRT,PSD,RA,PSW,PSQ}}, | ||
6358 | {"lfqu", OP(57), OP_MASK, POWER2, PPCVLE, {FRT, D, RA0}}, | ||
4916 | 6359 | ||
4917 | { "dcffixq", XRC(63,802,0), X_MASK, POWER6, { FRT, FRB } }, | 6360 | {"ld", DSO(58,0), DS_MASK, PPC64, PPCVLE, {RT, DS, RA0}}, |
4918 | { "dcffixq.",XRC(63,802,1), X_MASK, POWER6, { FRT, FRB } }, | 6361 | {"ldu", DSO(58,1), DS_MASK, PPC64, PPCVLE, {RT, DS, RAL}}, |
6362 | {"lwa", DSO(58,2), DS_MASK, PPC64, PPCVLE, {RT, DS, RA0}}, | ||
4919 | 6363 | ||
4920 | { "fctid", XRC(63,814,0), XRA_MASK, PPC64, { FRT, FRB } }, | 6364 | {"dadd", XRC(59,2,0), X_MASK, POWER6, PPCVLE, {FRT, FRA, FRB}}, |
4921 | { "fctid.", XRC(63,814,1), XRA_MASK, PPC64, { FRT, FRB } }, | 6365 | {"dadd.", XRC(59,2,1), X_MASK, POWER6, PPCVLE, {FRT, FRA, FRB}}, |
4922 | 6366 | ||
4923 | { "fctidz", XRC(63,815,0), XRA_MASK, PPC64, { FRT, FRB } }, | 6367 | {"dqua", ZRC(59,3,0), Z2_MASK, POWER6, PPCVLE, {FRT,FRA,FRB,RMC}}, |
4924 | { "fctidz.", XRC(63,815,1), XRA_MASK, PPC64, { FRT, FRB } }, | 6368 | {"dqua.", ZRC(59,3,1), Z2_MASK, POWER6, PPCVLE, {FRT,FRA,FRB,RMC}}, |
4925 | 6369 | ||
4926 | { "denbcdq", XRC(63,834,0), X_MASK, POWER6, { S, FRT, FRB } }, | 6370 | {"fdivs", A(59,18,0), AFRC_MASK, PPC, PPCEFS|PPCVLE, {FRT, FRA, FRB}}, |
4927 | { "denbcdq.",XRC(63,834,1), X_MASK, POWER6, { S, FRT, FRB } }, | 6371 | {"fdivs.", A(59,18,1), AFRC_MASK, PPC, PPCEFS|PPCVLE, {FRT, FRA, FRB}}, |
4928 | 6372 | ||
4929 | { "fcfid", XRC(63,846,0), XRA_MASK, PPC64, { FRT, FRB } }, | 6373 | {"fsubs", A(59,20,0), AFRC_MASK, PPC, PPCEFS|PPCVLE, {FRT, FRA, FRB}}, |
4930 | { "fcfid.", XRC(63,846,1), XRA_MASK, PPC64, { FRT, FRB } }, | 6374 | {"fsubs.", A(59,20,1), AFRC_MASK, PPC, PPCEFS|PPCVLE, {FRT, FRA, FRB}}, |
4931 | 6375 | ||
4932 | { "diexq", XRC(63,866,0), X_MASK, POWER6, { FRT, FRA, FRB } }, | 6376 | {"fadds", A(59,21,0), AFRC_MASK, PPC, PPCEFS|PPCVLE, {FRT, FRA, FRB}}, |
4933 | { "diexq.", XRC(63,866,1), X_MASK, POWER6, { FRT, FRA, FRB } }, | 6377 | {"fadds.", A(59,21,1), AFRC_MASK, PPC, PPCEFS|PPCVLE, {FRT, FRA, FRB}}, |
4934 | 6378 | ||
6379 | {"fsqrts", A(59,22,0), AFRAFRC_MASK, PPC, TITAN|PPCVLE, {FRT, FRB}}, | ||
6380 | {"fsqrts.", A(59,22,1), AFRAFRC_MASK, PPC, TITAN|PPCVLE, {FRT, FRB}}, | ||
6381 | |||
6382 | {"fres", A(59,24,0), AFRAFRC_MASK, POWER7, PPCVLE, {FRT, FRB}}, | ||
6383 | {"fres", A(59,24,0), AFRALFRC_MASK, PPC, POWER7|PPCVLE, {FRT, FRB, A_L}}, | ||
6384 | {"fres.", A(59,24,1), AFRAFRC_MASK, POWER7, PPCVLE, {FRT, FRB}}, | ||
6385 | {"fres.", A(59,24,1), AFRALFRC_MASK, PPC, POWER7|PPCVLE, {FRT, FRB, A_L}}, | ||
6386 | |||
6387 | {"fmuls", A(59,25,0), AFRB_MASK, PPC, PPCEFS|PPCVLE, {FRT, FRA, FRC}}, | ||
6388 | {"fmuls.", A(59,25,1), AFRB_MASK, PPC, PPCEFS|PPCVLE, {FRT, FRA, FRC}}, | ||
6389 | |||
6390 | {"frsqrtes", A(59,26,0), AFRAFRC_MASK, POWER7, PPCVLE, {FRT, FRB}}, | ||
6391 | {"frsqrtes", A(59,26,0), AFRALFRC_MASK, POWER5, POWER7|PPCVLE, {FRT, FRB, A_L}}, | ||
6392 | {"frsqrtes.", A(59,26,1), AFRAFRC_MASK, POWER7, PPCVLE, {FRT, FRB}}, | ||
6393 | {"frsqrtes.", A(59,26,1), AFRALFRC_MASK, POWER5, POWER7|PPCVLE, {FRT, FRB, A_L}}, | ||
6394 | |||
6395 | {"fmsubs", A(59,28,0), A_MASK, PPC, PPCEFS|PPCVLE, {FRT, FRA, FRC, FRB}}, | ||
6396 | {"fmsubs.", A(59,28,1), A_MASK, PPC, PPCEFS|PPCVLE, {FRT, FRA, FRC, FRB}}, | ||
6397 | |||
6398 | {"fmadds", A(59,29,0), A_MASK, PPC, PPCEFS|PPCVLE, {FRT, FRA, FRC, FRB}}, | ||
6399 | {"fmadds.", A(59,29,1), A_MASK, PPC, PPCEFS|PPCVLE, {FRT, FRA, FRC, FRB}}, | ||
6400 | |||
6401 | {"fnmsubs", A(59,30,0), A_MASK, PPC, PPCEFS|PPCVLE, {FRT, FRA, FRC, FRB}}, | ||
6402 | {"fnmsubs.", A(59,30,1), A_MASK, PPC, PPCEFS|PPCVLE, {FRT, FRA, FRC, FRB}}, | ||
6403 | |||
6404 | {"fnmadds", A(59,31,0), A_MASK, PPC, PPCEFS|PPCVLE, {FRT, FRA, FRC, FRB}}, | ||
6405 | {"fnmadds.", A(59,31,1), A_MASK, PPC, PPCEFS|PPCVLE, {FRT, FRA, FRC, FRB}}, | ||
6406 | |||
6407 | {"dmul", XRC(59,34,0), X_MASK, POWER6, PPCVLE, {FRT, FRA, FRB}}, | ||
6408 | {"dmul.", XRC(59,34,1), X_MASK, POWER6, PPCVLE, {FRT, FRA, FRB}}, | ||
6409 | |||
6410 | {"drrnd", ZRC(59,35,0), Z2_MASK, POWER6, PPCVLE, {FRT, FRA, FRB, RMC}}, | ||
6411 | {"drrnd.", ZRC(59,35,1), Z2_MASK, POWER6, PPCVLE, {FRT, FRA, FRB, RMC}}, | ||
6412 | |||
6413 | {"dscli", ZRC(59,66,0), Z_MASK, POWER6, PPCVLE, {FRT, FRA, SH16}}, | ||
6414 | {"dscli.", ZRC(59,66,1), Z_MASK, POWER6, PPCVLE, {FRT, FRA, SH16}}, | ||
6415 | |||
6416 | {"dquai", ZRC(59,67,0), Z2_MASK, POWER6, PPCVLE, {TE, FRT,FRB,RMC}}, | ||
6417 | {"dquai.", ZRC(59,67,1), Z2_MASK, POWER6, PPCVLE, {TE, FRT,FRB,RMC}}, | ||
6418 | |||
6419 | {"dscri", ZRC(59,98,0), Z_MASK, POWER6, PPCVLE, {FRT, FRA, SH16}}, | ||
6420 | {"dscri.", ZRC(59,98,1), Z_MASK, POWER6, PPCVLE, {FRT, FRA, SH16}}, | ||
6421 | |||
6422 | {"drintx", ZRC(59,99,0), Z2_MASK, POWER6, PPCVLE, {R, FRT, FRB, RMC}}, | ||
6423 | {"drintx.", ZRC(59,99,1), Z2_MASK, POWER6, PPCVLE, {R, FRT, FRB, RMC}}, | ||
6424 | |||
6425 | {"dcmpo", X(59,130), X_MASK, POWER6, PPCVLE, {BF, FRA, FRB}}, | ||
6426 | |||
6427 | {"dtstex", X(59,162), X_MASK, POWER6, PPCVLE, {BF, FRA, FRB}}, | ||
6428 | {"dtstdc", Z(59,194), Z_MASK, POWER6, PPCVLE, {BF, FRA, DCM}}, | ||
6429 | {"dtstdg", Z(59,226), Z_MASK, POWER6, PPCVLE, {BF, FRA, DGM}}, | ||
6430 | |||
6431 | {"drintn", ZRC(59,227,0), Z2_MASK, POWER6, PPCVLE, {R, FRT, FRB, RMC}}, | ||
6432 | {"drintn.", ZRC(59,227,1), Z2_MASK, POWER6, PPCVLE, {R, FRT, FRB, RMC}}, | ||
6433 | |||
6434 | {"dctdp", XRC(59,258,0), X_MASK, POWER6, PPCVLE, {FRT, FRB}}, | ||
6435 | {"dctdp.", XRC(59,258,1), X_MASK, POWER6, PPCVLE, {FRT, FRB}}, | ||
6436 | |||
6437 | {"dctfix", XRC(59,290,0), X_MASK, POWER6, PPCVLE, {FRT, FRB}}, | ||
6438 | {"dctfix.", XRC(59,290,1), X_MASK, POWER6, PPCVLE, {FRT, FRB}}, | ||
6439 | |||
6440 | {"ddedpd", XRC(59,322,0), X_MASK, POWER6, PPCVLE, {SP, FRT, FRB}}, | ||
6441 | {"ddedpd.", XRC(59,322,1), X_MASK, POWER6, PPCVLE, {SP, FRT, FRB}}, | ||
6442 | |||
6443 | {"dxex", XRC(59,354,0), X_MASK, POWER6, PPCVLE, {FRT, FRB}}, | ||
6444 | {"dxex.", XRC(59,354,1), X_MASK, POWER6, PPCVLE, {FRT, FRB}}, | ||
6445 | |||
6446 | {"dsub", XRC(59,514,0), X_MASK, POWER6, PPCVLE, {FRT, FRA, FRB}}, | ||
6447 | {"dsub.", XRC(59,514,1), X_MASK, POWER6, PPCVLE, {FRT, FRA, FRB}}, | ||
6448 | |||
6449 | {"ddiv", XRC(59,546,0), X_MASK, POWER6, PPCVLE, {FRT, FRA, FRB}}, | ||
6450 | {"ddiv.", XRC(59,546,1), X_MASK, POWER6, PPCVLE, {FRT, FRA, FRB}}, | ||
6451 | |||
6452 | {"dcmpu", X(59,642), X_MASK, POWER6, PPCVLE, {BF, FRA, FRB}}, | ||
6453 | |||
6454 | {"dtstsf", X(59,674), X_MASK, POWER6, PPCVLE, {BF, FRA, FRB}}, | ||
6455 | {"dtstsfi", X(59,675), X_MASK|1<<22,POWER9, PPCVLE, {BF, UIM6, FRB}}, | ||
6456 | |||
6457 | {"drsp", XRC(59,770,0), X_MASK, POWER6, PPCVLE, {FRT, FRB}}, | ||
6458 | {"drsp.", XRC(59,770,1), X_MASK, POWER6, PPCVLE, {FRT, FRB}}, | ||
6459 | |||
6460 | {"dcffix", XRC(59,802,0), X_MASK|FRA_MASK, POWER7, PPCVLE, {FRT, FRB}}, | ||
6461 | {"dcffix.", XRC(59,802,1), X_MASK|FRA_MASK, POWER7, PPCVLE, {FRT, FRB}}, | ||
6462 | |||
6463 | {"denbcd", XRC(59,834,0), X_MASK, POWER6, PPCVLE, {S, FRT, FRB}}, | ||
6464 | {"denbcd.", XRC(59,834,1), X_MASK, POWER6, PPCVLE, {S, FRT, FRB}}, | ||
6465 | |||
6466 | {"fcfids", XRC(59,846,0), XRA_MASK, POWER7|PPCA2, PPCVLE, {FRT, FRB}}, | ||
6467 | {"fcfids.", XRC(59,846,1), XRA_MASK, POWER7|PPCA2, PPCVLE, {FRT, FRB}}, | ||
6468 | |||
6469 | {"diex", XRC(59,866,0), X_MASK, POWER6, PPCVLE, {FRT, FRA, FRB}}, | ||
6470 | {"diex.", XRC(59,866,1), X_MASK, POWER6, PPCVLE, {FRT, FRA, FRB}}, | ||
6471 | |||
6472 | {"fcfidus", XRC(59,974,0), XRA_MASK, POWER7|PPCA2, PPCVLE, {FRT, FRB}}, | ||
6473 | {"fcfidus.", XRC(59,974,1), XRA_MASK, POWER7|PPCA2, PPCVLE, {FRT, FRB}}, | ||
6474 | |||
6475 | {"xsaddsp", XX3(60,0), XX3_MASK, PPCVSX2, PPCVLE, {XT6, XA6, XB6}}, | ||
6476 | {"xsmaddasp", XX3(60,1), XX3_MASK, PPCVSX2, PPCVLE, {XT6, XA6, XB6}}, | ||
6477 | {"xxsldwi", XX3(60,2), XX3SHW_MASK, PPCVSX, PPCVLE, {XT6, XA6, XB6, SHW}}, | ||
6478 | {"xscmpeqdp", XX3(60,3), XX3_MASK, PPCVSX3, PPCVLE, {XT6, XA6, XB6}}, | ||
6479 | {"xsrsqrtesp", XX2(60,10), XX2_MASK, PPCVSX2, PPCVLE, {XT6, XB6}}, | ||
6480 | {"xssqrtsp", XX2(60,11), XX2_MASK, PPCVSX2, PPCVLE, {XT6, XB6}}, | ||
6481 | {"xxsel", XX4(60,3), XX4_MASK, PPCVSX, PPCVLE, {XT6, XA6, XB6, XC6}}, | ||
6482 | {"xssubsp", XX3(60,8), XX3_MASK, PPCVSX2, PPCVLE, {XT6, XA6, XB6}}, | ||
6483 | {"xsmaddmsp", XX3(60,9), XX3_MASK, PPCVSX2, PPCVLE, {XT6, XA6, XB6}}, | ||
6484 | {"xxspltd", XX3(60,10), XX3DM_MASK, PPCVSX, PPCVLE, {XT6, XA6, XB6S, DMEX}}, | ||
6485 | {"xxmrghd", XX3(60,10), XX3_MASK, PPCVSX, PPCVLE, {XT6, XA6, XB6}}, | ||
6486 | {"xxswapd", XX3(60,10)|(2<<8), XX3_MASK, PPCVSX, PPCVLE, {XT6, XA6, XB6S}}, | ||
6487 | {"xxmrgld", XX3(60,10)|(3<<8), XX3_MASK, PPCVSX, PPCVLE, {XT6, XA6, XB6}}, | ||
6488 | {"xxpermdi", XX3(60,10), XX3DM_MASK, PPCVSX, PPCVLE, {XT6, XA6, XB6, DM}}, | ||
6489 | {"xscmpgtdp", XX3(60,11), XX3_MASK, PPCVSX3, PPCVLE, {XT6, XA6, XB6}}, | ||
6490 | {"xsresp", XX2(60,26), XX2_MASK, PPCVSX2, PPCVLE, {XT6, XB6}}, | ||
6491 | {"xsmulsp", XX3(60,16), XX3_MASK, PPCVSX2, PPCVLE, {XT6, XA6, XB6}}, | ||
6492 | {"xsmsubasp", XX3(60,17), XX3_MASK, PPCVSX2, PPCVLE, {XT6, XA6, XB6}}, | ||
6493 | {"xxmrghw", XX3(60,18), XX3_MASK, PPCVSX, PPCVLE, {XT6, XA6, XB6}}, | ||
6494 | {"xscmpgedp", XX3(60,19), XX3_MASK, PPCVSX3, PPCVLE, {XT6, XA6, XB6}}, | ||
6495 | {"xsdivsp", XX3(60,24), XX3_MASK, PPCVSX2, PPCVLE, {XT6, XA6, XB6}}, | ||
6496 | {"xsmsubmsp", XX3(60,25), XX3_MASK, PPCVSX2, PPCVLE, {XT6, XA6, XB6}}, | ||
6497 | {"xxperm", XX3(60,26), XX3_MASK, PPCVSX3, PPCVLE, {XT6, XA6, XB6}}, | ||
6498 | {"xsadddp", XX3(60,32), XX3_MASK, PPCVSX, PPCVLE, {XT6, XA6, XB6}}, | ||
6499 | {"xsmaddadp", XX3(60,33), XX3_MASK, PPCVSX, PPCVLE, {XT6, XA6, XB6}}, | ||
6500 | {"xscmpudp", XX3(60,35), XX3BF_MASK, PPCVSX, PPCVLE, {BF, XA6, XB6}}, | ||
6501 | {"xscvdpuxws", XX2(60,72), XX2_MASK, PPCVSX, PPCVLE, {XT6, XB6}}, | ||
6502 | {"xsrdpi", XX2(60,73), XX2_MASK, PPCVSX, PPCVLE, {XT6, XB6}}, | ||
6503 | {"xsrsqrtedp", XX2(60,74), XX2_MASK, PPCVSX, PPCVLE, {XT6, XB6}}, | ||
6504 | {"xssqrtdp", XX2(60,75), XX2_MASK, PPCVSX, PPCVLE, {XT6, XB6}}, | ||
6505 | {"xssubdp", XX3(60,40), XX3_MASK, PPCVSX, PPCVLE, {XT6, XA6, XB6}}, | ||
6506 | {"xsmaddmdp", XX3(60,41), XX3_MASK, PPCVSX, PPCVLE, {XT6, XA6, XB6}}, | ||
6507 | {"xscmpodp", XX3(60,43), XX3BF_MASK, PPCVSX, PPCVLE, {BF, XA6, XB6}}, | ||
6508 | {"xscvdpsxws", XX2(60,88), XX2_MASK, PPCVSX, PPCVLE, {XT6, XB6}}, | ||
6509 | {"xsrdpiz", XX2(60,89), XX2_MASK, PPCVSX, PPCVLE, {XT6, XB6}}, | ||
6510 | {"xsredp", XX2(60,90), XX2_MASK, PPCVSX, PPCVLE, {XT6, XB6}}, | ||
6511 | {"xsmuldp", XX3(60,48), XX3_MASK, PPCVSX, PPCVLE, {XT6, XA6, XB6}}, | ||
6512 | {"xsmsubadp", XX3(60,49), XX3_MASK, PPCVSX, PPCVLE, {XT6, XA6, XB6}}, | ||
6513 | {"xxmrglw", XX3(60,50), XX3_MASK, PPCVSX, PPCVLE, {XT6, XA6, XB6}}, | ||
6514 | {"xsrdpip", XX2(60,105), XX2_MASK, PPCVSX, PPCVLE, {XT6, XB6}}, | ||
6515 | {"xstsqrtdp", XX2(60,106), XX2BF_MASK, PPCVSX, PPCVLE, {BF, XB6}}, | ||
6516 | {"xsrdpic", XX2(60,107), XX2_MASK, PPCVSX, PPCVLE, {XT6, XB6}}, | ||
6517 | {"xsdivdp", XX3(60,56), XX3_MASK, PPCVSX, PPCVLE, {XT6, XA6, XB6}}, | ||
6518 | {"xsmsubmdp", XX3(60,57), XX3_MASK, PPCVSX, PPCVLE, {XT6, XA6, XB6}}, | ||
6519 | {"xxpermr", XX3(60,58), XX3_MASK, PPCVSX3, PPCVLE, {XT6, XA6, XB6}}, | ||
6520 | {"xscmpexpdp", XX3(60,59), XX3BF_MASK, PPCVSX3, PPCVLE, {BF, XA6, XB6}}, | ||
6521 | {"xsrdpim", XX2(60,121), XX2_MASK, PPCVSX, PPCVLE, {XT6, XB6}}, | ||
6522 | {"xstdivdp", XX3(60,61), XX3BF_MASK, PPCVSX, PPCVLE, {BF, XA6, XB6}}, | ||
6523 | {"xvaddsp", XX3(60,64), XX3_MASK, PPCVSX, PPCVLE, {XT6, XA6, XB6}}, | ||
6524 | {"xvmaddasp", XX3(60,65), XX3_MASK, PPCVSX, PPCVLE, {XT6, XA6, XB6}}, | ||
6525 | {"xvcmpeqsp", XX3RC(60,67,0), XX3_MASK, PPCVSX, PPCVLE, {XT6, XA6, XB6}}, | ||
6526 | {"xvcmpeqsp.", XX3RC(60,67,1), XX3_MASK, PPCVSX, PPCVLE, {XT6, XA6, XB6}}, | ||
6527 | {"xvcvspuxws", XX2(60,136), XX2_MASK, PPCVSX, PPCVLE, {XT6, XB6}}, | ||
6528 | {"xvrspi", XX2(60,137), XX2_MASK, PPCVSX, PPCVLE, {XT6, XB6}}, | ||
6529 | {"xvrsqrtesp", XX2(60,138), XX2_MASK, PPCVSX, PPCVLE, {XT6, XB6}}, | ||
6530 | {"xvsqrtsp", XX2(60,139), XX2_MASK, PPCVSX, PPCVLE, {XT6, XB6}}, | ||
6531 | {"xvsubsp", XX3(60,72), XX3_MASK, PPCVSX, PPCVLE, {XT6, XA6, XB6}}, | ||
6532 | {"xvmaddmsp", XX3(60,73), XX3_MASK, PPCVSX, PPCVLE, {XT6, XA6, XB6}}, | ||
6533 | {"xvcmpgtsp", XX3RC(60,75,0), XX3_MASK, PPCVSX, PPCVLE, {XT6, XA6, XB6}}, | ||
6534 | {"xvcmpgtsp.", XX3RC(60,75,1), XX3_MASK, PPCVSX, PPCVLE, {XT6, XA6, XB6}}, | ||
6535 | {"xvcvspsxws", XX2(60,152), XX2_MASK, PPCVSX, PPCVLE, {XT6, XB6}}, | ||
6536 | {"xvrspiz", XX2(60,153), XX2_MASK, PPCVSX, PPCVLE, {XT6, XB6}}, | ||
6537 | {"xvresp", XX2(60,154), XX2_MASK, PPCVSX, PPCVLE, {XT6, XB6}}, | ||
6538 | {"xvmulsp", XX3(60,80), XX3_MASK, PPCVSX, PPCVLE, {XT6, XA6, XB6}}, | ||
6539 | {"xvmsubasp", XX3(60,81), XX3_MASK, PPCVSX, PPCVLE, {XT6, XA6, XB6}}, | ||
6540 | {"xxspltw", XX2(60,164), XX2UIM_MASK, PPCVSX, PPCVLE, {XT6, XB6, UIM}}, | ||
6541 | {"xxextractuw", XX2(60,165), XX2UIM4_MASK, PPCVSX3, PPCVLE, {XT6, XB6, UIMM4}}, | ||
6542 | {"xvcmpgesp", XX3RC(60,83,0), XX3_MASK, PPCVSX, PPCVLE, {XT6, XA6, XB6}}, | ||
6543 | {"xvcmpgesp.", XX3RC(60,83,1), XX3_MASK, PPCVSX, PPCVLE, {XT6, XA6, XB6}}, | ||
6544 | {"xvcvuxwsp", XX2(60,168), XX2_MASK, PPCVSX, PPCVLE, {XT6, XB6}}, | ||
6545 | {"xvrspip", XX2(60,169), XX2_MASK, PPCVSX, PPCVLE, {XT6, XB6}}, | ||
6546 | {"xvtsqrtsp", XX2(60,170), XX2BF_MASK, PPCVSX, PPCVLE, {BF, XB6}}, | ||
6547 | {"xvrspic", XX2(60,171), XX2_MASK, PPCVSX, PPCVLE, {XT6, XB6}}, | ||
6548 | {"xvdivsp", XX3(60,88), XX3_MASK, PPCVSX, PPCVLE, {XT6, XA6, XB6}}, | ||
6549 | {"xvmsubmsp", XX3(60,89), XX3_MASK, PPCVSX, PPCVLE, {XT6, XA6, XB6}}, | ||
6550 | {"xxspltib", X(60,360), XX1_MASK|3<<19, PPCVSX3, PPCVLE, {XT6, IMM8}}, | ||
6551 | {"xxinsertw", XX2(60,181), XX2UIM4_MASK, PPCVSX3, PPCVLE, {XT6, XB6, UIMM4}}, | ||
6552 | {"xvcvsxwsp", XX2(60,184), XX2_MASK, PPCVSX, PPCVLE, {XT6, XB6}}, | ||
6553 | {"xvrspim", XX2(60,185), XX2_MASK, PPCVSX, PPCVLE, {XT6, XB6}}, | ||
6554 | {"xvtdivsp", XX3(60,93), XX3BF_MASK, PPCVSX, PPCVLE, {BF, XA6, XB6}}, | ||
6555 | {"xvadddp", XX3(60,96), XX3_MASK, PPCVSX, PPCVLE, {XT6, XA6, XB6}}, | ||
6556 | {"xvmaddadp", XX3(60,97), XX3_MASK, PPCVSX, PPCVLE, {XT6, XA6, XB6}}, | ||
6557 | {"xvcmpeqdp", XX3RC(60,99,0), XX3_MASK, PPCVSX, PPCVLE, {XT6, XA6, XB6}}, | ||
6558 | {"xvcmpeqdp.", XX3RC(60,99,1), XX3_MASK, PPCVSX, PPCVLE, {XT6, XA6, XB6}}, | ||
6559 | {"xvcvdpuxws", XX2(60,200), XX2_MASK, PPCVSX, PPCVLE, {XT6, XB6}}, | ||
6560 | {"xvrdpi", XX2(60,201), XX2_MASK, PPCVSX, PPCVLE, {XT6, XB6}}, | ||
6561 | {"xvrsqrtedp", XX2(60,202), XX2_MASK, PPCVSX, PPCVLE, {XT6, XB6}}, | ||
6562 | {"xvsqrtdp", XX2(60,203), XX2_MASK, PPCVSX, PPCVLE, {XT6, XB6}}, | ||
6563 | {"xvsubdp", XX3(60,104), XX3_MASK, PPCVSX, PPCVLE, {XT6, XA6, XB6}}, | ||
6564 | {"xvmaddmdp", XX3(60,105), XX3_MASK, PPCVSX, PPCVLE, {XT6, XA6, XB6}}, | ||
6565 | {"xvcmpgtdp", XX3RC(60,107,0), XX3_MASK, PPCVSX, PPCVLE, {XT6, XA6, XB6}}, | ||
6566 | {"xvcmpgtdp.", XX3RC(60,107,1), XX3_MASK, PPCVSX, PPCVLE, {XT6, XA6, XB6}}, | ||
6567 | {"xvcvdpsxws", XX2(60,216), XX2_MASK, PPCVSX, PPCVLE, {XT6, XB6}}, | ||
6568 | {"xvrdpiz", XX2(60,217), XX2_MASK, PPCVSX, PPCVLE, {XT6, XB6}}, | ||
6569 | {"xvredp", XX2(60,218), XX2_MASK, PPCVSX, PPCVLE, {XT6, XB6}}, | ||
6570 | {"xvmuldp", XX3(60,112), XX3_MASK, PPCVSX, PPCVLE, {XT6, XA6, XB6}}, | ||
6571 | {"xvmsubadp", XX3(60,113), XX3_MASK, PPCVSX, PPCVLE, {XT6, XA6, XB6}}, | ||
6572 | {"xvcmpgedp", XX3RC(60,115,0), XX3_MASK, PPCVSX, PPCVLE, {XT6, XA6, XB6}}, | ||
6573 | {"xvcmpgedp.", XX3RC(60,115,1), XX3_MASK, PPCVSX, PPCVLE, {XT6, XA6, XB6}}, | ||
6574 | {"xvcvuxwdp", XX2(60,232), XX2_MASK, PPCVSX, PPCVLE, {XT6, XB6}}, | ||
6575 | {"xvrdpip", XX2(60,233), XX2_MASK, PPCVSX, PPCVLE, {XT6, XB6}}, | ||
6576 | {"xvtsqrtdp", XX2(60,234), XX2BF_MASK, PPCVSX, PPCVLE, {BF, XB6}}, | ||
6577 | {"xvrdpic", XX2(60,235), XX2_MASK, PPCVSX, PPCVLE, {XT6, XB6}}, | ||
6578 | {"xvdivdp", XX3(60,120), XX3_MASK, PPCVSX, PPCVLE, {XT6, XA6, XB6}}, | ||
6579 | {"xvmsubmdp", XX3(60,121), XX3_MASK, PPCVSX, PPCVLE, {XT6, XA6, XB6}}, | ||
6580 | {"xvcvsxwdp", XX2(60,248), XX2_MASK, PPCVSX, PPCVLE, {XT6, XB6}}, | ||
6581 | {"xvrdpim", XX2(60,249), XX2_MASK, PPCVSX, PPCVLE, {XT6, XB6}}, | ||
6582 | {"xvtdivdp", XX3(60,125), XX3BF_MASK, PPCVSX, PPCVLE, {BF, XA6, XB6}}, | ||
6583 | {"xsmaxcdp", XX3(60,128), XX3_MASK, PPCVSX3, PPCVLE, {XT6, XA6, XB6}}, | ||
6584 | {"xsnmaddasp", XX3(60,129), XX3_MASK, PPCVSX2, PPCVLE, {XT6, XA6, XB6}}, | ||
6585 | {"xxland", XX3(60,130), XX3_MASK, PPCVSX, PPCVLE, {XT6, XA6, XB6}}, | ||
6586 | {"xscvdpsp", XX2(60,265), XX2_MASK, PPCVSX, PPCVLE, {XT6, XB6}}, | ||
6587 | {"xscvdpspn", XX2(60,267), XX2_MASK, PPCVSX2, PPCVLE, {XT6, XB6}}, | ||
6588 | {"xsmincdp", XX3(60,136), XX3_MASK, PPCVSX3, PPCVLE, {XT6, XA6, XB6}}, | ||
6589 | {"xsnmaddmsp", XX3(60,137), XX3_MASK, PPCVSX2, PPCVLE, {XT6, XA6, XB6}}, | ||
6590 | {"xxlandc", XX3(60,138), XX3_MASK, PPCVSX, PPCVLE, {XT6, XA6, XB6}}, | ||
6591 | {"xsrsp", XX2(60,281), XX2_MASK, PPCVSX2, PPCVLE, {XT6, XB6}}, | ||
6592 | {"xsmaxjdp", XX3(60,144), XX3_MASK, PPCVSX3, PPCVLE, {XT6, XA6, XB6}}, | ||
6593 | {"xsnmsubasp", XX3(60,145), XX3_MASK, PPCVSX2, PPCVLE, {XT6, XA6, XB6}}, | ||
6594 | {"xxlor", XX3(60,146), XX3_MASK, PPCVSX, PPCVLE, {XT6, XA6, XB6}}, | ||
6595 | {"xscvuxdsp", XX2(60,296), XX2_MASK, PPCVSX2, PPCVLE, {XT6, XB6}}, | ||
6596 | {"xststdcsp", XX2(60,298), XX2BFD_MASK, PPCVSX3, PPCVLE, {BF, XB6, DCMX}}, | ||
6597 | {"xsminjdp", XX3(60,152), XX3_MASK, PPCVSX3, PPCVLE, {XT6, XA6, XB6}}, | ||
6598 | {"xsnmsubmsp", XX3(60,153), XX3_MASK, PPCVSX2, PPCVLE, {XT6, XA6, XB6}}, | ||
6599 | {"xxlxor", XX3(60,154), XX3_MASK, PPCVSX, PPCVLE, {XT6, XA6, XB6}}, | ||
6600 | {"xscvsxdsp", XX2(60,312), XX2_MASK, PPCVSX2, PPCVLE, {XT6, XB6}}, | ||
6601 | {"xsmaxdp", XX3(60,160), XX3_MASK, PPCVSX, PPCVLE, {XT6, XA6, XB6}}, | ||
6602 | {"xsnmaddadp", XX3(60,161), XX3_MASK, PPCVSX, PPCVLE, {XT6, XA6, XB6}}, | ||
6603 | {"xxlnor", XX3(60,162), XX3_MASK, PPCVSX, PPCVLE, {XT6, XA6, XB6}}, | ||
6604 | {"xscvdpuxds", XX2(60,328), XX2_MASK, PPCVSX, PPCVLE, {XT6, XB6}}, | ||
6605 | {"xscvspdp", XX2(60,329), XX2_MASK, PPCVSX, PPCVLE, {XT6, XB6}}, | ||
6606 | {"xscvspdpn", XX2(60,331), XX2_MASK, PPCVSX2, PPCVLE, {XT6, XB6}}, | ||
6607 | {"xsmindp", XX3(60,168), XX3_MASK, PPCVSX, PPCVLE, {XT6, XA6, XB6}}, | ||
6608 | {"xsnmaddmdp", XX3(60,169), XX3_MASK, PPCVSX, PPCVLE, {XT6, XA6, XB6}}, | ||
6609 | {"xxlorc", XX3(60,170), XX3_MASK, PPCVSX2, PPCVLE, {XT6, XA6, XB6}}, | ||
6610 | {"xscvdpsxds", XX2(60,344), XX2_MASK, PPCVSX, PPCVLE, {XT6, XB6}}, | ||
6611 | {"xsabsdp", XX2(60,345), XX2_MASK, PPCVSX, PPCVLE, {XT6, XB6}}, | ||
6612 | {"xsxexpdp", XX2VA(60,347,0),XX2_MASK|1, PPCVSX3, PPCVLE, {RT, XB6}}, | ||
6613 | {"xsxsigdp", XX2VA(60,347,1),XX2_MASK|1, PPCVSX3, PPCVLE, {RT, XB6}}, | ||
6614 | {"xscvhpdp", XX2VA(60,347,16),XX2_MASK, PPCVSX3, PPCVLE, {XT6, XB6}}, | ||
6615 | {"xscvdphp", XX2VA(60,347,17),XX2_MASK, PPCVSX3, PPCVLE, {XT6, XB6}}, | ||
6616 | {"xscpsgndp", XX3(60,176), XX3_MASK, PPCVSX, PPCVLE, {XT6, XA6, XB6}}, | ||
6617 | {"xsnmsubadp", XX3(60,177), XX3_MASK, PPCVSX, PPCVLE, {XT6, XA6, XB6}}, | ||
6618 | {"xxlnand", XX3(60,178), XX3_MASK, PPCVSX2, PPCVLE, {XT6, XA6, XB6}}, | ||
6619 | {"xscvuxddp", XX2(60,360), XX2_MASK, PPCVSX, PPCVLE, {XT6, XB6}}, | ||
6620 | {"xsnabsdp", XX2(60,361), XX2_MASK, PPCVSX, PPCVLE, {XT6, XB6}}, | ||
6621 | {"xststdcdp", XX2(60,362), XX2BFD_MASK, PPCVSX3, PPCVLE, {BF, XB6, DCMX}}, | ||
6622 | {"xsnmsubmdp", XX3(60,185), XX3_MASK, PPCVSX, PPCVLE, {XT6, XA6, XB6}}, | ||
6623 | {"xxleqv", XX3(60,186), XX3_MASK, PPCVSX2, PPCVLE, {XT6, XA6, XB6}}, | ||
6624 | {"xscvsxddp", XX2(60,376), XX2_MASK, PPCVSX, PPCVLE, {XT6, XB6}}, | ||
6625 | {"xsnegdp", XX2(60,377), XX2_MASK, PPCVSX, PPCVLE, {XT6, XB6}}, | ||
6626 | {"xvmaxsp", XX3(60,192), XX3_MASK, PPCVSX, PPCVLE, {XT6, XA6, XB6}}, | ||
6627 | {"xvnmaddasp", XX3(60,193), XX3_MASK, PPCVSX, PPCVLE, {XT6, XA6, XB6}}, | ||
6628 | {"xvcvspuxds", XX2(60,392), XX2_MASK, PPCVSX, PPCVLE, {XT6, XB6}}, | ||
6629 | {"xvcvdpsp", XX2(60,393), XX2_MASK, PPCVSX, PPCVLE, {XT6, XB6}}, | ||
6630 | {"xvminsp", XX3(60,200), XX3_MASK, PPCVSX, PPCVLE, {XT6, XA6, XB6}}, | ||
6631 | {"xvnmaddmsp", XX3(60,201), XX3_MASK, PPCVSX, PPCVLE, {XT6, XA6, XB6}}, | ||
6632 | {"xvcvspsxds", XX2(60,408), XX2_MASK, PPCVSX, PPCVLE, {XT6, XB6}}, | ||
6633 | {"xvabssp", XX2(60,409), XX2_MASK, PPCVSX, PPCVLE, {XT6, XB6}}, | ||
6634 | {"xvmovsp", XX3(60,208), XX3_MASK, PPCVSX, PPCVLE, {XT6, XA6, XB6S}}, | ||
6635 | {"xvcpsgnsp", XX3(60,208), XX3_MASK, PPCVSX, PPCVLE, {XT6, XA6, XB6}}, | ||
6636 | {"xvnmsubasp", XX3(60,209), XX3_MASK, PPCVSX, PPCVLE, {XT6, XA6, XB6}}, | ||
6637 | {"xvcvuxdsp", XX2(60,424), XX2_MASK, PPCVSX, PPCVLE, {XT6, XB6}}, | ||
6638 | {"xvnabssp", XX2(60,425), XX2_MASK, PPCVSX, PPCVLE, {XT6, XB6}}, | ||
6639 | {"xvtstdcsp", XX2(60,426), XX2DCMXS_MASK, PPCVSX3, PPCVLE, {XT6, XB6, DCMXS}}, | ||
6640 | {"xviexpsp", XX3(60,216), XX3_MASK, PPCVSX3, PPCVLE, {XT6, XA6, XB6}}, | ||
6641 | {"xvnmsubmsp", XX3(60,217), XX3_MASK, PPCVSX, PPCVLE, {XT6, XA6, XB6}}, | ||
6642 | {"xvcvsxdsp", XX2(60,440), XX2_MASK, PPCVSX, PPCVLE, {XT6, XB6}}, | ||
6643 | {"xvnegsp", XX2(60,441), XX2_MASK, PPCVSX, PPCVLE, {XT6, XB6}}, | ||
6644 | {"xvmaxdp", XX3(60,224), XX3_MASK, PPCVSX, PPCVLE, {XT6, XA6, XB6}}, | ||
6645 | {"xvnmaddadp", XX3(60,225), XX3_MASK, PPCVSX, PPCVLE, {XT6, XA6, XB6}}, | ||
6646 | {"xvcvdpuxds", XX2(60,456), XX2_MASK, PPCVSX, PPCVLE, {XT6, XB6}}, | ||
6647 | {"xvcvspdp", XX2(60,457), XX2_MASK, PPCVSX, PPCVLE, {XT6, XB6}}, | ||
6648 | {"xsiexpdp", X(60,918), XX1_MASK, PPCVSX3, PPCVLE, {XT6, RA, RB}}, | ||
6649 | {"xvmindp", XX3(60,232), XX3_MASK, PPCVSX, PPCVLE, {XT6, XA6, XB6}}, | ||
6650 | {"xvnmaddmdp", XX3(60,233), XX3_MASK, PPCVSX, PPCVLE, {XT6, XA6, XB6}}, | ||
6651 | {"xvcvdpsxds", XX2(60,472), XX2_MASK, PPCVSX, PPCVLE, {XT6, XB6}}, | ||
6652 | {"xvabsdp", XX2(60,473), XX2_MASK, PPCVSX, PPCVLE, {XT6, XB6}}, | ||
6653 | {"xvxexpdp", XX2VA(60,475,0),XX2_MASK, PPCVSX3, PPCVLE, {XT6, XB6}}, | ||
6654 | {"xvxsigdp", XX2VA(60,475,1),XX2_MASK, PPCVSX3, PPCVLE, {XT6, XB6}}, | ||
6655 | {"xxbrh", XX2VA(60,475,7),XX2_MASK, PPCVSX3, PPCVLE, {XT6, XB6}}, | ||
6656 | {"xvxexpsp", XX2VA(60,475,8),XX2_MASK, PPCVSX3, PPCVLE, {XT6, XB6}}, | ||
6657 | {"xvxsigsp", XX2VA(60,475,9),XX2_MASK, PPCVSX3, PPCVLE, {XT6, XB6}}, | ||
6658 | {"xxbrw", XX2VA(60,475,15),XX2_MASK, PPCVSX3, PPCVLE, {XT6, XB6}}, | ||
6659 | {"xxbrd", XX2VA(60,475,23),XX2_MASK, PPCVSX3, PPCVLE, {XT6, XB6}}, | ||
6660 | {"xvcvhpsp", XX2VA(60,475,24),XX2_MASK, PPCVSX3, PPCVLE, {XT6, XB6}}, | ||
6661 | {"xvcvsphp", XX2VA(60,475,25),XX2_MASK, PPCVSX3, PPCVLE, {XT6, XB6}}, | ||
6662 | {"xxbrq", XX2VA(60,475,31),XX2_MASK, PPCVSX3, PPCVLE, {XT6, XB6}}, | ||
6663 | {"xvmovdp", XX3(60,240), XX3_MASK, PPCVSX, PPCVLE, {XT6, XA6, XB6S}}, | ||
6664 | {"xvcpsgndp", XX3(60,240), XX3_MASK, PPCVSX, PPCVLE, {XT6, XA6, XB6}}, | ||
6665 | {"xvnmsubadp", XX3(60,241), XX3_MASK, PPCVSX, PPCVLE, {XT6, XA6, XB6}}, | ||
6666 | {"xvcvuxddp", XX2(60,488), XX2_MASK, PPCVSX, PPCVLE, {XT6, XB6}}, | ||
6667 | {"xvnabsdp", XX2(60,489), XX2_MASK, PPCVSX, PPCVLE, {XT6, XB6}}, | ||
6668 | {"xvtstdcdp", XX2(60,490), XX2DCMXS_MASK, PPCVSX3, PPCVLE, {XT6, XB6, DCMXS}}, | ||
6669 | {"xviexpdp", XX3(60,248), XX3_MASK, PPCVSX3, PPCVLE, {XT6, XA6, XB6}}, | ||
6670 | {"xvnmsubmdp", XX3(60,249), XX3_MASK, PPCVSX, PPCVLE, {XT6, XA6, XB6}}, | ||
6671 | {"xvcvsxddp", XX2(60,504), XX2_MASK, PPCVSX, PPCVLE, {XT6, XB6}}, | ||
6672 | {"xvnegdp", XX2(60,505), XX2_MASK, PPCVSX, PPCVLE, {XT6, XB6}}, | ||
6673 | |||
6674 | {"psq_st", OP(60), OP_MASK, PPCPS, PPCVLE, {FRS,PSD,RA,PSW,PSQ}}, | ||
6675 | {"stfq", OP(60), OP_MASK, POWER2, PPCVLE, {FRS, D, RA}}, | ||
6676 | |||
6677 | {"lxv", DQX(61,1), DQX_MASK, PPCVSX3, PPCVLE, {XTQ6, DQ, RA0}}, | ||
6678 | {"stxv", DQX(61,5), DQX_MASK, PPCVSX3, PPCVLE, {XSQ6, DQ, RA0}}, | ||
6679 | {"stxsd", DSO(61,2), DS_MASK, PPCVSX3, PPCVLE, {VS, DS, RA0}}, | ||
6680 | {"stxssp", DSO(61,3), DS_MASK, PPCVSX3, PPCVLE, {VS, DS, RA0}}, | ||
6681 | {"stfdp", OP(61), OP_MASK, POWER6, POWER7|PPCVLE, {FRSp, DS, RA0}}, | ||
6682 | {"psq_stu", OP(61), OP_MASK, PPCPS, PPCVLE, {FRS,PSD,RA,PSW,PSQ}}, | ||
6683 | {"stfqu", OP(61), OP_MASK, POWER2, PPCVLE, {FRS, D, RA}}, | ||
6684 | |||
6685 | {"std", DSO(62,0), DS_MASK, PPC64, PPCVLE, {RS, DS, RA0}}, | ||
6686 | {"stdu", DSO(62,1), DS_MASK, PPC64, PPCVLE, {RS, DS, RAS}}, | ||
6687 | {"stq", DSO(62,2), DS_MASK, POWER4, PPC476|PPCVLE, {RSQ, DS, RA0}}, | ||
6688 | |||
6689 | {"fcmpu", X(63,0), XBF_MASK, COM, PPCEFS|PPCVLE, {BF, FRA, FRB}}, | ||
6690 | |||
6691 | {"daddq", XRC(63,2,0), X_MASK, POWER6, PPCVLE, {FRTp, FRAp, FRBp}}, | ||
6692 | {"daddq.", XRC(63,2,1), X_MASK, POWER6, PPCVLE, {FRTp, FRAp, FRBp}}, | ||
6693 | |||
6694 | {"dquaq", ZRC(63,3,0), Z2_MASK, POWER6, PPCVLE, {FRTp, FRAp, FRBp, RMC}}, | ||
6695 | {"dquaq.", ZRC(63,3,1), Z2_MASK, POWER6, PPCVLE, {FRTp, FRAp, FRBp, RMC}}, | ||
6696 | |||
6697 | {"xsaddqp", XRC(63,4,0), X_MASK, PPCVSX3, PPCVLE, {VD, VA, VB}}, | ||
6698 | {"xsaddqpo", XRC(63,4,1), X_MASK, PPCVSX3, PPCVLE, {VD, VA, VB}}, | ||
6699 | |||
6700 | {"xsrqpi", ZRC(63,5,0), Z2_MASK, PPCVSX3, PPCVLE, {R, VD, VB, RMC}}, | ||
6701 | {"xsrqpix", ZRC(63,5,1), Z2_MASK, PPCVSX3, PPCVLE, {R, VD, VB, RMC}}, | ||
6702 | |||
6703 | {"fcpsgn", XRC(63,8,0), X_MASK, POWER6|PPCA2|PPC476, PPCVLE, {FRT, FRA, FRB}}, | ||
6704 | {"fcpsgn.", XRC(63,8,1), X_MASK, POWER6|PPCA2|PPC476, PPCVLE, {FRT, FRA, FRB}}, | ||
6705 | |||
6706 | {"frsp", XRC(63,12,0), XRA_MASK, COM, PPCEFS|PPCVLE, {FRT, FRB}}, | ||
6707 | {"frsp.", XRC(63,12,1), XRA_MASK, COM, PPCEFS|PPCVLE, {FRT, FRB}}, | ||
6708 | |||
6709 | {"fctiw", XRC(63,14,0), XRA_MASK, PPCCOM, PPCEFS|PPCVLE, {FRT, FRB}}, | ||
6710 | {"fcir", XRC(63,14,0), XRA_MASK, PWR2COM, PPCVLE, {FRT, FRB}}, | ||
6711 | {"fctiw.", XRC(63,14,1), XRA_MASK, PPCCOM, PPCEFS|PPCVLE, {FRT, FRB}}, | ||
6712 | {"fcir.", XRC(63,14,1), XRA_MASK, PWR2COM, PPCVLE, {FRT, FRB}}, | ||
6713 | |||
6714 | {"fctiwz", XRC(63,15,0), XRA_MASK, PPCCOM, PPCEFS|PPCVLE, {FRT, FRB}}, | ||
6715 | {"fcirz", XRC(63,15,0), XRA_MASK, PWR2COM, PPCVLE, {FRT, FRB}}, | ||
6716 | {"fctiwz.", XRC(63,15,1), XRA_MASK, PPCCOM, PPCEFS|PPCVLE, {FRT, FRB}}, | ||
6717 | {"fcirz.", XRC(63,15,1), XRA_MASK, PWR2COM, PPCVLE, {FRT, FRB}}, | ||
6718 | |||
6719 | {"fdiv", A(63,18,0), AFRC_MASK, PPCCOM, PPCEFS|PPCVLE, {FRT, FRA, FRB}}, | ||
6720 | {"fd", A(63,18,0), AFRC_MASK, PWRCOM, PPCVLE, {FRT, FRA, FRB}}, | ||
6721 | {"fdiv.", A(63,18,1), AFRC_MASK, PPCCOM, PPCEFS|PPCVLE, {FRT, FRA, FRB}}, | ||
6722 | {"fd.", A(63,18,1), AFRC_MASK, PWRCOM, PPCVLE, {FRT, FRA, FRB}}, | ||
6723 | |||
6724 | {"fsub", A(63,20,0), AFRC_MASK, PPCCOM, PPCEFS|PPCVLE, {FRT, FRA, FRB}}, | ||
6725 | {"fs", A(63,20,0), AFRC_MASK, PWRCOM, PPCVLE, {FRT, FRA, FRB}}, | ||
6726 | {"fsub.", A(63,20,1), AFRC_MASK, PPCCOM, PPCEFS|PPCVLE, {FRT, FRA, FRB}}, | ||
6727 | {"fs.", A(63,20,1), AFRC_MASK, PWRCOM, PPCVLE, {FRT, FRA, FRB}}, | ||
6728 | |||
6729 | {"fadd", A(63,21,0), AFRC_MASK, PPCCOM, PPCEFS|PPCVLE, {FRT, FRA, FRB}}, | ||
6730 | {"fa", A(63,21,0), AFRC_MASK, PWRCOM, PPCVLE, {FRT, FRA, FRB}}, | ||
6731 | {"fadd.", A(63,21,1), AFRC_MASK, PPCCOM, PPCEFS|PPCVLE, {FRT, FRA, FRB}}, | ||
6732 | {"fa.", A(63,21,1), AFRC_MASK, PWRCOM, PPCVLE, {FRT, FRA, FRB}}, | ||
6733 | |||
6734 | {"fsqrt", A(63,22,0), AFRAFRC_MASK, PPCPWR2, TITAN|PPCVLE, {FRT, FRB}}, | ||
6735 | {"fsqrt.", A(63,22,1), AFRAFRC_MASK, PPCPWR2, TITAN|PPCVLE, {FRT, FRB}}, | ||
6736 | |||
6737 | {"fsel", A(63,23,0), A_MASK, PPC, PPCEFS|PPCVLE, {FRT, FRA, FRC, FRB}}, | ||
6738 | {"fsel.", A(63,23,1), A_MASK, PPC, PPCEFS|PPCVLE, {FRT, FRA, FRC, FRB}}, | ||
6739 | |||
6740 | {"fre", A(63,24,0), AFRAFRC_MASK, POWER7, PPCVLE, {FRT, FRB}}, | ||
6741 | {"fre", A(63,24,0), AFRALFRC_MASK, POWER5, POWER7|PPCVLE, {FRT, FRB, A_L}}, | ||
6742 | {"fre.", A(63,24,1), AFRAFRC_MASK, POWER7, PPCVLE, {FRT, FRB}}, | ||
6743 | {"fre.", A(63,24,1), AFRALFRC_MASK, POWER5, POWER7|PPCVLE, {FRT, FRB, A_L}}, | ||
6744 | |||
6745 | {"fmul", A(63,25,0), AFRB_MASK, PPCCOM, PPCEFS|PPCVLE, {FRT, FRA, FRC}}, | ||
6746 | {"fm", A(63,25,0), AFRB_MASK, PWRCOM, PPCVLE|PPCVLE, {FRT, FRA, FRC}}, | ||
6747 | {"fmul.", A(63,25,1), AFRB_MASK, PPCCOM, PPCEFS|PPCVLE, {FRT, FRA, FRC}}, | ||
6748 | {"fm.", A(63,25,1), AFRB_MASK, PWRCOM, PPCVLE|PPCVLE, {FRT, FRA, FRC}}, | ||
6749 | |||
6750 | {"frsqrte", A(63,26,0), AFRAFRC_MASK, POWER7, PPCVLE, {FRT, FRB}}, | ||
6751 | {"frsqrte", A(63,26,0), AFRALFRC_MASK, PPC, POWER7|PPCVLE, {FRT, FRB, A_L}}, | ||
6752 | {"frsqrte.", A(63,26,1), AFRAFRC_MASK, POWER7, PPCVLE, {FRT, FRB}}, | ||
6753 | {"frsqrte.", A(63,26,1), AFRALFRC_MASK, PPC, POWER7|PPCVLE, {FRT, FRB, A_L}}, | ||
6754 | |||
6755 | {"fmsub", A(63,28,0), A_MASK, PPCCOM, PPCEFS|PPCVLE, {FRT, FRA, FRC, FRB}}, | ||
6756 | {"fms", A(63,28,0), A_MASK, PWRCOM, PPCVLE, {FRT, FRA, FRC, FRB}}, | ||
6757 | {"fmsub.", A(63,28,1), A_MASK, PPCCOM, PPCEFS|PPCVLE, {FRT, FRA, FRC, FRB}}, | ||
6758 | {"fms.", A(63,28,1), A_MASK, PWRCOM, PPCVLE, {FRT, FRA, FRC, FRB}}, | ||
6759 | |||
6760 | {"fmadd", A(63,29,0), A_MASK, PPCCOM, PPCEFS|PPCVLE, {FRT, FRA, FRC, FRB}}, | ||
6761 | {"fma", A(63,29,0), A_MASK, PWRCOM, PPCVLE, {FRT, FRA, FRC, FRB}}, | ||
6762 | {"fmadd.", A(63,29,1), A_MASK, PPCCOM, PPCEFS|PPCVLE, {FRT, FRA, FRC, FRB}}, | ||
6763 | {"fma.", A(63,29,1), A_MASK, PWRCOM, PPCVLE, {FRT, FRA, FRC, FRB}}, | ||
6764 | |||
6765 | {"fnmsub", A(63,30,0), A_MASK, PPCCOM, PPCEFS|PPCVLE, {FRT, FRA, FRC, FRB}}, | ||
6766 | {"fnms", A(63,30,0), A_MASK, PWRCOM, PPCVLE, {FRT, FRA, FRC, FRB}}, | ||
6767 | {"fnmsub.", A(63,30,1), A_MASK, PPCCOM, PPCEFS|PPCVLE, {FRT, FRA, FRC, FRB}}, | ||
6768 | {"fnms.", A(63,30,1), A_MASK, PWRCOM, PPCVLE, {FRT, FRA, FRC, FRB}}, | ||
6769 | |||
6770 | {"fnmadd", A(63,31,0), A_MASK, PPCCOM, PPCEFS|PPCVLE, {FRT, FRA, FRC, FRB}}, | ||
6771 | {"fnma", A(63,31,0), A_MASK, PWRCOM, PPCVLE, {FRT, FRA, FRC, FRB}}, | ||
6772 | {"fnmadd.", A(63,31,1), A_MASK, PPCCOM, PPCEFS|PPCVLE, {FRT, FRA, FRC, FRB}}, | ||
6773 | {"fnma.", A(63,31,1), A_MASK, PWRCOM, PPCVLE, {FRT, FRA, FRC, FRB}}, | ||
6774 | |||
6775 | {"fcmpo", X(63,32), XBF_MASK, COM, PPCEFS|PPCVLE, {BF, FRA, FRB}}, | ||
6776 | |||
6777 | {"dmulq", XRC(63,34,0), X_MASK, POWER6, PPCVLE, {FRTp, FRAp, FRBp}}, | ||
6778 | {"dmulq.", XRC(63,34,1), X_MASK, POWER6, PPCVLE, {FRTp, FRAp, FRBp}}, | ||
6779 | |||
6780 | {"drrndq", ZRC(63,35,0), Z2_MASK, POWER6, PPCVLE, {FRTp, FRA, FRBp, RMC}}, | ||
6781 | {"drrndq.", ZRC(63,35,1), Z2_MASK, POWER6, PPCVLE, {FRTp, FRA, FRBp, RMC}}, | ||
6782 | |||
6783 | {"xsmulqp", XRC(63,36,0), X_MASK, PPCVSX3, PPCVLE, {VD, VA, VB}}, | ||
6784 | {"xsmulqpo", XRC(63,36,1), X_MASK, PPCVSX3, PPCVLE, {VD, VA, VB}}, | ||
6785 | |||
6786 | {"xsrqpxp", Z(63,37), Z2_MASK, PPCVSX3, PPCVLE, {R, VD, VB, RMC}}, | ||
6787 | |||
6788 | {"mtfsb1", XRC(63,38,0), XRARB_MASK, COM, PPCVLE, {BT}}, | ||
6789 | {"mtfsb1.", XRC(63,38,1), XRARB_MASK, COM, PPCVLE, {BT}}, | ||
6790 | |||
6791 | {"fneg", XRC(63,40,0), XRA_MASK, COM, PPCEFS|PPCVLE, {FRT, FRB}}, | ||
6792 | {"fneg.", XRC(63,40,1), XRA_MASK, COM, PPCEFS|PPCVLE, {FRT, FRB}}, | ||
6793 | |||
6794 | {"mcrfs", X(63,64), XRB_MASK|(3<<21)|(3<<16), COM, PPCVLE, {BF, BFA}}, | ||
6795 | |||
6796 | {"dscliq", ZRC(63,66,0), Z_MASK, POWER6, PPCVLE, {FRTp, FRAp, SH16}}, | ||
6797 | {"dscliq.", ZRC(63,66,1), Z_MASK, POWER6, PPCVLE, {FRTp, FRAp, SH16}}, | ||
6798 | |||
6799 | {"dquaiq", ZRC(63,67,0), Z2_MASK, POWER6, PPCVLE, {TE, FRTp, FRBp, RMC}}, | ||
6800 | {"dquaiq.", ZRC(63,67,1), Z2_MASK, POWER6, PPCVLE, {TE, FRTp, FRBp, RMC}}, | ||
6801 | |||
6802 | {"mtfsb0", XRC(63,70,0), XRARB_MASK, COM, PPCVLE, {BT}}, | ||
6803 | {"mtfsb0.", XRC(63,70,1), XRARB_MASK, COM, PPCVLE, {BT}}, | ||
6804 | |||
6805 | {"fmr", XRC(63,72,0), XRA_MASK, COM, PPCEFS|PPCVLE, {FRT, FRB}}, | ||
6806 | {"fmr.", XRC(63,72,1), XRA_MASK, COM, PPCEFS|PPCVLE, {FRT, FRB}}, | ||
6807 | |||
6808 | {"dscriq", ZRC(63,98,0), Z_MASK, POWER6, PPCVLE, {FRTp, FRAp, SH16}}, | ||
6809 | {"dscriq.", ZRC(63,98,1), Z_MASK, POWER6, PPCVLE, {FRTp, FRAp, SH16}}, | ||
6810 | |||
6811 | {"drintxq", ZRC(63,99,0), Z2_MASK, POWER6, PPCVLE, {R, FRTp, FRBp, RMC}}, | ||
6812 | {"drintxq.", ZRC(63,99,1), Z2_MASK, POWER6, PPCVLE, {R, FRTp, FRBp, RMC}}, | ||
6813 | |||
6814 | {"xscpsgnqp", X(63,100), X_MASK, PPCVSX3, PPCVLE, {VD, VA, VB}}, | ||
6815 | |||
6816 | {"ftdiv", X(63,128), XBF_MASK, POWER7, PPCVLE, {BF, FRA, FRB}}, | ||
6817 | |||
6818 | {"dcmpoq", X(63,130), X_MASK, POWER6, PPCVLE, {BF, FRAp, FRBp}}, | ||
6819 | |||
6820 | {"xscmpoqp", X(63,132), XBF_MASK, PPCVSX3, PPCVLE, {BF, VA, VB}}, | ||
6821 | |||
6822 | {"mtfsfi", XRC(63,134,0), XWRA_MASK|(3<<21)|(1<<11), POWER6|PPCA2|PPC476, PPCVLE, {BFF, U, W}}, | ||
6823 | {"mtfsfi", XRC(63,134,0), XRA_MASK|(3<<21)|(1<<11), COM, POWER6|PPCA2|PPC476|PPCVLE, {BFF, U}}, | ||
6824 | {"mtfsfi.", XRC(63,134,1), XWRA_MASK|(3<<21)|(1<<11), POWER6|PPCA2|PPC476, PPCVLE, {BFF, U, W}}, | ||
6825 | {"mtfsfi.", XRC(63,134,1), XRA_MASK|(3<<21)|(1<<11), COM, POWER6|PPCA2|PPC476|PPCVLE, {BFF, U}}, | ||
6826 | |||
6827 | {"fnabs", XRC(63,136,0), XRA_MASK, COM, PPCEFS|PPCVLE, {FRT, FRB}}, | ||
6828 | {"fnabs.", XRC(63,136,1), XRA_MASK, COM, PPCEFS|PPCVLE, {FRT, FRB}}, | ||
6829 | |||
6830 | {"fctiwu", XRC(63,142,0), XRA_MASK, POWER7, PPCVLE, {FRT, FRB}}, | ||
6831 | {"fctiwu.", XRC(63,142,1), XRA_MASK, POWER7, PPCVLE, {FRT, FRB}}, | ||
6832 | {"fctiwuz", XRC(63,143,0), XRA_MASK, POWER7, PPCVLE, {FRT, FRB}}, | ||
6833 | {"fctiwuz.", XRC(63,143,1), XRA_MASK, POWER7, PPCVLE, {FRT, FRB}}, | ||
6834 | |||
6835 | {"ftsqrt", X(63,160), XBF_MASK|FRA_MASK, POWER7, PPCVLE, {BF, FRB}}, | ||
6836 | |||
6837 | {"dtstexq", X(63,162), X_MASK, POWER6, PPCVLE, {BF, FRAp, FRBp}}, | ||
6838 | |||
6839 | {"xscmpexpqp", X(63,164), XBF_MASK, PPCVSX3, PPCVLE, {BF, VA, VB}}, | ||
6840 | |||
6841 | {"dtstdcq", Z(63,194), Z_MASK, POWER6, PPCVLE, {BF, FRAp, DCM}}, | ||
6842 | {"dtstdgq", Z(63,226), Z_MASK, POWER6, PPCVLE, {BF, FRAp, DGM}}, | ||
6843 | |||
6844 | {"drintnq", ZRC(63,227,0), Z2_MASK, POWER6, PPCVLE, {R, FRTp, FRBp, RMC}}, | ||
6845 | {"drintnq.", ZRC(63,227,1), Z2_MASK, POWER6, PPCVLE, {R, FRTp, FRBp, RMC}}, | ||
6846 | |||
6847 | {"dctqpq", XRC(63,258,0), X_MASK, POWER6, PPCVLE, {FRTp, FRB}}, | ||
6848 | {"dctqpq.", XRC(63,258,1), X_MASK, POWER6, PPCVLE, {FRTp, FRB}}, | ||
6849 | |||
6850 | {"fabs", XRC(63,264,0), XRA_MASK, COM, PPCEFS|PPCVLE, {FRT, FRB}}, | ||
6851 | {"fabs.", XRC(63,264,1), XRA_MASK, COM, PPCEFS|PPCVLE, {FRT, FRB}}, | ||
6852 | |||
6853 | {"dctfixq", XRC(63,290,0), X_MASK, POWER6, PPCVLE, {FRT, FRBp}}, | ||
6854 | {"dctfixq.", XRC(63,290,1), X_MASK, POWER6, PPCVLE, {FRT, FRBp}}, | ||
6855 | |||
6856 | {"ddedpdq", XRC(63,322,0), X_MASK, POWER6, PPCVLE, {SP, FRTp, FRBp}}, | ||
6857 | {"ddedpdq.", XRC(63,322,1), X_MASK, POWER6, PPCVLE, {SP, FRTp, FRBp}}, | ||
6858 | |||
6859 | {"dxexq", XRC(63,354,0), X_MASK, POWER6, PPCVLE, {FRT, FRBp}}, | ||
6860 | {"dxexq.", XRC(63,354,1), X_MASK, POWER6, PPCVLE, {FRT, FRBp}}, | ||
6861 | |||
6862 | {"xsmaddqp", XRC(63,388,0), X_MASK, PPCVSX3, PPCVLE, {VD, VA, VB}}, | ||
6863 | {"xsmaddqpo", XRC(63,388,1), X_MASK, PPCVSX3, PPCVLE, {VD, VA, VB}}, | ||
6864 | |||
6865 | {"frin", XRC(63,392,0), XRA_MASK, POWER5, PPCVLE, {FRT, FRB}}, | ||
6866 | {"frin.", XRC(63,392,1), XRA_MASK, POWER5, PPCVLE, {FRT, FRB}}, | ||
6867 | |||
6868 | {"xsmsubqp", XRC(63,420,0), X_MASK, PPCVSX3, PPCVLE, {VD, VA, VB}}, | ||
6869 | {"xsmsubqpo", XRC(63,420,1), X_MASK, PPCVSX3, PPCVLE, {VD, VA, VB}}, | ||
6870 | |||
6871 | {"friz", XRC(63,424,0), XRA_MASK, POWER5, PPCVLE, {FRT, FRB}}, | ||
6872 | {"friz.", XRC(63,424,1), XRA_MASK, POWER5, PPCVLE, {FRT, FRB}}, | ||
6873 | |||
6874 | {"xsnmaddqp", XRC(63,452,0), X_MASK, PPCVSX3, PPCVLE, {VD, VA, VB}}, | ||
6875 | {"xsnmaddqpo", XRC(63,452,1), X_MASK, PPCVSX3, PPCVLE, {VD, VA, VB}}, | ||
6876 | |||
6877 | {"frip", XRC(63,456,0), XRA_MASK, POWER5, PPCVLE, {FRT, FRB}}, | ||
6878 | {"frip.", XRC(63,456,1), XRA_MASK, POWER5, PPCVLE, {FRT, FRB}}, | ||
6879 | |||
6880 | {"xsnmsubqp", XRC(63,484,0), X_MASK, PPCVSX3, PPCVLE, {VD, VA, VB}}, | ||
6881 | {"xsnmsubqpo", XRC(63,484,1), X_MASK, PPCVSX3, PPCVLE, {VD, VA, VB}}, | ||
6882 | |||
6883 | {"frim", XRC(63,488,0), XRA_MASK, POWER5, PPCVLE, {FRT, FRB}}, | ||
6884 | {"frim.", XRC(63,488,1), XRA_MASK, POWER5, PPCVLE, {FRT, FRB}}, | ||
6885 | |||
6886 | {"dsubq", XRC(63,514,0), X_MASK, POWER6, PPCVLE, {FRTp, FRAp, FRBp}}, | ||
6887 | {"dsubq.", XRC(63,514,1), X_MASK, POWER6, PPCVLE, {FRTp, FRAp, FRBp}}, | ||
6888 | |||
6889 | {"xssubqp", XRC(63,516,0), X_MASK, PPCVSX3, PPCVLE, {VD, VA, VB}}, | ||
6890 | {"xssubqpo", XRC(63,516,1), X_MASK, PPCVSX3, PPCVLE, {VD, VA, VB}}, | ||
6891 | |||
6892 | {"ddivq", XRC(63,546,0), X_MASK, POWER6, PPCVLE, {FRTp, FRAp, FRBp}}, | ||
6893 | {"ddivq.", XRC(63,546,1), X_MASK, POWER6, PPCVLE, {FRTp, FRAp, FRBp}}, | ||
6894 | |||
6895 | {"xsdivqp", XRC(63,548,0), X_MASK, PPCVSX3, PPCVLE, {VD, VA, VB}}, | ||
6896 | {"xsdivqpo", XRC(63,548,1), X_MASK, PPCVSX3, PPCVLE, {VD, VA, VB}}, | ||
6897 | |||
6898 | {"mffs", XRC(63,583,0), XRARB_MASK, COM, PPCEFS|PPCVLE, {FRT}}, | ||
6899 | {"mffs.", XRC(63,583,1), XRARB_MASK, COM, PPCEFS|PPCVLE, {FRT}}, | ||
6900 | |||
6901 | {"mffsce", XMMF(63,583,0,1), XMMF_MASK|RB_MASK, POWER9, PPCVLE, {FRT}}, | ||
6902 | {"mffscdrn", XMMF(63,583,2,4), XMMF_MASK, POWER9, PPCVLE, {FRT, FRB}}, | ||
6903 | {"mffscdrni", XMMF(63,583,2,5), XMMF_MASK|(3<<14), POWER9, PPCVLE, {FRT, DRM}}, | ||
6904 | {"mffscrn", XMMF(63,583,2,6), XMMF_MASK, POWER9, PPCVLE, {FRT, FRB}}, | ||
6905 | {"mffscrni", XMMF(63,583,2,7), XMMF_MASK|(7<<13), POWER9, PPCVLE, {FRT, RM}}, | ||
6906 | {"mffsl", XMMF(63,583,3,0), XMMF_MASK|RB_MASK, POWER9, PPCVLE, {FRT}}, | ||
6907 | |||
6908 | {"dcmpuq", X(63,642), X_MASK, POWER6, PPCVLE, {BF, FRAp, FRBp}}, | ||
6909 | |||
6910 | {"xscmpuqp", X(63,644), XBF_MASK, PPCVSX3, PPCVLE, {BF, VA, VB}}, | ||
6911 | |||
6912 | {"dtstsfq", X(63,674), X_MASK, POWER6, PPCVLE, {BF, FRA, FRBp}}, | ||
6913 | {"dtstsfiq", X(63,675), X_MASK|1<<22,POWER9, PPCVLE, {BF, UIM6, FRBp}}, | ||
6914 | |||
6915 | {"xststdcqp", X(63,708), X_MASK, PPCVSX3, PPCVLE, {BF, VB, DCMX}}, | ||
6916 | |||
6917 | {"mtfsf", XFL(63,711,0), XFL_MASK, POWER6|PPCA2|PPC476, PPCVLE, {FLM, FRB, XFL_L, W}}, | ||
6918 | {"mtfsf", XFL(63,711,0), XFL_MASK, COM, POWER6|PPCA2|PPC476|PPCEFS|PPCVLE, {FLM, FRB}}, | ||
6919 | {"mtfsf.", XFL(63,711,1), XFL_MASK, POWER6|PPCA2|PPC476, PPCVLE, {FLM, FRB, XFL_L, W}}, | ||
6920 | {"mtfsf.", XFL(63,711,1), XFL_MASK, COM, POWER6|PPCA2|PPC476|PPCEFS|PPCVLE, {FLM, FRB}}, | ||
6921 | |||
6922 | {"drdpq", XRC(63,770,0), X_MASK, POWER6, PPCVLE, {FRTp, FRBp}}, | ||
6923 | {"drdpq.", XRC(63,770,1), X_MASK, POWER6, PPCVLE, {FRTp, FRBp}}, | ||
6924 | |||
6925 | {"dcffixq", XRC(63,802,0), X_MASK, POWER6, PPCVLE, {FRTp, FRB}}, | ||
6926 | {"dcffixq.", XRC(63,802,1), X_MASK, POWER6, PPCVLE, {FRTp, FRB}}, | ||
6927 | |||
6928 | {"xsabsqp", XVA(63,804,0), XVA_MASK, PPCVSX3, PPCVLE, {VD, VB}}, | ||
6929 | {"xsxexpqp", XVA(63,804,2), XVA_MASK, PPCVSX3, PPCVLE, {VD, VB}}, | ||
6930 | {"xsnabsqp", XVA(63,804,8), XVA_MASK, PPCVSX3, PPCVLE, {VD, VB}}, | ||
6931 | {"xsnegqp", XVA(63,804,16), XVA_MASK, PPCVSX3, PPCVLE, {VD, VB}}, | ||
6932 | {"xsxsigqp", XVA(63,804,18), XVA_MASK, PPCVSX3, PPCVLE, {VD, VB}}, | ||
6933 | {"xssqrtqp", XVARC(63,804,27,0), XVA_MASK, PPCVSX3, PPCVLE, {VD, VB}}, | ||
6934 | {"xssqrtqpo", XVARC(63,804,27,1), XVA_MASK, PPCVSX3, PPCVLE, {VD, VB}}, | ||
6935 | |||
6936 | {"fctid", XRC(63,814,0), XRA_MASK, PPC64, PPCVLE, {FRT, FRB}}, | ||
6937 | {"fctid", XRC(63,814,0), XRA_MASK, PPC476, PPCVLE, {FRT, FRB}}, | ||
6938 | {"fctid.", XRC(63,814,1), XRA_MASK, PPC64, PPCVLE, {FRT, FRB}}, | ||
6939 | {"fctid.", XRC(63,814,1), XRA_MASK, PPC476, PPCVLE, {FRT, FRB}}, | ||
6940 | |||
6941 | {"fctidz", XRC(63,815,0), XRA_MASK, PPC64, PPCVLE, {FRT, FRB}}, | ||
6942 | {"fctidz", XRC(63,815,0), XRA_MASK, PPC476, PPCVLE, {FRT, FRB}}, | ||
6943 | {"fctidz.", XRC(63,815,1), XRA_MASK, PPC64, PPCVLE, {FRT, FRB}}, | ||
6944 | {"fctidz.", XRC(63,815,1), XRA_MASK, PPC476, PPCVLE, {FRT, FRB}}, | ||
6945 | |||
6946 | {"denbcdq", XRC(63,834,0), X_MASK, POWER6, PPCVLE, {S, FRTp, FRBp}}, | ||
6947 | {"denbcdq.", XRC(63,834,1), X_MASK, POWER6, PPCVLE, {S, FRTp, FRBp}}, | ||
6948 | |||
6949 | {"xscvqpuwz", XVA(63,836,1), XVA_MASK, PPCVSX3, PPCVLE, {VD, VB}}, | ||
6950 | {"xscvudqp", XVA(63,836,2), XVA_MASK, PPCVSX3, PPCVLE, {VD, VB}}, | ||
6951 | {"xscvqpswz", XVA(63,836,9), XVA_MASK, PPCVSX3, PPCVLE, {VD, VB}}, | ||
6952 | {"xscvsdqp", XVA(63,836,10), XVA_MASK, PPCVSX3, PPCVLE, {VD, VB}}, | ||
6953 | {"xscvqpudz", XVA(63,836,17), XVA_MASK, PPCVSX3, PPCVLE, {VD, VB}}, | ||
6954 | {"xscvqpdp", XVARC(63,836,20,0), XVA_MASK, PPCVSX3, PPCVLE, {VD, VB}}, | ||
6955 | {"xscvqpdpo", XVARC(63,836,20,1), XVA_MASK, PPCVSX3, PPCVLE, {VD, VB}}, | ||
6956 | {"xscvdpqp", XVA(63,836,22), XVA_MASK, PPCVSX3, PPCVLE, {VD, VB}}, | ||
6957 | {"xscvqpsdz", XVA(63,836,25), XVA_MASK, PPCVSX3, PPCVLE, {VD, VB}}, | ||
6958 | |||
6959 | {"fmrgow", X(63,838), X_MASK, PPCVSX2, PPCVLE, {FRT, FRA, FRB}}, | ||
6960 | |||
6961 | {"fcfid", XRC(63,846,0), XRA_MASK, PPC64, PPCVLE, {FRT, FRB}}, | ||
6962 | {"fcfid", XRC(63,846,0), XRA_MASK, PPC476, PPCVLE, {FRT, FRB}}, | ||
6963 | {"fcfid.", XRC(63,846,1), XRA_MASK, PPC64, PPCVLE, {FRT, FRB}}, | ||
6964 | {"fcfid.", XRC(63,846,1), XRA_MASK, PPC476, PPCVLE, {FRT, FRB}}, | ||
6965 | |||
6966 | {"diexq", XRC(63,866,0), X_MASK, POWER6, PPCVLE, {FRTp, FRA, FRBp}}, | ||
6967 | {"diexq.", XRC(63,866,1), X_MASK, POWER6, PPCVLE, {FRTp, FRA, FRBp}}, | ||
6968 | |||
6969 | {"xsiexpqp", X(63,868), X_MASK, PPCVSX3, PPCVLE, {VD, VA, VB}}, | ||
6970 | |||
6971 | {"fctidu", XRC(63,942,0), XRA_MASK, POWER7|PPCA2, PPCVLE, {FRT, FRB}}, | ||
6972 | {"fctidu.", XRC(63,942,1), XRA_MASK, POWER7|PPCA2, PPCVLE, {FRT, FRB}}, | ||
6973 | |||
6974 | {"fctiduz", XRC(63,943,0), XRA_MASK, POWER7|PPCA2, PPCVLE, {FRT, FRB}}, | ||
6975 | {"fctiduz.", XRC(63,943,1), XRA_MASK, POWER7|PPCA2, PPCVLE, {FRT, FRB}}, | ||
6976 | |||
6977 | {"fmrgew", X(63,966), X_MASK, PPCVSX2, PPCVLE, {FRT, FRA, FRB}}, | ||
6978 | |||
6979 | {"fcfidu", XRC(63,974,0), XRA_MASK, POWER7|PPCA2, PPCVLE, {FRT, FRB}}, | ||
6980 | {"fcfidu.", XRC(63,974,1), XRA_MASK, POWER7|PPCA2, PPCVLE, {FRT, FRB}}, | ||
6981 | }; | ||
6982 | |||
6983 | const int powerpc_num_opcodes = | ||
6984 | sizeof (powerpc_opcodes) / sizeof (powerpc_opcodes[0]); | ||
6985 | |||
6986 | /* The VLE opcode table. | ||
6987 | |||
6988 | The format of this opcode table is the same as the main opcode table. */ | ||
6989 | |||
6990 | const struct powerpc_opcode vle_opcodes[] = { | ||
6991 | {"se_illegal", C(0), C_MASK, PPCVLE, 0, {}}, | ||
6992 | {"se_isync", C(1), C_MASK, PPCVLE, 0, {}}, | ||
6993 | {"se_sc", C(2), C_MASK, PPCVLE, 0, {}}, | ||
6994 | {"se_blr", C_LK(2,0), C_LK_MASK, PPCVLE, 0, {}}, | ||
6995 | {"se_blrl", C_LK(2,1), C_LK_MASK, PPCVLE, 0, {}}, | ||
6996 | {"se_bctr", C_LK(3,0), C_LK_MASK, PPCVLE, 0, {}}, | ||
6997 | {"se_bctrl", C_LK(3,1), C_LK_MASK, PPCVLE, 0, {}}, | ||
6998 | {"se_rfi", C(8), C_MASK, PPCVLE, 0, {}}, | ||
6999 | {"se_rfci", C(9), C_MASK, PPCVLE, 0, {}}, | ||
7000 | {"se_rfdi", C(10), C_MASK, PPCVLE, 0, {}}, | ||
7001 | {"se_rfmci", C(11), C_MASK, PPCRFMCI|PPCVLE, 0, {}}, | ||
7002 | {"se_not", SE_R(0,2), SE_R_MASK, PPCVLE, 0, {RX}}, | ||
7003 | {"se_neg", SE_R(0,3), SE_R_MASK, PPCVLE, 0, {RX}}, | ||
7004 | {"se_mflr", SE_R(0,8), SE_R_MASK, PPCVLE, 0, {RX}}, | ||
7005 | {"se_mtlr", SE_R(0,9), SE_R_MASK, PPCVLE, 0, {RX}}, | ||
7006 | {"se_mfctr", SE_R(0,10), SE_R_MASK, PPCVLE, 0, {RX}}, | ||
7007 | {"se_mtctr", SE_R(0,11), SE_R_MASK, PPCVLE, 0, {RX}}, | ||
7008 | {"se_extzb", SE_R(0,12), SE_R_MASK, PPCVLE, 0, {RX}}, | ||
7009 | {"se_extsb", SE_R(0,13), SE_R_MASK, PPCVLE, 0, {RX}}, | ||
7010 | {"se_extzh", SE_R(0,14), SE_R_MASK, PPCVLE, 0, {RX}}, | ||
7011 | {"se_extsh", SE_R(0,15), SE_R_MASK, PPCVLE, 0, {RX}}, | ||
7012 | {"se_mr", SE_RR(0,1), SE_RR_MASK, PPCVLE, 0, {RX, RY}}, | ||
7013 | {"se_mtar", SE_RR(0,2), SE_RR_MASK, PPCVLE, 0, {ARX, RY}}, | ||
7014 | {"se_mfar", SE_RR(0,3), SE_RR_MASK, PPCVLE, 0, {RX, ARY}}, | ||
7015 | {"se_add", SE_RR(1,0), SE_RR_MASK, PPCVLE, 0, {RX, RY}}, | ||
7016 | {"se_mullw", SE_RR(1,1), SE_RR_MASK, PPCVLE, 0, {RX, RY}}, | ||
7017 | {"se_sub", SE_RR(1,2), SE_RR_MASK, PPCVLE, 0, {RX, RY}}, | ||
7018 | {"se_subf", SE_RR(1,3), SE_RR_MASK, PPCVLE, 0, {RX, RY}}, | ||
7019 | {"se_cmp", SE_RR(3,0), SE_RR_MASK, PPCVLE, 0, {RX, RY}}, | ||
7020 | {"se_cmpl", SE_RR(3,1), SE_RR_MASK, PPCVLE, 0, {RX, RY}}, | ||
7021 | {"se_cmph", SE_RR(3,2), SE_RR_MASK, PPCVLE, 0, {RX, RY}}, | ||
7022 | {"se_cmphl", SE_RR(3,3), SE_RR_MASK, PPCVLE, 0, {RX, RY}}, | ||
7023 | |||
7024 | {"e_cmpi", SCI8BF(6,0,21), SCI8BF_MASK, PPCVLE, 0, {CRD32, RA, SCLSCI8}}, | ||
7025 | {"e_cmpwi", SCI8BF(6,0,21), SCI8BF_MASK, PPCVLE, 0, {CRD32, RA, SCLSCI8}}, | ||
7026 | {"e_cmpli", SCI8BF(6,1,21), SCI8BF_MASK, PPCVLE, 0, {CRD32, RA, SCLSCI8}}, | ||
7027 | {"e_cmplwi", SCI8BF(6,1,21), SCI8BF_MASK, PPCVLE, 0, {CRD32, RA, SCLSCI8}}, | ||
7028 | {"e_addi", SCI8(6,16), SCI8_MASK, PPCVLE, 0, {RT, RA, SCLSCI8}}, | ||
7029 | {"e_subi", SCI8(6,16), SCI8_MASK, PPCVLE, 0, {RT, RA, SCLSCI8N}}, | ||
7030 | {"e_addi.", SCI8(6,17), SCI8_MASK, PPCVLE, 0, {RT, RA, SCLSCI8}}, | ||
7031 | {"e_addic", SCI8(6,18), SCI8_MASK, PPCVLE, 0, {RT, RA, SCLSCI8}}, | ||
7032 | {"e_subic", SCI8(6,18), SCI8_MASK, PPCVLE, 0, {RT, RA, SCLSCI8N}}, | ||
7033 | {"e_addic.", SCI8(6,19), SCI8_MASK, PPCVLE, 0, {RT, RA, SCLSCI8}}, | ||
7034 | {"e_subic.", SCI8(6,19), SCI8_MASK, PPCVLE, 0, {RT, RA, SCLSCI8N}}, | ||
7035 | {"e_mulli", SCI8(6,20), SCI8_MASK, PPCVLE, 0, {RT, RA, SCLSCI8}}, | ||
7036 | {"e_subfic", SCI8(6,22), SCI8_MASK, PPCVLE, 0, {RT, RA, SCLSCI8}}, | ||
7037 | {"e_subfic.", SCI8(6,23), SCI8_MASK, PPCVLE, 0, {RT, RA, SCLSCI8}}, | ||
7038 | {"e_andi", SCI8(6,24), SCI8_MASK, PPCVLE, 0, {RA, RS, SCLSCI8}}, | ||
7039 | {"e_andi.", SCI8(6,25), SCI8_MASK, PPCVLE, 0, {RA, RS, SCLSCI8}}, | ||
7040 | {"e_nop", SCI8(6,26), 0xffffffff, PPCVLE, 0, {0}}, | ||
7041 | {"e_ori", SCI8(6,26), SCI8_MASK, PPCVLE, 0, {RA, RS, SCLSCI8}}, | ||
7042 | {"e_ori.", SCI8(6,27), SCI8_MASK, PPCVLE, 0, {RA, RS, SCLSCI8}}, | ||
7043 | {"e_xori", SCI8(6,28), SCI8_MASK, PPCVLE, 0, {RA, RS, SCLSCI8}}, | ||
7044 | {"e_xori.", SCI8(6,29), SCI8_MASK, PPCVLE, 0, {RA, RS, SCLSCI8}}, | ||
7045 | {"e_lbzu", OPVUP(6,0), OPVUP_MASK, PPCVLE, 0, {RT, D8, RA0}}, | ||
7046 | {"e_lhau", OPVUP(6,3), OPVUP_MASK, PPCVLE, 0, {RT, D8, RA0}}, | ||
7047 | {"e_lhzu", OPVUP(6,1), OPVUP_MASK, PPCVLE, 0, {RT, D8, RA0}}, | ||
7048 | {"e_lmw", OPVUP(6,8), OPVUP_MASK, PPCVLE, 0, {RT, D8, RA0}}, | ||
7049 | {"e_lwzu", OPVUP(6,2), OPVUP_MASK, PPCVLE, 0, {RT, D8, RA0}}, | ||
7050 | {"e_stbu", OPVUP(6,4), OPVUP_MASK, PPCVLE, 0, {RT, D8, RA0}}, | ||
7051 | {"e_sthu", OPVUP(6,5), OPVUP_MASK, PPCVLE, 0, {RT, D8, RA0}}, | ||
7052 | {"e_stwu", OPVUP(6,6), OPVUP_MASK, PPCVLE, 0, {RT, D8, RA0}}, | ||
7053 | {"e_stmw", OPVUP(6,9), OPVUP_MASK, PPCVLE, 0, {RT, D8, RA0}}, | ||
7054 | {"e_ldmvgprw", OPVUPRT(6,16,0),OPVUPRT_MASK, PPCVLE, 0, {D8, RA0}}, | ||
7055 | {"e_stmvgprw", OPVUPRT(6,17,0),OPVUPRT_MASK, PPCVLE, 0, {D8, RA0}}, | ||
7056 | {"e_ldmvsprw", OPVUPRT(6,16,1),OPVUPRT_MASK, PPCVLE, 0, {D8, RA0}}, | ||
7057 | {"e_stmvsprw", OPVUPRT(6,17,1),OPVUPRT_MASK, PPCVLE, 0, {D8, RA0}}, | ||
7058 | {"e_ldmvsrrw", OPVUPRT(6,16,4),OPVUPRT_MASK, PPCVLE, 0, {D8, RA0}}, | ||
7059 | {"e_stmvsrrw", OPVUPRT(6,17,4),OPVUPRT_MASK, PPCVLE, 0, {D8, RA0}}, | ||
7060 | {"e_ldmvcsrrw", OPVUPRT(6,16,5),OPVUPRT_MASK, PPCVLE, 0, {D8, RA0}}, | ||
7061 | {"e_stmvcsrrw", OPVUPRT(6,17,5),OPVUPRT_MASK, PPCVLE, 0, {D8, RA0}}, | ||
7062 | {"e_ldmvdsrrw", OPVUPRT(6,16,6),OPVUPRT_MASK, PPCVLE, 0, {D8, RA0}}, | ||
7063 | {"e_stmvdsrrw", OPVUPRT(6,17,6),OPVUPRT_MASK, PPCVLE, 0, {D8, RA0}}, | ||
7064 | {"e_add16i", OP(7), OP_MASK, PPCVLE, 0, {RT, RA, SI}}, | ||
7065 | {"e_la", OP(7), OP_MASK, PPCVLE, 0, {RT, D, RA0}}, | ||
7066 | {"e_sub16i", OP(7), OP_MASK, PPCVLE, 0, {RT, RA, NSI}}, | ||
7067 | |||
7068 | {"se_addi", SE_IM5(8,0), SE_IM5_MASK, PPCVLE, 0, {RX, OIMM5}}, | ||
7069 | {"se_cmpli", SE_IM5(8,1), SE_IM5_MASK, PPCVLE, 0, {RX, OIMM5}}, | ||
7070 | {"se_subi", SE_IM5(9,0), SE_IM5_MASK, PPCVLE, 0, {RX, OIMM5}}, | ||
7071 | {"se_subi.", SE_IM5(9,1), SE_IM5_MASK, PPCVLE, 0, {RX, OIMM5}}, | ||
7072 | {"se_cmpi", SE_IM5(10,1), SE_IM5_MASK, PPCVLE, 0, {RX, UI5}}, | ||
7073 | {"se_bmaski", SE_IM5(11,0), SE_IM5_MASK, PPCVLE, 0, {RX, UI5}}, | ||
7074 | {"se_andi", SE_IM5(11,1), SE_IM5_MASK, PPCVLE, 0, {RX, UI5}}, | ||
7075 | |||
7076 | {"e_lbz", OP(12), OP_MASK, PPCVLE, 0, {RT, D, RA0}}, | ||
7077 | {"e_stb", OP(13), OP_MASK, PPCVLE, 0, {RT, D, RA0}}, | ||
7078 | {"e_lha", OP(14), OP_MASK, PPCVLE, 0, {RT, D, RA0}}, | ||
7079 | |||
7080 | {"se_srw", SE_RR(16,0), SE_RR_MASK, PPCVLE, 0, {RX, RY}}, | ||
7081 | {"se_sraw", SE_RR(16,1), SE_RR_MASK, PPCVLE, 0, {RX, RY}}, | ||
7082 | {"se_slw", SE_RR(16,2), SE_RR_MASK, PPCVLE, 0, {RX, RY}}, | ||
7083 | {"se_nop", SE_RR(17,0), 0xffff, PPCVLE, 0, {0}}, | ||
7084 | {"se_or", SE_RR(17,0), SE_RR_MASK, PPCVLE, 0, {RX, RY}}, | ||
7085 | {"se_andc", SE_RR(17,1), SE_RR_MASK, PPCVLE, 0, {RX, RY}}, | ||
7086 | {"se_and", SE_RR(17,2), SE_RR_MASK, PPCVLE, 0, {RX, RY}}, | ||
7087 | {"se_and.", SE_RR(17,3), SE_RR_MASK, PPCVLE, 0, {RX, RY}}, | ||
7088 | {"se_li", IM7(9), IM7_MASK, PPCVLE, 0, {RX, UI7}}, | ||
7089 | |||
7090 | {"e_lwz", OP(20), OP_MASK, PPCVLE, 0, {RT, D, RA0}}, | ||
7091 | {"e_stw", OP(21), OP_MASK, PPCVLE, 0, {RT, D, RA0}}, | ||
7092 | {"e_lhz", OP(22), OP_MASK, PPCVLE, 0, {RT, D, RA0}}, | ||
7093 | {"e_sth", OP(23), OP_MASK, PPCVLE, 0, {RT, D, RA0}}, | ||
7094 | |||
7095 | {"se_bclri", SE_IM5(24,0), SE_IM5_MASK, PPCVLE, 0, {RX, UI5}}, | ||
7096 | {"se_bgeni", SE_IM5(24,1), SE_IM5_MASK, PPCVLE, 0, {RX, UI5}}, | ||
7097 | {"se_bseti", SE_IM5(25,0), SE_IM5_MASK, PPCVLE, 0, {RX, UI5}}, | ||
7098 | {"se_btsti", SE_IM5(25,1), SE_IM5_MASK, PPCVLE, 0, {RX, UI5}}, | ||
7099 | {"se_srwi", SE_IM5(26,0), SE_IM5_MASK, PPCVLE, 0, {RX, UI5}}, | ||
7100 | {"se_srawi", SE_IM5(26,1), SE_IM5_MASK, PPCVLE, 0, {RX, UI5}}, | ||
7101 | {"se_slwi", SE_IM5(27,0), SE_IM5_MASK, PPCVLE, 0, {RX, UI5}}, | ||
7102 | |||
7103 | {"e_lis", I16L(28,28), I16L_MASK, PPCVLE, 0, {RD, VLEUIMML}}, | ||
7104 | {"e_and2is.", I16L(28,29), I16L_MASK, PPCVLE, 0, {RD, VLEUIMML}}, | ||
7105 | {"e_or2is", I16L(28,26), I16L_MASK, PPCVLE, 0, {RD, VLEUIMML}}, | ||
7106 | {"e_and2i.", I16L(28,25), I16L_MASK, PPCVLE, 0, {RD, VLEUIMML}}, | ||
7107 | {"e_or2i", I16L(28,24), I16L_MASK, PPCVLE, 0, {RD, VLEUIMML}}, | ||
7108 | {"e_cmphl16i", IA16(28,23), IA16_MASK, PPCVLE, 0, {RA, VLEUIMM}}, | ||
7109 | {"e_cmph16i", IA16(28,22), IA16_MASK, PPCVLE, 0, {RA, VLESIMM}}, | ||
7110 | {"e_cmpl16i", I16A(28,21), I16A_MASK, PPCVLE, 0, {RA, VLEUIMM}}, | ||
7111 | {"e_mull2i", I16A(28,20), I16A_MASK, PPCVLE, 0, {RA, VLESIMM}}, | ||
7112 | {"e_cmp16i", IA16(28,19), IA16_MASK, PPCVLE, 0, {RA, VLESIMM}}, | ||
7113 | {"e_sub2is", I16A(28,18), I16A_MASK, PPCVLE, 0, {RA, VLENSIMM}}, | ||
7114 | {"e_add2is", I16A(28,18), I16A_MASK, PPCVLE, 0, {RA, VLESIMM}}, | ||
7115 | {"e_sub2i.", I16A(28,17), I16A_MASK, PPCVLE, 0, {RA, VLENSIMM}}, | ||
7116 | {"e_add2i.", I16A(28,17), I16A_MASK, PPCVLE, 0, {RA, VLESIMM}}, | ||
7117 | {"e_li", LI20(28,0), LI20_MASK, PPCVLE, 0, {RT, IMM20}}, | ||
7118 | {"e_rlwimi", M(29,0), M_MASK, PPCVLE, 0, {RA, RS, SH, MB, ME}}, | ||
7119 | {"e_rlwinm", M(29,1), M_MASK, PPCVLE, 0, {RA, RT, SH, MBE, ME}}, | ||
7120 | {"e_b", BD24(30,0,0), BD24_MASK, PPCVLE, 0, {B24}}, | ||
7121 | {"e_bl", BD24(30,0,1), BD24_MASK, PPCVLE, 0, {B24}}, | ||
7122 | {"e_bdnz", EBD15(30,8,BO32DNZ,0), EBD15_MASK, PPCVLE, 0, {B15}}, | ||
7123 | {"e_bdnzl", EBD15(30,8,BO32DNZ,1), EBD15_MASK, PPCVLE, 0, {B15}}, | ||
7124 | {"e_bdz", EBD15(30,8,BO32DZ,0), EBD15_MASK, PPCVLE, 0, {B15}}, | ||
7125 | {"e_bdzl", EBD15(30,8,BO32DZ,1), EBD15_MASK, PPCVLE, 0, {B15}}, | ||
7126 | {"e_bge", EBD15BI(30,8,BO32F,CBLT,0), EBD15BI_MASK, PPCVLE, 0, {CRS,B15}}, | ||
7127 | {"e_bgel", EBD15BI(30,8,BO32F,CBLT,1), EBD15BI_MASK, PPCVLE, 0, {CRS,B15}}, | ||
7128 | {"e_bnl", EBD15BI(30,8,BO32F,CBLT,0), EBD15BI_MASK, PPCVLE, 0, {CRS,B15}}, | ||
7129 | {"e_bnll", EBD15BI(30,8,BO32F,CBLT,1), EBD15BI_MASK, PPCVLE, 0, {CRS,B15}}, | ||
7130 | {"e_blt", EBD15BI(30,8,BO32T,CBLT,0), EBD15BI_MASK, PPCVLE, 0, {CRS,B15}}, | ||
7131 | {"e_bltl", EBD15BI(30,8,BO32T,CBLT,1), EBD15BI_MASK, PPCVLE, 0, {CRS,B15}}, | ||
7132 | {"e_bgt", EBD15BI(30,8,BO32T,CBGT,0), EBD15BI_MASK, PPCVLE, 0, {CRS,B15}}, | ||
7133 | {"e_bgtl", EBD15BI(30,8,BO32T,CBGT,1), EBD15BI_MASK, PPCVLE, 0, {CRS,B15}}, | ||
7134 | {"e_ble", EBD15BI(30,8,BO32F,CBGT,0), EBD15BI_MASK, PPCVLE, 0, {CRS,B15}}, | ||
7135 | {"e_blel", EBD15BI(30,8,BO32F,CBGT,1), EBD15BI_MASK, PPCVLE, 0, {CRS,B15}}, | ||
7136 | {"e_bng", EBD15BI(30,8,BO32F,CBGT,0), EBD15BI_MASK, PPCVLE, 0, {CRS,B15}}, | ||
7137 | {"e_bngl", EBD15BI(30,8,BO32F,CBGT,1), EBD15BI_MASK, PPCVLE, 0, {CRS,B15}}, | ||
7138 | {"e_bne", EBD15BI(30,8,BO32F,CBEQ,0), EBD15BI_MASK, PPCVLE, 0, {CRS,B15}}, | ||
7139 | {"e_bnel", EBD15BI(30,8,BO32F,CBEQ,1), EBD15BI_MASK, PPCVLE, 0, {CRS,B15}}, | ||
7140 | {"e_beq", EBD15BI(30,8,BO32T,CBEQ,0), EBD15BI_MASK, PPCVLE, 0, {CRS,B15}}, | ||
7141 | {"e_beql", EBD15BI(30,8,BO32T,CBEQ,1), EBD15BI_MASK, PPCVLE, 0, {CRS,B15}}, | ||
7142 | {"e_bso", EBD15BI(30,8,BO32T,CBSO,0), EBD15BI_MASK, PPCVLE, 0, {CRS,B15}}, | ||
7143 | {"e_bsol", EBD15BI(30,8,BO32T,CBSO,1), EBD15BI_MASK, PPCVLE, 0, {CRS,B15}}, | ||
7144 | {"e_bun", EBD15BI(30,8,BO32T,CBSO,0), EBD15BI_MASK, PPCVLE, 0, {CRS,B15}}, | ||
7145 | {"e_bunl", EBD15BI(30,8,BO32T,CBSO,1), EBD15BI_MASK, PPCVLE, 0, {CRS,B15}}, | ||
7146 | {"e_bns", EBD15BI(30,8,BO32F,CBSO,0), EBD15BI_MASK, PPCVLE, 0, {CRS,B15}}, | ||
7147 | {"e_bnsl", EBD15BI(30,8,BO32F,CBSO,1), EBD15BI_MASK, PPCVLE, 0, {CRS,B15}}, | ||
7148 | {"e_bnu", EBD15BI(30,8,BO32F,CBSO,0), EBD15BI_MASK, PPCVLE, 0, {CRS,B15}}, | ||
7149 | {"e_bnul", EBD15BI(30,8,BO32F,CBSO,1), EBD15BI_MASK, PPCVLE, 0, {CRS,B15}}, | ||
7150 | {"e_bc", BD15(30,8,0), BD15_MASK, PPCVLE, 0, {BO32, BI32, B15}}, | ||
7151 | {"e_bcl", BD15(30,8,1), BD15_MASK, PPCVLE, 0, {BO32, BI32, B15}}, | ||
7152 | |||
7153 | {"e_bf", EBD15(30,8,BO32F,0), EBD15_MASK, PPCVLE, 0, {BI32,B15}}, | ||
7154 | {"e_bfl", EBD15(30,8,BO32F,1), EBD15_MASK, PPCVLE, 0, {BI32,B15}}, | ||
7155 | {"e_bt", EBD15(30,8,BO32T,0), EBD15_MASK, PPCVLE, 0, {BI32,B15}}, | ||
7156 | {"e_btl", EBD15(30,8,BO32T,1), EBD15_MASK, PPCVLE, 0, {BI32,B15}}, | ||
7157 | |||
7158 | {"e_cmph", X(31,14), X_MASK, PPCVLE, 0, {CRD, RA, RB}}, | ||
7159 | {"e_cmphl", X(31,46), X_MASK, PPCVLE, 0, {CRD, RA, RB}}, | ||
7160 | {"e_crandc", XL(31,129), XL_MASK, PPCVLE, 0, {BT, BA, BB}}, | ||
7161 | {"e_crnand", XL(31,225), XL_MASK, PPCVLE, 0, {BT, BA, BB}}, | ||
7162 | {"e_crnot", XL(31,33), XL_MASK, PPCVLE, 0, {BT, BA, BBA}}, | ||
7163 | {"e_crnor", XL(31,33), XL_MASK, PPCVLE, 0, {BT, BA, BB}}, | ||
7164 | {"e_crclr", XL(31,193), XL_MASK, PPCVLE, 0, {BT, BAT, BBA}}, | ||
7165 | {"e_crxor", XL(31,193), XL_MASK, PPCVLE, 0, {BT, BA, BB}}, | ||
7166 | {"e_mcrf", XL(31,16), XL_MASK, PPCVLE, 0, {CRD, CR}}, | ||
7167 | {"e_slwi", EX(31,112), EX_MASK, PPCVLE, 0, {RA, RS, SH}}, | ||
7168 | {"e_slwi.", EX(31,113), EX_MASK, PPCVLE, 0, {RA, RS, SH}}, | ||
7169 | |||
7170 | {"e_crand", XL(31,257), XL_MASK, PPCVLE, 0, {BT, BA, BB}}, | ||
7171 | |||
7172 | {"e_rlw", EX(31,560), EX_MASK, PPCVLE, 0, {RA, RS, RB}}, | ||
7173 | {"e_rlw.", EX(31,561), EX_MASK, PPCVLE, 0, {RA, RS, RB}}, | ||
7174 | |||
7175 | {"e_crset", XL(31,289), XL_MASK, PPCVLE, 0, {BT, BAT, BBA}}, | ||
7176 | {"e_creqv", XL(31,289), XL_MASK, PPCVLE, 0, {BT, BA, BB}}, | ||
7177 | |||
7178 | {"e_rlwi", EX(31,624), EX_MASK, PPCVLE, 0, {RA, RS, SH}}, | ||
7179 | {"e_rlwi.", EX(31,625), EX_MASK, PPCVLE, 0, {RA, RS, SH}}, | ||
7180 | |||
7181 | {"e_crorc", XL(31,417), XL_MASK, PPCVLE, 0, {BT, BA, BB}}, | ||
7182 | |||
7183 | {"e_crmove", XL(31,449), XL_MASK, PPCVLE, 0, {BT, BA, BBA}}, | ||
7184 | {"e_cror", XL(31,449), XL_MASK, PPCVLE, 0, {BT, BA, BB}}, | ||
7185 | |||
7186 | {"mtmas1", XSPR(31,467,625), XSPR_MASK, PPCVLE, 0, {RS}}, | ||
7187 | |||
7188 | {"e_srwi", EX(31,1136), EX_MASK, PPCVLE, 0, {RA, RS, SH}}, | ||
7189 | {"e_srwi.", EX(31,1137), EX_MASK, PPCVLE, 0, {RA, RS, SH}}, | ||
7190 | |||
7191 | {"se_lbz", SD4(8), SD4_MASK, PPCVLE, 0, {RZ, SE_SD, RX}}, | ||
7192 | |||
7193 | {"se_stb", SD4(9), SD4_MASK, PPCVLE, 0, {RZ, SE_SD, RX}}, | ||
7194 | |||
7195 | {"se_lhz", SD4(10), SD4_MASK, PPCVLE, 0, {RZ, SE_SDH, RX}}, | ||
7196 | |||
7197 | {"se_sth", SD4(11), SD4_MASK, PPCVLE, 0, {RZ, SE_SDH, RX}}, | ||
7198 | |||
7199 | {"se_lwz", SD4(12), SD4_MASK, PPCVLE, 0, {RZ, SE_SDW, RX}}, | ||
7200 | |||
7201 | {"se_stw", SD4(13), SD4_MASK, PPCVLE, 0, {RZ, SE_SDW, RX}}, | ||
7202 | |||
7203 | {"se_bge", EBD8IO(28,0,0), EBD8IO3_MASK, PPCVLE, 0, {B8}}, | ||
7204 | {"se_bnl", EBD8IO(28,0,0), EBD8IO3_MASK, PPCVLE, 0, {B8}}, | ||
7205 | {"se_ble", EBD8IO(28,0,1), EBD8IO3_MASK, PPCVLE, 0, {B8}}, | ||
7206 | {"se_bng", EBD8IO(28,0,1), EBD8IO3_MASK, PPCVLE, 0, {B8}}, | ||
7207 | {"se_bne", EBD8IO(28,0,2), EBD8IO3_MASK, PPCVLE, 0, {B8}}, | ||
7208 | {"se_bns", EBD8IO(28,0,3), EBD8IO3_MASK, PPCVLE, 0, {B8}}, | ||
7209 | {"se_bnu", EBD8IO(28,0,3), EBD8IO3_MASK, PPCVLE, 0, {B8}}, | ||
7210 | {"se_bf", EBD8IO(28,0,0), EBD8IO2_MASK, PPCVLE, 0, {BI16, B8}}, | ||
7211 | {"se_blt", EBD8IO(28,1,0), EBD8IO3_MASK, PPCVLE, 0, {B8}}, | ||
7212 | {"se_bgt", EBD8IO(28,1,1), EBD8IO3_MASK, PPCVLE, 0, {B8}}, | ||
7213 | {"se_beq", EBD8IO(28,1,2), EBD8IO3_MASK, PPCVLE, 0, {B8}}, | ||
7214 | {"se_bso", EBD8IO(28,1,3), EBD8IO3_MASK, PPCVLE, 0, {B8}}, | ||
7215 | {"se_bun", EBD8IO(28,1,3), EBD8IO3_MASK, PPCVLE, 0, {B8}}, | ||
7216 | {"se_bt", EBD8IO(28,1,0), EBD8IO2_MASK, PPCVLE, 0, {BI16, B8}}, | ||
7217 | {"se_bc", BD8IO(28), BD8IO_MASK, PPCVLE, 0, {BO16, BI16, B8}}, | ||
7218 | {"se_b", BD8(58,0,0), BD8_MASK, PPCVLE, 0, {B8}}, | ||
7219 | {"se_bl", BD8(58,0,1), BD8_MASK, PPCVLE, 0, {B8}}, | ||
4935 | }; | 7220 | }; |
4936 | 7221 | ||
4937 | const int powerpc_num_opcodes = ARRAY_SIZE(powerpc_opcodes); | 7222 | const int vle_num_opcodes = |
7223 | sizeof (vle_opcodes) / sizeof (vle_opcodes[0]); | ||
4938 | 7224 | ||
4939 | /* The macro table. This is only used by the assembler. */ | 7225 | /* The macro table. This is only used by the assembler. */ |
4940 | 7226 | ||
@@ -4949,45 +7235,58 @@ const int powerpc_num_opcodes = ARRAY_SIZE(powerpc_opcodes); | |||
4949 | support extracting the whole word (32 bits in this case). */ | 7235 | support extracting the whole word (32 bits in this case). */ |
4950 | 7236 | ||
4951 | const struct powerpc_macro powerpc_macros[] = { | 7237 | const struct powerpc_macro powerpc_macros[] = { |
4952 | { "extldi", 4, PPC64, "rldicr %0,%1,%3,(%2)-1" }, | 7238 | {"extldi", 4, PPC64, "rldicr %0,%1,%3,(%2)-1"}, |
4953 | { "extldi.", 4, PPC64, "rldicr. %0,%1,%3,(%2)-1" }, | 7239 | {"extldi.", 4, PPC64, "rldicr. %0,%1,%3,(%2)-1"}, |
4954 | { "extrdi", 4, PPC64, "rldicl %0,%1,(%2)+(%3),64-(%2)" }, | 7240 | {"extrdi", 4, PPC64, "rldicl %0,%1,((%2)+(%3))&((%2)+(%3)<>64),64-(%2)"}, |
4955 | { "extrdi.", 4, PPC64, "rldicl. %0,%1,(%2)+(%3),64-(%2)" }, | 7241 | {"extrdi.", 4, PPC64, "rldicl. %0,%1,((%2)+(%3))&((%2)+(%3)<>64),64-(%2)"}, |
4956 | { "insrdi", 4, PPC64, "rldimi %0,%1,64-((%2)+(%3)),%3" }, | 7242 | {"insrdi", 4, PPC64, "rldimi %0,%1,64-((%2)+(%3)),%3"}, |
4957 | { "insrdi.", 4, PPC64, "rldimi. %0,%1,64-((%2)+(%3)),%3" }, | 7243 | {"insrdi.", 4, PPC64, "rldimi. %0,%1,64-((%2)+(%3)),%3"}, |
4958 | { "rotrdi", 3, PPC64, "rldicl %0,%1,(-(%2)!63)&((%2)|63),0" }, | 7244 | {"rotrdi", 3, PPC64, "rldicl %0,%1,(-(%2)!63)&((%2)|63),0"}, |
4959 | { "rotrdi.", 3, PPC64, "rldicl. %0,%1,(-(%2)!63)&((%2)|63),0" }, | 7245 | {"rotrdi.", 3, PPC64, "rldicl. %0,%1,(-(%2)!63)&((%2)|63),0"}, |
4960 | { "sldi", 3, PPC64, "rldicr %0,%1,%2,63-(%2)" }, | 7246 | {"sldi", 3, PPC64, "rldicr %0,%1,%2,63-(%2)"}, |
4961 | { "sldi.", 3, PPC64, "rldicr. %0,%1,%2,63-(%2)" }, | 7247 | {"sldi.", 3, PPC64, "rldicr. %0,%1,%2,63-(%2)"}, |
4962 | { "srdi", 3, PPC64, "rldicl %0,%1,(-(%2)!63)&((%2)|63),%2" }, | 7248 | {"srdi", 3, PPC64, "rldicl %0,%1,(-(%2)!63)&((%2)|63),%2"}, |
4963 | { "srdi.", 3, PPC64, "rldicl. %0,%1,(-(%2)!63)&((%2)|63),%2" }, | 7249 | {"srdi.", 3, PPC64, "rldicl. %0,%1,(-(%2)!63)&((%2)|63),%2"}, |
4964 | { "clrrdi", 3, PPC64, "rldicr %0,%1,0,63-(%2)" }, | 7250 | {"clrrdi", 3, PPC64, "rldicr %0,%1,0,63-(%2)"}, |
4965 | { "clrrdi.", 3, PPC64, "rldicr. %0,%1,0,63-(%2)" }, | 7251 | {"clrrdi.", 3, PPC64, "rldicr. %0,%1,0,63-(%2)"}, |
4966 | { "clrlsldi",4, PPC64, "rldic %0,%1,%3,(%2)-(%3)" }, | 7252 | {"clrlsldi", 4, PPC64, "rldic %0,%1,%3,(%2)-(%3)"}, |
4967 | { "clrlsldi.",4, PPC64, "rldic. %0,%1,%3,(%2)-(%3)" }, | 7253 | {"clrlsldi.",4, PPC64, "rldic. %0,%1,%3,(%2)-(%3)"}, |
4968 | 7254 | ||
4969 | { "extlwi", 4, PPCCOM, "rlwinm %0,%1,%3,0,(%2)-1" }, | 7255 | {"extlwi", 4, PPCCOM, "rlwinm %0,%1,%3,0,(%2)-1"}, |
4970 | { "extlwi.", 4, PPCCOM, "rlwinm. %0,%1,%3,0,(%2)-1" }, | 7256 | {"extlwi.", 4, PPCCOM, "rlwinm. %0,%1,%3,0,(%2)-1"}, |
4971 | { "extrwi", 4, PPCCOM, "rlwinm %0,%1,((%2)+(%3))&((%2)+(%3)<>32),32-(%2),31" }, | 7257 | {"extrwi", 4, PPCCOM, "rlwinm %0,%1,((%2)+(%3))&((%2)+(%3)<>32),32-(%2),31"}, |
4972 | { "extrwi.", 4, PPCCOM, "rlwinm. %0,%1,((%2)+(%3))&((%2)+(%3)<>32),32-(%2),31" }, | 7258 | {"extrwi.", 4, PPCCOM, "rlwinm. %0,%1,((%2)+(%3))&((%2)+(%3)<>32),32-(%2),31"}, |
4973 | { "inslwi", 4, PPCCOM, "rlwimi %0,%1,(-(%3)!31)&((%3)|31),%3,(%2)+(%3)-1" }, | 7259 | {"inslwi", 4, PPCCOM, "rlwimi %0,%1,(-(%3)!31)&((%3)|31),%3,(%2)+(%3)-1"}, |
4974 | { "inslwi.", 4, PPCCOM, "rlwimi. %0,%1,(-(%3)!31)&((%3)|31),%3,(%2)+(%3)-1"}, | 7260 | {"inslwi.", 4, PPCCOM, "rlwimi. %0,%1,(-(%3)!31)&((%3)|31),%3,(%2)+(%3)-1"}, |
4975 | { "insrwi", 4, PPCCOM, "rlwimi %0,%1,32-((%2)+(%3)),%3,(%2)+(%3)-1" }, | 7261 | {"insrwi", 4, PPCCOM, "rlwimi %0,%1,32-((%2)+(%3)),%3,(%2)+(%3)-1"}, |
4976 | { "insrwi.", 4, PPCCOM, "rlwimi. %0,%1,32-((%2)+(%3)),%3,(%2)+(%3)-1"}, | 7262 | {"insrwi.", 4, PPCCOM, "rlwimi. %0,%1,32-((%2)+(%3)),%3,(%2)+(%3)-1"}, |
4977 | { "rotrwi", 3, PPCCOM, "rlwinm %0,%1,(-(%2)!31)&((%2)|31),0,31" }, | 7263 | {"rotrwi", 3, PPCCOM, "rlwinm %0,%1,(-(%2)!31)&((%2)|31),0,31"}, |
4978 | { "rotrwi.", 3, PPCCOM, "rlwinm. %0,%1,(-(%2)!31)&((%2)|31),0,31" }, | 7264 | {"rotrwi.", 3, PPCCOM, "rlwinm. %0,%1,(-(%2)!31)&((%2)|31),0,31"}, |
4979 | { "slwi", 3, PPCCOM, "rlwinm %0,%1,%2,0,31-(%2)" }, | 7265 | {"slwi", 3, PPCCOM, "rlwinm %0,%1,%2,0,31-(%2)"}, |
4980 | { "sli", 3, PWRCOM, "rlinm %0,%1,%2,0,31-(%2)" }, | 7266 | {"sli", 3, PWRCOM, "rlinm %0,%1,%2,0,31-(%2)"}, |
4981 | { "slwi.", 3, PPCCOM, "rlwinm. %0,%1,%2,0,31-(%2)" }, | 7267 | {"slwi.", 3, PPCCOM, "rlwinm. %0,%1,%2,0,31-(%2)"}, |
4982 | { "sli.", 3, PWRCOM, "rlinm. %0,%1,%2,0,31-(%2)" }, | 7268 | {"sli.", 3, PWRCOM, "rlinm. %0,%1,%2,0,31-(%2)"}, |
4983 | { "srwi", 3, PPCCOM, "rlwinm %0,%1,(-(%2)!31)&((%2)|31),%2,31" }, | 7269 | {"srwi", 3, PPCCOM, "rlwinm %0,%1,(-(%2)!31)&((%2)|31),%2,31"}, |
4984 | { "sri", 3, PWRCOM, "rlinm %0,%1,(-(%2)!31)&((%2)|31),%2,31" }, | 7270 | {"sri", 3, PWRCOM, "rlinm %0,%1,(-(%2)!31)&((%2)|31),%2,31"}, |
4985 | { "srwi.", 3, PPCCOM, "rlwinm. %0,%1,(-(%2)!31)&((%2)|31),%2,31" }, | 7271 | {"srwi.", 3, PPCCOM, "rlwinm. %0,%1,(-(%2)!31)&((%2)|31),%2,31"}, |
4986 | { "sri.", 3, PWRCOM, "rlinm. %0,%1,(-(%2)!31)&((%2)|31),%2,31" }, | 7272 | {"sri.", 3, PWRCOM, "rlinm. %0,%1,(-(%2)!31)&((%2)|31),%2,31"}, |
4987 | { "clrrwi", 3, PPCCOM, "rlwinm %0,%1,0,0,31-(%2)" }, | 7273 | {"clrrwi", 3, PPCCOM, "rlwinm %0,%1,0,0,31-(%2)"}, |
4988 | { "clrrwi.", 3, PPCCOM, "rlwinm. %0,%1,0,0,31-(%2)" }, | 7274 | {"clrrwi.", 3, PPCCOM, "rlwinm. %0,%1,0,0,31-(%2)"}, |
4989 | { "clrlslwi",4, PPCCOM, "rlwinm %0,%1,%3,(%2)-(%3),31-(%3)" }, | 7275 | {"clrlslwi", 4, PPCCOM, "rlwinm %0,%1,%3,(%2)-(%3),31-(%3)"}, |
4990 | { "clrlslwi.",4, PPCCOM, "rlwinm. %0,%1,%3,(%2)-(%3),31-(%3)" }, | 7276 | {"clrlslwi.",4, PPCCOM, "rlwinm. %0,%1,%3,(%2)-(%3),31-(%3)"}, |
7277 | |||
7278 | {"e_extlwi", 4, PPCVLE, "e_rlwinm %0,%1,%3,0,(%2)-1"}, | ||
7279 | {"e_extrwi", 4, PPCVLE, "e_rlwinm %0,%1,((%2)+(%3))&((%2)+(%3)<>32),32-(%2),31"}, | ||
7280 | {"e_inslwi", 4, PPCVLE, "e_rlwimi %0,%1,(-(%3)!31)&((%3)|31),%3,(%2)+(%3)-1"}, | ||
7281 | {"e_insrwi", 4, PPCVLE, "e_rlwimi %0,%1,32-((%2)+(%3)),%3,(%2)+(%3)-1"}, | ||
7282 | {"e_rotlwi", 3, PPCVLE, "e_rlwinm %0,%1,%2,0,31"}, | ||
7283 | {"e_rotrwi", 3, PPCVLE, "e_rlwinm %0,%1,(-(%2)!31)&((%2)|31),0,31"}, | ||
7284 | {"e_slwi", 3, PPCVLE, "e_rlwinm %0,%1,%2,0,31-(%2)"}, | ||
7285 | {"e_srwi", 3, PPCVLE, "e_rlwinm %0,%1,(-(%2)!31)&((%2)|31),%2,31"}, | ||
7286 | {"e_clrlwi", 3, PPCVLE, "e_rlwinm %0,%1,0,%2,31"}, | ||
7287 | {"e_clrrwi", 3, PPCVLE, "e_rlwinm %0,%1,0,0,31-(%2)"}, | ||
7288 | {"e_clrlslwi",4, PPCVLE, "e_rlwinm %0,%1,%3,(%2)-(%3),31-(%3)"}, | ||
4991 | }; | 7289 | }; |
4992 | 7290 | ||
4993 | const int powerpc_num_macros = ARRAY_SIZE(powerpc_macros); | 7291 | const int powerpc_num_macros = |
7292 | sizeof (powerpc_macros) / sizeof (powerpc_macros[0]); | ||
diff --git a/arch/powerpc/xmon/ppc.h b/arch/powerpc/xmon/ppc.h index 110df96354b4..d00f33dcf192 100644 --- a/arch/powerpc/xmon/ppc.h +++ b/arch/powerpc/xmon/ppc.h | |||
@@ -1,6 +1,5 @@ | |||
1 | /* ppc.h -- Header file for PowerPC opcode table | 1 | /* ppc.h -- Header file for PowerPC opcode table |
2 | Copyright 1994, 1995, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 | 2 | Copyright (C) 1994-2016 Free Software Foundation, Inc. |
3 | Free Software Foundation, Inc. | ||
4 | Written by Ian Lance Taylor, Cygnus Support | 3 | Written by Ian Lance Taylor, Cygnus Support |
5 | 4 | ||
6 | This file is part of GDB, GAS, and the GNU binutils. | 5 | This file is part of GDB, GAS, and the GNU binutils. |
@@ -22,6 +21,12 @@ Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, US | |||
22 | #ifndef PPC_H | 21 | #ifndef PPC_H |
23 | #define PPC_H | 22 | #define PPC_H |
24 | 23 | ||
24 | #ifdef __cplusplus | ||
25 | extern "C" { | ||
26 | #endif | ||
27 | |||
28 | typedef uint64_t ppc_cpu_t; | ||
29 | |||
25 | /* The opcode table is an array of struct powerpc_opcode. */ | 30 | /* The opcode table is an array of struct powerpc_opcode. */ |
26 | 31 | ||
27 | struct powerpc_opcode | 32 | struct powerpc_opcode |
@@ -42,7 +47,12 @@ struct powerpc_opcode | |||
42 | /* One bit flags for the opcode. These are used to indicate which | 47 | /* One bit flags for the opcode. These are used to indicate which |
43 | specific processors support the instructions. The defined values | 48 | specific processors support the instructions. The defined values |
44 | are listed below. */ | 49 | are listed below. */ |
45 | unsigned long flags; | 50 | ppc_cpu_t flags; |
51 | |||
52 | /* One bit flags for the opcode. These are used to indicate which | ||
53 | specific processors no longer support the instructions. The defined | ||
54 | values are listed below. */ | ||
55 | ppc_cpu_t deprecated; | ||
46 | 56 | ||
47 | /* An array of operand codes. Each code is an index into the | 57 | /* An array of operand codes. Each code is an index into the |
48 | operand table. They appear in the order which the operands must | 58 | operand table. They appear in the order which the operands must |
@@ -55,6 +65,8 @@ struct powerpc_opcode | |||
55 | instructions. */ | 65 | instructions. */ |
56 | extern const struct powerpc_opcode powerpc_opcodes[]; | 66 | extern const struct powerpc_opcode powerpc_opcodes[]; |
57 | extern const int powerpc_num_opcodes; | 67 | extern const int powerpc_num_opcodes; |
68 | extern const struct powerpc_opcode vle_opcodes[]; | ||
69 | extern const int vle_num_opcodes; | ||
58 | 70 | ||
59 | /* Values defined for the flags field of a struct powerpc_opcode. */ | 71 | /* Values defined for the flags field of a struct powerpc_opcode. */ |
60 | 72 | ||
@@ -67,106 +79,178 @@ extern const int powerpc_num_opcodes; | |||
67 | /* Opcode is defined for the POWER2 (Rios 2) architecture. */ | 79 | /* Opcode is defined for the POWER2 (Rios 2) architecture. */ |
68 | #define PPC_OPCODE_POWER2 4 | 80 | #define PPC_OPCODE_POWER2 4 |
69 | 81 | ||
70 | /* Opcode is only defined on 32 bit architectures. */ | ||
71 | #define PPC_OPCODE_32 8 | ||
72 | |||
73 | /* Opcode is only defined on 64 bit architectures. */ | ||
74 | #define PPC_OPCODE_64 0x10 | ||
75 | |||
76 | /* Opcode is supported by the Motorola PowerPC 601 processor. The 601 | 82 | /* Opcode is supported by the Motorola PowerPC 601 processor. The 601 |
77 | is assumed to support all PowerPC (PPC_OPCODE_PPC) instructions, | 83 | is assumed to support all PowerPC (PPC_OPCODE_PPC) instructions, |
78 | but it also supports many additional POWER instructions. */ | 84 | but it also supports many additional POWER instructions. */ |
79 | #define PPC_OPCODE_601 0x20 | 85 | #define PPC_OPCODE_601 8 |
80 | 86 | ||
81 | /* Opcode is supported in both the Power and PowerPC architectures | 87 | /* Opcode is supported in both the Power and PowerPC architectures |
82 | (ie, compiler's -mcpu=common or assembler's -mcom). */ | 88 | (ie, compiler's -mcpu=common or assembler's -mcom). More than just |
83 | #define PPC_OPCODE_COMMON 0x40 | 89 | the intersection of PPC_OPCODE_PPC with the union of PPC_OPCODE_POWER |
90 | and PPC_OPCODE_POWER2 because many instructions changed mnemonics | ||
91 | between POWER and POWERPC. */ | ||
92 | #define PPC_OPCODE_COMMON 0x10 | ||
84 | 93 | ||
85 | /* Opcode is supported for any Power or PowerPC platform (this is | 94 | /* Opcode is supported for any Power or PowerPC platform (this is |
86 | for the assembler's -many option, and it eliminates duplicates). */ | 95 | for the assembler's -many option, and it eliminates duplicates). */ |
87 | #define PPC_OPCODE_ANY 0x80 | 96 | #define PPC_OPCODE_ANY 0x20 |
97 | |||
98 | /* Opcode is only defined on 64 bit architectures. */ | ||
99 | #define PPC_OPCODE_64 0x40 | ||
88 | 100 | ||
89 | /* Opcode is supported as part of the 64-bit bridge. */ | 101 | /* Opcode is supported as part of the 64-bit bridge. */ |
90 | #define PPC_OPCODE_64_BRIDGE 0x100 | 102 | #define PPC_OPCODE_64_BRIDGE 0x80 |
91 | 103 | ||
92 | /* Opcode is supported by Altivec Vector Unit */ | 104 | /* Opcode is supported by Altivec Vector Unit */ |
93 | #define PPC_OPCODE_ALTIVEC 0x200 | 105 | #define PPC_OPCODE_ALTIVEC 0x100 |
94 | 106 | ||
95 | /* Opcode is supported by PowerPC 403 processor. */ | 107 | /* Opcode is supported by PowerPC 403 processor. */ |
96 | #define PPC_OPCODE_403 0x400 | 108 | #define PPC_OPCODE_403 0x200 |
97 | 109 | ||
98 | /* Opcode is supported by PowerPC BookE processor. */ | 110 | /* Opcode is supported by PowerPC BookE processor. */ |
99 | #define PPC_OPCODE_BOOKE 0x800 | 111 | #define PPC_OPCODE_BOOKE 0x400 |
100 | |||
101 | /* Opcode is only supported by 64-bit PowerPC BookE processor. */ | ||
102 | #define PPC_OPCODE_BOOKE64 0x1000 | ||
103 | 112 | ||
104 | /* Opcode is supported by PowerPC 440 processor. */ | 113 | /* Opcode is supported by PowerPC 440 processor. */ |
105 | #define PPC_OPCODE_440 0x2000 | 114 | #define PPC_OPCODE_440 0x800 |
106 | 115 | ||
107 | /* Opcode is only supported by Power4 architecture. */ | 116 | /* Opcode is only supported by Power4 architecture. */ |
108 | #define PPC_OPCODE_POWER4 0x4000 | 117 | #define PPC_OPCODE_POWER4 0x1000 |
109 | |||
110 | /* Opcode isn't supported by Power4 architecture. */ | ||
111 | #define PPC_OPCODE_NOPOWER4 0x8000 | ||
112 | 118 | ||
113 | /* Opcode is only supported by POWERPC Classic architecture. */ | 119 | /* Opcode is only supported by Power7 architecture. */ |
114 | #define PPC_OPCODE_CLASSIC 0x10000 | 120 | #define PPC_OPCODE_POWER7 0x2000 |
115 | 121 | ||
116 | /* Opcode is only supported by e500x2 Core. */ | 122 | /* Opcode is only supported by e500x2 Core. */ |
117 | #define PPC_OPCODE_SPE 0x20000 | 123 | #define PPC_OPCODE_SPE 0x4000 |
118 | 124 | ||
119 | /* Opcode is supported by e500x2 Integer select APU. */ | 125 | /* Opcode is supported by e500x2 Integer select APU. */ |
120 | #define PPC_OPCODE_ISEL 0x40000 | 126 | #define PPC_OPCODE_ISEL 0x8000 |
121 | 127 | ||
122 | /* Opcode is an e500 SPE floating point instruction. */ | 128 | /* Opcode is an e500 SPE floating point instruction. */ |
123 | #define PPC_OPCODE_EFS 0x80000 | 129 | #define PPC_OPCODE_EFS 0x10000 |
124 | 130 | ||
125 | /* Opcode is supported by branch locking APU. */ | 131 | /* Opcode is supported by branch locking APU. */ |
126 | #define PPC_OPCODE_BRLOCK 0x100000 | 132 | #define PPC_OPCODE_BRLOCK 0x20000 |
127 | 133 | ||
128 | /* Opcode is supported by performance monitor APU. */ | 134 | /* Opcode is supported by performance monitor APU. */ |
129 | #define PPC_OPCODE_PMR 0x200000 | 135 | #define PPC_OPCODE_PMR 0x40000 |
130 | 136 | ||
131 | /* Opcode is supported by cache locking APU. */ | 137 | /* Opcode is supported by cache locking APU. */ |
132 | #define PPC_OPCODE_CACHELCK 0x400000 | 138 | #define PPC_OPCODE_CACHELCK 0x80000 |
133 | 139 | ||
134 | /* Opcode is supported by machine check APU. */ | 140 | /* Opcode is supported by machine check APU. */ |
135 | #define PPC_OPCODE_RFMCI 0x800000 | 141 | #define PPC_OPCODE_RFMCI 0x100000 |
136 | 142 | ||
137 | /* Opcode is only supported by Power5 architecture. */ | 143 | /* Opcode is only supported by Power5 architecture. */ |
138 | #define PPC_OPCODE_POWER5 0x1000000 | 144 | #define PPC_OPCODE_POWER5 0x200000 |
139 | 145 | ||
140 | /* Opcode is supported by PowerPC e300 family. */ | 146 | /* Opcode is supported by PowerPC e300 family. */ |
141 | #define PPC_OPCODE_E300 0x2000000 | 147 | #define PPC_OPCODE_E300 0x400000 |
142 | 148 | ||
143 | /* Opcode is only supported by Power6 architecture. */ | 149 | /* Opcode is only supported by Power6 architecture. */ |
144 | #define PPC_OPCODE_POWER6 0x4000000 | 150 | #define PPC_OPCODE_POWER6 0x800000 |
145 | 151 | ||
146 | /* Opcode is only supported by PowerPC Cell family. */ | 152 | /* Opcode is only supported by PowerPC Cell family. */ |
147 | #define PPC_OPCODE_CELL 0x8000000 | 153 | #define PPC_OPCODE_CELL 0x1000000 |
154 | |||
155 | /* Opcode is supported by CPUs with paired singles support. */ | ||
156 | #define PPC_OPCODE_PPCPS 0x2000000 | ||
157 | |||
158 | /* Opcode is supported by Power E500MC */ | ||
159 | #define PPC_OPCODE_E500MC 0x4000000 | ||
160 | |||
161 | /* Opcode is supported by PowerPC 405 processor. */ | ||
162 | #define PPC_OPCODE_405 0x8000000 | ||
163 | |||
164 | /* Opcode is supported by Vector-Scalar (VSX) Unit */ | ||
165 | #define PPC_OPCODE_VSX 0x10000000 | ||
166 | |||
167 | /* Opcode is supported by A2. */ | ||
168 | #define PPC_OPCODE_A2 0x20000000 | ||
169 | |||
170 | /* Opcode is supported by PowerPC 476 processor. */ | ||
171 | #define PPC_OPCODE_476 0x40000000 | ||
172 | |||
173 | /* Opcode is supported by AppliedMicro Titan core */ | ||
174 | #define PPC_OPCODE_TITAN 0x80000000 | ||
175 | |||
176 | /* Opcode which is supported by the e500 family */ | ||
177 | #define PPC_OPCODE_E500 0x100000000ull | ||
178 | |||
179 | /* Opcode is supported by Extended Altivec Vector Unit */ | ||
180 | #define PPC_OPCODE_ALTIVEC2 0x200000000ull | ||
181 | |||
182 | /* Opcode is supported by Power E6500 */ | ||
183 | #define PPC_OPCODE_E6500 0x400000000ull | ||
184 | |||
185 | /* Opcode is supported by Thread management APU */ | ||
186 | #define PPC_OPCODE_TMR 0x800000000ull | ||
187 | |||
188 | /* Opcode which is supported by the VLE extension. */ | ||
189 | #define PPC_OPCODE_VLE 0x1000000000ull | ||
190 | |||
191 | /* Opcode is only supported by Power8 architecture. */ | ||
192 | #define PPC_OPCODE_POWER8 0x2000000000ull | ||
193 | |||
194 | /* Opcode which is supported by the Hardware Transactional Memory extension. */ | ||
195 | /* Currently, this is the same as the POWER8 mask. If another cpu comes out | ||
196 | that isn't a superset of POWER8, we can define this to its own mask. */ | ||
197 | #define PPC_OPCODE_HTM PPC_OPCODE_POWER8 | ||
198 | |||
199 | /* Opcode is supported by ppc750cl. */ | ||
200 | #define PPC_OPCODE_750 0x4000000000ull | ||
201 | |||
202 | /* Opcode is supported by ppc7450. */ | ||
203 | #define PPC_OPCODE_7450 0x8000000000ull | ||
204 | |||
205 | /* Opcode is supported by ppc821/850/860. */ | ||
206 | #define PPC_OPCODE_860 0x10000000000ull | ||
207 | |||
208 | /* Opcode is only supported by Power9 architecture. */ | ||
209 | #define PPC_OPCODE_POWER9 0x20000000000ull | ||
210 | |||
211 | /* Opcode is supported by Vector-Scalar (VSX) Unit from ISA 2.08. */ | ||
212 | #define PPC_OPCODE_VSX3 0x40000000000ull | ||
213 | |||
214 | /* Opcode is supported by e200z4. */ | ||
215 | #define PPC_OPCODE_E200Z4 0x80000000000ull | ||
148 | 216 | ||
149 | /* A macro to extract the major opcode from an instruction. */ | 217 | /* A macro to extract the major opcode from an instruction. */ |
150 | #define PPC_OP(i) (((i) >> 26) & 0x3f) | 218 | #define PPC_OP(i) (((i) >> 26) & 0x3f) |
219 | |||
220 | /* A macro to determine if the instruction is a 2-byte VLE insn. */ | ||
221 | #define PPC_OP_SE_VLE(m) ((m) <= 0xffff) | ||
222 | |||
223 | /* A macro to extract the major opcode from a VLE instruction. */ | ||
224 | #define VLE_OP(i,m) (((i) >> ((m) <= 0xffff ? 10 : 26)) & 0x3f) | ||
225 | |||
226 | /* A macro to convert a VLE opcode to a VLE opcode segment. */ | ||
227 | #define VLE_OP_TO_SEG(i) ((i) >> 1) | ||
151 | 228 | ||
152 | /* The operands table is an array of struct powerpc_operand. */ | 229 | /* The operands table is an array of struct powerpc_operand. */ |
153 | 230 | ||
154 | struct powerpc_operand | 231 | struct powerpc_operand |
155 | { | 232 | { |
156 | /* The number of bits in the operand. */ | 233 | /* A bitmask of bits in the operand. */ |
157 | int bits; | 234 | unsigned int bitm; |
158 | 235 | ||
159 | /* How far the operand is left shifted in the instruction. */ | 236 | /* The shift operation to be applied to the operand. No shift |
237 | is made if this is zero. For positive values, the operand | ||
238 | is shifted left by SHIFT. For negative values, the operand | ||
239 | is shifted right by -SHIFT. Use PPC_OPSHIFT_INV to indicate | ||
240 | that BITM and SHIFT cannot be used to determine where the | ||
241 | operand goes in the insn. */ | ||
160 | int shift; | 242 | int shift; |
161 | 243 | ||
162 | /* Insertion function. This is used by the assembler. To insert an | 244 | /* Insertion function. This is used by the assembler. To insert an |
163 | operand value into an instruction, check this field. | 245 | operand value into an instruction, check this field. |
164 | 246 | ||
165 | If it is NULL, execute | 247 | If it is NULL, execute |
166 | i |= (op & ((1 << o->bits) - 1)) << o->shift; | 248 | if (o->shift >= 0) |
249 | i |= (op & o->bitm) << o->shift; | ||
250 | else | ||
251 | i |= (op & o->bitm) >> -o->shift; | ||
167 | (i is the instruction which we are filling in, o is a pointer to | 252 | (i is the instruction which we are filling in, o is a pointer to |
168 | this structure, and op is the opcode value; this assumes twos | 253 | this structure, and op is the operand value). |
169 | complement arithmetic). | ||
170 | 254 | ||
171 | If this field is not NULL, then simply call it with the | 255 | If this field is not NULL, then simply call it with the |
172 | instruction and the operand value. It will return the new value | 256 | instruction and the operand value. It will return the new value |
@@ -176,18 +260,20 @@ struct powerpc_operand | |||
176 | operand value is legal, *ERRMSG will be unchanged (most operands | 260 | operand value is legal, *ERRMSG will be unchanged (most operands |
177 | can accept any value). */ | 261 | can accept any value). */ |
178 | unsigned long (*insert) | 262 | unsigned long (*insert) |
179 | (unsigned long instruction, long op, int dialect, const char **errmsg); | 263 | (unsigned long instruction, long op, ppc_cpu_t dialect, const char **errmsg); |
180 | 264 | ||
181 | /* Extraction function. This is used by the disassembler. To | 265 | /* Extraction function. This is used by the disassembler. To |
182 | extract this operand type from an instruction, check this field. | 266 | extract this operand type from an instruction, check this field. |
183 | 267 | ||
184 | If it is NULL, compute | 268 | If it is NULL, compute |
185 | op = ((i) >> o->shift) & ((1 << o->bits) - 1); | 269 | if (o->shift >= 0) |
186 | if ((o->flags & PPC_OPERAND_SIGNED) != 0 | 270 | op = (i >> o->shift) & o->bitm; |
187 | && (op & (1 << (o->bits - 1))) != 0) | 271 | else |
188 | op -= 1 << o->bits; | 272 | op = (i << -o->shift) & o->bitm; |
273 | if ((o->flags & PPC_OPERAND_SIGNED) != 0) | ||
274 | sign_extend (op); | ||
189 | (i is the instruction, o is a pointer to this structure, and op | 275 | (i is the instruction, o is a pointer to this structure, and op |
190 | is the result; this assumes twos complement arithmetic). | 276 | is the result). |
191 | 277 | ||
192 | If this field is not NULL, then simply call it with the | 278 | If this field is not NULL, then simply call it with the |
193 | instruction value. It will return the value of the operand. If | 279 | instruction value. It will return the value of the operand. If |
@@ -195,7 +281,7 @@ struct powerpc_operand | |||
195 | non-zero if this operand type can not actually be extracted from | 281 | non-zero if this operand type can not actually be extracted from |
196 | this operand (i.e., the instruction does not match). If the | 282 | this operand (i.e., the instruction does not match). If the |
197 | operand is valid, *INVALID will not be changed. */ | 283 | operand is valid, *INVALID will not be changed. */ |
198 | long (*extract) (unsigned long instruction, int dialect, int *invalid); | 284 | long (*extract) (unsigned long instruction, ppc_cpu_t dialect, int *invalid); |
199 | 285 | ||
200 | /* One bit syntax flags. */ | 286 | /* One bit syntax flags. */ |
201 | unsigned long flags; | 287 | unsigned long flags; |
@@ -205,17 +291,23 @@ struct powerpc_operand | |||
205 | the operands field of the powerpc_opcodes table. */ | 291 | the operands field of the powerpc_opcodes table. */ |
206 | 292 | ||
207 | extern const struct powerpc_operand powerpc_operands[]; | 293 | extern const struct powerpc_operand powerpc_operands[]; |
294 | extern const unsigned int num_powerpc_operands; | ||
295 | |||
296 | /* Use with the shift field of a struct powerpc_operand to indicate | ||
297 | that BITM and SHIFT cannot be used to determine where the operand | ||
298 | goes in the insn. */ | ||
299 | #define PPC_OPSHIFT_INV (-1U << 31) | ||
208 | 300 | ||
209 | /* Values defined for the flags field of a struct powerpc_operand. */ | 301 | /* Values defined for the flags field of a struct powerpc_operand. */ |
210 | 302 | ||
211 | /* This operand takes signed values. */ | 303 | /* This operand takes signed values. */ |
212 | #define PPC_OPERAND_SIGNED (01) | 304 | #define PPC_OPERAND_SIGNED (0x1) |
213 | 305 | ||
214 | /* This operand takes signed values, but also accepts a full positive | 306 | /* This operand takes signed values, but also accepts a full positive |
215 | range of values when running in 32 bit mode. That is, if bits is | 307 | range of values when running in 32 bit mode. That is, if bits is |
216 | 16, it takes any value from -0x8000 to 0xffff. In 64 bit mode, | 308 | 16, it takes any value from -0x8000 to 0xffff. In 64 bit mode, |
217 | this flag is ignored. */ | 309 | this flag is ignored. */ |
218 | #define PPC_OPERAND_SIGNOPT (02) | 310 | #define PPC_OPERAND_SIGNOPT (0x2) |
219 | 311 | ||
220 | /* This operand does not actually exist in the assembler input. This | 312 | /* This operand does not actually exist in the assembler input. This |
221 | is used to support extended mnemonics such as mr, for which two | 313 | is used to support extended mnemonics such as mr, for which two |
@@ -223,14 +315,14 @@ extern const struct powerpc_operand powerpc_operands[]; | |||
223 | insert function with any op value. The disassembler should call | 315 | insert function with any op value. The disassembler should call |
224 | the extract function, ignore the return value, and check the value | 316 | the extract function, ignore the return value, and check the value |
225 | placed in the valid argument. */ | 317 | placed in the valid argument. */ |
226 | #define PPC_OPERAND_FAKE (04) | 318 | #define PPC_OPERAND_FAKE (0x4) |
227 | 319 | ||
228 | /* The next operand should be wrapped in parentheses rather than | 320 | /* The next operand should be wrapped in parentheses rather than |
229 | separated from this one by a comma. This is used for the load and | 321 | separated from this one by a comma. This is used for the load and |
230 | store instructions which want their operands to look like | 322 | store instructions which want their operands to look like |
231 | reg,displacement(reg) | 323 | reg,displacement(reg) |
232 | */ | 324 | */ |
233 | #define PPC_OPERAND_PARENS (010) | 325 | #define PPC_OPERAND_PARENS (0x8) |
234 | 326 | ||
235 | /* This operand may use the symbolic names for the CR fields, which | 327 | /* This operand may use the symbolic names for the CR fields, which |
236 | are | 328 | are |
@@ -239,26 +331,26 @@ extern const struct powerpc_operand powerpc_operands[]; | |||
239 | cr4 4 cr5 5 cr6 6 cr7 7 | 331 | cr4 4 cr5 5 cr6 6 cr7 7 |
240 | These may be combined arithmetically, as in cr2*4+gt. These are | 332 | These may be combined arithmetically, as in cr2*4+gt. These are |
241 | only supported on the PowerPC, not the POWER. */ | 333 | only supported on the PowerPC, not the POWER. */ |
242 | #define PPC_OPERAND_CR (020) | 334 | #define PPC_OPERAND_CR_BIT (0x10) |
243 | 335 | ||
244 | /* This operand names a register. The disassembler uses this to print | 336 | /* This operand names a register. The disassembler uses this to print |
245 | register names with a leading 'r'. */ | 337 | register names with a leading 'r'. */ |
246 | #define PPC_OPERAND_GPR (040) | 338 | #define PPC_OPERAND_GPR (0x20) |
247 | 339 | ||
248 | /* Like PPC_OPERAND_GPR, but don't print a leading 'r' for r0. */ | 340 | /* Like PPC_OPERAND_GPR, but don't print a leading 'r' for r0. */ |
249 | #define PPC_OPERAND_GPR_0 (0100) | 341 | #define PPC_OPERAND_GPR_0 (0x40) |
250 | 342 | ||
251 | /* This operand names a floating point register. The disassembler | 343 | /* This operand names a floating point register. The disassembler |
252 | prints these with a leading 'f'. */ | 344 | prints these with a leading 'f'. */ |
253 | #define PPC_OPERAND_FPR (0200) | 345 | #define PPC_OPERAND_FPR (0x80) |
254 | 346 | ||
255 | /* This operand is a relative branch displacement. The disassembler | 347 | /* This operand is a relative branch displacement. The disassembler |
256 | prints these symbolically if possible. */ | 348 | prints these symbolically if possible. */ |
257 | #define PPC_OPERAND_RELATIVE (0400) | 349 | #define PPC_OPERAND_RELATIVE (0x100) |
258 | 350 | ||
259 | /* This operand is an absolute branch address. The disassembler | 351 | /* This operand is an absolute branch address. The disassembler |
260 | prints these symbolically if possible. */ | 352 | prints these symbolically if possible. */ |
261 | #define PPC_OPERAND_ABSOLUTE (01000) | 353 | #define PPC_OPERAND_ABSOLUTE (0x200) |
262 | 354 | ||
263 | /* This operand is optional, and is zero if omitted. This is used for | 355 | /* This operand is optional, and is zero if omitted. This is used for |
264 | example, in the optional BF field in the comparison instructions. The | 356 | example, in the optional BF field in the comparison instructions. The |
@@ -266,7 +358,7 @@ extern const struct powerpc_operand powerpc_operands[]; | |||
266 | and the number of operands remaining for the opcode, and decide | 358 | and the number of operands remaining for the opcode, and decide |
267 | whether this operand is present or not. The disassembler should | 359 | whether this operand is present or not. The disassembler should |
268 | print this operand out only if it is not zero. */ | 360 | print this operand out only if it is not zero. */ |
269 | #define PPC_OPERAND_OPTIONAL (02000) | 361 | #define PPC_OPERAND_OPTIONAL (0x400) |
270 | 362 | ||
271 | /* This flag is only used with PPC_OPERAND_OPTIONAL. If this operand | 363 | /* This flag is only used with PPC_OPERAND_OPTIONAL. If this operand |
272 | is omitted, then for the next operand use this operand value plus | 364 | is omitted, then for the next operand use this operand value plus |
@@ -274,24 +366,48 @@ extern const struct powerpc_operand powerpc_operands[]; | |||
274 | hack is needed because the Power rotate instructions can take | 366 | hack is needed because the Power rotate instructions can take |
275 | either 4 or 5 operands. The disassembler should print this operand | 367 | either 4 or 5 operands. The disassembler should print this operand |
276 | out regardless of the PPC_OPERAND_OPTIONAL field. */ | 368 | out regardless of the PPC_OPERAND_OPTIONAL field. */ |
277 | #define PPC_OPERAND_NEXT (04000) | 369 | #define PPC_OPERAND_NEXT (0x800) |
278 | 370 | ||
279 | /* This operand should be regarded as a negative number for the | 371 | /* This operand should be regarded as a negative number for the |
280 | purposes of overflow checking (i.e., the normal most negative | 372 | purposes of overflow checking (i.e., the normal most negative |
281 | number is disallowed and one more than the normal most positive | 373 | number is disallowed and one more than the normal most positive |
282 | number is allowed). This flag will only be set for a signed | 374 | number is allowed). This flag will only be set for a signed |
283 | operand. */ | 375 | operand. */ |
284 | #define PPC_OPERAND_NEGATIVE (010000) | 376 | #define PPC_OPERAND_NEGATIVE (0x1000) |
285 | 377 | ||
286 | /* This operand names a vector unit register. The disassembler | 378 | /* This operand names a vector unit register. The disassembler |
287 | prints these with a leading 'v'. */ | 379 | prints these with a leading 'v'. */ |
288 | #define PPC_OPERAND_VR (020000) | 380 | #define PPC_OPERAND_VR (0x2000) |
289 | 381 | ||
290 | /* This operand is for the DS field in a DS form instruction. */ | 382 | /* This operand is for the DS field in a DS form instruction. */ |
291 | #define PPC_OPERAND_DS (040000) | 383 | #define PPC_OPERAND_DS (0x4000) |
292 | 384 | ||
293 | /* This operand is for the DQ field in a DQ form instruction. */ | 385 | /* This operand is for the DQ field in a DQ form instruction. */ |
294 | #define PPC_OPERAND_DQ (0100000) | 386 | #define PPC_OPERAND_DQ (0x8000) |
387 | |||
388 | /* Valid range of operand is 0..n rather than 0..n-1. */ | ||
389 | #define PPC_OPERAND_PLUS1 (0x10000) | ||
390 | |||
391 | /* Xilinx APU and FSL related operands */ | ||
392 | #define PPC_OPERAND_FSL (0x20000) | ||
393 | #define PPC_OPERAND_FCR (0x40000) | ||
394 | #define PPC_OPERAND_UDI (0x80000) | ||
395 | |||
396 | /* This operand names a vector-scalar unit register. The disassembler | ||
397 | prints these with a leading 'vs'. */ | ||
398 | #define PPC_OPERAND_VSR (0x100000) | ||
399 | |||
400 | /* This is a CR FIELD that does not use symbolic names. */ | ||
401 | #define PPC_OPERAND_CR_REG (0x200000) | ||
402 | |||
403 | /* This flag is only used with PPC_OPERAND_OPTIONAL. If this operand | ||
404 | is omitted, then the value it should use for the operand is stored | ||
405 | in the SHIFT field of the immediatly following operand field. */ | ||
406 | #define PPC_OPERAND_OPTIONAL_VALUE (0x400000) | ||
407 | |||
408 | /* This flag is only used with PPC_OPERAND_OPTIONAL. The operand is | ||
409 | only optional when generating 32-bit code. */ | ||
410 | #define PPC_OPERAND_OPTIONAL32 (0x800000) | ||
295 | 411 | ||
296 | /* The POWER and PowerPC assemblers use a few macros. We keep them | 412 | /* The POWER and PowerPC assemblers use a few macros. We keep them |
297 | with the operands table for simplicity. The macro table is an | 413 | with the operands table for simplicity. The macro table is an |
@@ -308,7 +424,7 @@ struct powerpc_macro | |||
308 | /* One bit flags for the opcode. These are used to indicate which | 424 | /* One bit flags for the opcode. These are used to indicate which |
309 | specific processors support the instructions. The values are the | 425 | specific processors support the instructions. The values are the |
310 | same as those for the struct powerpc_opcode flags field. */ | 426 | same as those for the struct powerpc_opcode flags field. */ |
311 | unsigned long flags; | 427 | ppc_cpu_t flags; |
312 | 428 | ||
313 | /* A format string to turn the macro into a normal instruction. | 429 | /* A format string to turn the macro into a normal instruction. |
314 | Each %N in the string is replaced with operand number N (zero | 430 | Each %N in the string is replaced with operand number N (zero |
@@ -319,4 +435,18 @@ struct powerpc_macro | |||
319 | extern const struct powerpc_macro powerpc_macros[]; | 435 | extern const struct powerpc_macro powerpc_macros[]; |
320 | extern const int powerpc_num_macros; | 436 | extern const int powerpc_num_macros; |
321 | 437 | ||
438 | extern ppc_cpu_t ppc_parse_cpu (ppc_cpu_t, ppc_cpu_t *, const char *); | ||
439 | |||
440 | static inline long | ||
441 | ppc_optional_operand_value (const struct powerpc_operand *operand) | ||
442 | { | ||
443 | if ((operand->flags & PPC_OPERAND_OPTIONAL_VALUE) != 0) | ||
444 | return (operand+1)->shift; | ||
445 | return 0; | ||
446 | } | ||
447 | |||
448 | #ifdef __cplusplus | ||
449 | } | ||
450 | #endif | ||
451 | |||
322 | #endif /* PPC_H */ | 452 | #endif /* PPC_H */ |
diff --git a/arch/powerpc/xmon/xmon.c b/arch/powerpc/xmon/xmon.c index 5720236d0266..26fa03fc9f3c 100644 --- a/arch/powerpc/xmon/xmon.c +++ b/arch/powerpc/xmon/xmon.c | |||
@@ -212,6 +212,10 @@ Commands:\n\ | |||
212 | "\ | 212 | "\ |
213 | C checksum\n\ | 213 | C checksum\n\ |
214 | d dump bytes\n\ | 214 | d dump bytes\n\ |
215 | d1 dump 1 byte values\n\ | ||
216 | d2 dump 2 byte values\n\ | ||
217 | d4 dump 4 byte values\n\ | ||
218 | d8 dump 8 byte values\n\ | ||
215 | di dump instructions\n\ | 219 | di dump instructions\n\ |
216 | df dump float values\n\ | 220 | df dump float values\n\ |
217 | dd dump double values\n\ | 221 | dd dump double values\n\ |
@@ -2334,9 +2338,42 @@ static void dump_pacas(void) | |||
2334 | } | 2338 | } |
2335 | #endif | 2339 | #endif |
2336 | 2340 | ||
2341 | static void dump_by_size(unsigned long addr, long count, int size) | ||
2342 | { | ||
2343 | unsigned char temp[16]; | ||
2344 | int i, j; | ||
2345 | u64 val; | ||
2346 | |||
2347 | count = ALIGN(count, 16); | ||
2348 | |||
2349 | for (i = 0; i < count; i += 16, addr += 16) { | ||
2350 | printf(REG, addr); | ||
2351 | |||
2352 | if (mread(addr, temp, 16) != 16) { | ||
2353 | printf("\nFaulted reading %d bytes from 0x"REG"\n", 16, addr); | ||
2354 | return; | ||
2355 | } | ||
2356 | |||
2357 | for (j = 0; j < 16; j += size) { | ||
2358 | putchar(' '); | ||
2359 | switch (size) { | ||
2360 | case 1: val = temp[j]; break; | ||
2361 | case 2: val = *(u16 *)&temp[j]; break; | ||
2362 | case 4: val = *(u32 *)&temp[j]; break; | ||
2363 | case 8: val = *(u64 *)&temp[j]; break; | ||
2364 | default: val = 0; | ||
2365 | } | ||
2366 | |||
2367 | printf("%0*lx", size * 2, val); | ||
2368 | } | ||
2369 | printf("\n"); | ||
2370 | } | ||
2371 | } | ||
2372 | |||
2337 | static void | 2373 | static void |
2338 | dump(void) | 2374 | dump(void) |
2339 | { | 2375 | { |
2376 | static char last[] = { "d?\n" }; | ||
2340 | int c; | 2377 | int c; |
2341 | 2378 | ||
2342 | c = inchar(); | 2379 | c = inchar(); |
@@ -2350,8 +2387,9 @@ dump(void) | |||
2350 | } | 2387 | } |
2351 | #endif | 2388 | #endif |
2352 | 2389 | ||
2353 | if ((isxdigit(c) && c != 'f' && c != 'd') || c == '\n') | 2390 | if (c == '\n') |
2354 | termch = c; | 2391 | termch = c; |
2392 | |||
2355 | scanhex((void *)&adrs); | 2393 | scanhex((void *)&adrs); |
2356 | if (termch != '\n') | 2394 | if (termch != '\n') |
2357 | termch = 0; | 2395 | termch = 0; |
@@ -2383,9 +2421,23 @@ dump(void) | |||
2383 | ndump = 64; | 2421 | ndump = 64; |
2384 | else if (ndump > MAX_DUMP) | 2422 | else if (ndump > MAX_DUMP) |
2385 | ndump = MAX_DUMP; | 2423 | ndump = MAX_DUMP; |
2386 | prdump(adrs, ndump); | 2424 | |
2425 | switch (c) { | ||
2426 | case '8': | ||
2427 | case '4': | ||
2428 | case '2': | ||
2429 | case '1': | ||
2430 | ndump = ALIGN(ndump, 16); | ||
2431 | dump_by_size(adrs, ndump, c - '0'); | ||
2432 | last[1] = c; | ||
2433 | last_cmd = last; | ||
2434 | break; | ||
2435 | default: | ||
2436 | prdump(adrs, ndump); | ||
2437 | last_cmd = "d\n"; | ||
2438 | } | ||
2439 | |||
2387 | adrs += ndump; | 2440 | adrs += ndump; |
2388 | last_cmd = "d\n"; | ||
2389 | } | 2441 | } |
2390 | } | 2442 | } |
2391 | 2443 | ||
diff --git a/arch/x86/kernel/vmlinux.lds.S b/arch/x86/kernel/vmlinux.lds.S index ad0118fbce90..c74ae9ce8dc4 100644 --- a/arch/x86/kernel/vmlinux.lds.S +++ b/arch/x86/kernel/vmlinux.lds.S | |||
@@ -345,8 +345,6 @@ SECTIONS | |||
345 | DISCARDS | 345 | DISCARDS |
346 | /DISCARD/ : { | 346 | /DISCARD/ : { |
347 | *(.eh_frame) | 347 | *(.eh_frame) |
348 | *(__func_stack_frame_non_standard) | ||
349 | *(__unreachable) | ||
350 | } | 348 | } |
351 | } | 349 | } |
352 | 350 | ||
diff --git a/drivers/acpi/acpi_lpss.c b/drivers/acpi/acpi_lpss.c index 90d112a3063a..5edfd9c49044 100644 --- a/drivers/acpi/acpi_lpss.c +++ b/drivers/acpi/acpi_lpss.c | |||
@@ -21,6 +21,7 @@ | |||
21 | #include <linux/platform_data/x86/pmc_atom.h> | 21 | #include <linux/platform_data/x86/pmc_atom.h> |
22 | #include <linux/pm_domain.h> | 22 | #include <linux/pm_domain.h> |
23 | #include <linux/pm_runtime.h> | 23 | #include <linux/pm_runtime.h> |
24 | #include <linux/pwm.h> | ||
24 | #include <linux/delay.h> | 25 | #include <linux/delay.h> |
25 | 26 | ||
26 | #include "internal.h" | 27 | #include "internal.h" |
@@ -154,6 +155,18 @@ static void byt_i2c_setup(struct lpss_private_data *pdata) | |||
154 | writel(0, pdata->mmio_base + LPSS_I2C_ENABLE); | 155 | writel(0, pdata->mmio_base + LPSS_I2C_ENABLE); |
155 | } | 156 | } |
156 | 157 | ||
158 | /* BSW PWM used for backlight control by the i915 driver */ | ||
159 | static struct pwm_lookup bsw_pwm_lookup[] = { | ||
160 | PWM_LOOKUP_WITH_MODULE("80862288:00", 0, "0000:00:02.0", | ||
161 | "pwm_backlight", 0, PWM_POLARITY_NORMAL, | ||
162 | "pwm-lpss-platform"), | ||
163 | }; | ||
164 | |||
165 | static void bsw_pwm_setup(struct lpss_private_data *pdata) | ||
166 | { | ||
167 | pwm_add_table(bsw_pwm_lookup, ARRAY_SIZE(bsw_pwm_lookup)); | ||
168 | } | ||
169 | |||
157 | static const struct lpss_device_desc lpt_dev_desc = { | 170 | static const struct lpss_device_desc lpt_dev_desc = { |
158 | .flags = LPSS_CLK | LPSS_CLK_GATE | LPSS_CLK_DIVIDER | LPSS_LTR, | 171 | .flags = LPSS_CLK | LPSS_CLK_GATE | LPSS_CLK_DIVIDER | LPSS_LTR, |
159 | .prv_offset = 0x800, | 172 | .prv_offset = 0x800, |
@@ -191,6 +204,7 @@ static const struct lpss_device_desc byt_pwm_dev_desc = { | |||
191 | 204 | ||
192 | static const struct lpss_device_desc bsw_pwm_dev_desc = { | 205 | static const struct lpss_device_desc bsw_pwm_dev_desc = { |
193 | .flags = LPSS_SAVE_CTX | LPSS_NO_D3_DELAY, | 206 | .flags = LPSS_SAVE_CTX | LPSS_NO_D3_DELAY, |
207 | .setup = bsw_pwm_setup, | ||
194 | }; | 208 | }; |
195 | 209 | ||
196 | static const struct lpss_device_desc byt_uart_dev_desc = { | 210 | static const struct lpss_device_desc byt_uart_dev_desc = { |
diff --git a/drivers/dma-buf/dma-buf.c b/drivers/dma-buf/dma-buf.c index 718f832a5c71..0007b792827b 100644 --- a/drivers/dma-buf/dma-buf.c +++ b/drivers/dma-buf/dma-buf.c | |||
@@ -325,6 +325,9 @@ static const struct file_operations dma_buf_fops = { | |||
325 | .llseek = dma_buf_llseek, | 325 | .llseek = dma_buf_llseek, |
326 | .poll = dma_buf_poll, | 326 | .poll = dma_buf_poll, |
327 | .unlocked_ioctl = dma_buf_ioctl, | 327 | .unlocked_ioctl = dma_buf_ioctl, |
328 | #ifdef CONFIG_COMPAT | ||
329 | .compat_ioctl = dma_buf_ioctl, | ||
330 | #endif | ||
328 | }; | 331 | }; |
329 | 332 | ||
330 | /* | 333 | /* |
diff --git a/drivers/gpu/drm/ast/ast_dram_tables.h b/drivers/gpu/drm/ast/ast_dram_tables.h index cc04539c0ff3..1d9c4e75d303 100644 --- a/drivers/gpu/drm/ast/ast_dram_tables.h +++ b/drivers/gpu/drm/ast/ast_dram_tables.h | |||
@@ -141,4 +141,66 @@ static const struct ast_dramstruct ast2100_dram_table_data[] = { | |||
141 | { 0xffff, 0xffffffff }, | 141 | { 0xffff, 0xffffffff }, |
142 | }; | 142 | }; |
143 | 143 | ||
144 | /* | ||
145 | * AST2500 DRAM settings modules | ||
146 | */ | ||
147 | #define REGTBL_NUM 17 | ||
148 | #define REGIDX_010 0 | ||
149 | #define REGIDX_014 1 | ||
150 | #define REGIDX_018 2 | ||
151 | #define REGIDX_020 3 | ||
152 | #define REGIDX_024 4 | ||
153 | #define REGIDX_02C 5 | ||
154 | #define REGIDX_030 6 | ||
155 | #define REGIDX_214 7 | ||
156 | #define REGIDX_2E0 8 | ||
157 | #define REGIDX_2E4 9 | ||
158 | #define REGIDX_2E8 10 | ||
159 | #define REGIDX_2EC 11 | ||
160 | #define REGIDX_2F0 12 | ||
161 | #define REGIDX_2F4 13 | ||
162 | #define REGIDX_2F8 14 | ||
163 | #define REGIDX_RFC 15 | ||
164 | #define REGIDX_PLL 16 | ||
165 | |||
166 | static const u32 ast2500_ddr3_1600_timing_table[REGTBL_NUM] = { | ||
167 | 0x64604D38, /* 0x010 */ | ||
168 | 0x29690599, /* 0x014 */ | ||
169 | 0x00000300, /* 0x018 */ | ||
170 | 0x00000000, /* 0x020 */ | ||
171 | 0x00000000, /* 0x024 */ | ||
172 | 0x02181E70, /* 0x02C */ | ||
173 | 0x00000040, /* 0x030 */ | ||
174 | 0x00000024, /* 0x214 */ | ||
175 | 0x02001300, /* 0x2E0 */ | ||
176 | 0x0E0000A0, /* 0x2E4 */ | ||
177 | 0x000E001B, /* 0x2E8 */ | ||
178 | 0x35B8C105, /* 0x2EC */ | ||
179 | 0x08090408, /* 0x2F0 */ | ||
180 | 0x9B000800, /* 0x2F4 */ | ||
181 | 0x0E400A00, /* 0x2F8 */ | ||
182 | 0x9971452F, /* tRFC */ | ||
183 | 0x000071C1 /* PLL */ | ||
184 | }; | ||
185 | |||
186 | static const u32 ast2500_ddr4_1600_timing_table[REGTBL_NUM] = { | ||
187 | 0x63604E37, /* 0x010 */ | ||
188 | 0xE97AFA99, /* 0x014 */ | ||
189 | 0x00019000, /* 0x018 */ | ||
190 | 0x08000000, /* 0x020 */ | ||
191 | 0x00000400, /* 0x024 */ | ||
192 | 0x00000410, /* 0x02C */ | ||
193 | 0x00000101, /* 0x030 */ | ||
194 | 0x00000024, /* 0x214 */ | ||
195 | 0x03002900, /* 0x2E0 */ | ||
196 | 0x0E0000A0, /* 0x2E4 */ | ||
197 | 0x000E001C, /* 0x2E8 */ | ||
198 | 0x35B8C106, /* 0x2EC */ | ||
199 | 0x08080607, /* 0x2F0 */ | ||
200 | 0x9B000900, /* 0x2F4 */ | ||
201 | 0x0E400A00, /* 0x2F8 */ | ||
202 | 0x99714545, /* tRFC */ | ||
203 | 0x000071C1 /* PLL */ | ||
204 | }; | ||
205 | |||
144 | #endif | 206 | #endif |
diff --git a/drivers/gpu/drm/ast/ast_drv.h b/drivers/gpu/drm/ast/ast_drv.h index 5a8fa1c85229..8880f0b62e9c 100644 --- a/drivers/gpu/drm/ast/ast_drv.h +++ b/drivers/gpu/drm/ast/ast_drv.h | |||
@@ -65,6 +65,7 @@ enum ast_chip { | |||
65 | AST2150, | 65 | AST2150, |
66 | AST2300, | 66 | AST2300, |
67 | AST2400, | 67 | AST2400, |
68 | AST2500, | ||
68 | AST1180, | 69 | AST1180, |
69 | }; | 70 | }; |
70 | 71 | ||
@@ -81,6 +82,7 @@ enum ast_tx_chip { | |||
81 | #define AST_DRAM_1Gx32 3 | 82 | #define AST_DRAM_1Gx32 3 |
82 | #define AST_DRAM_2Gx16 6 | 83 | #define AST_DRAM_2Gx16 6 |
83 | #define AST_DRAM_4Gx16 7 | 84 | #define AST_DRAM_4Gx16 7 |
85 | #define AST_DRAM_8Gx16 8 | ||
84 | 86 | ||
85 | struct ast_fbdev; | 87 | struct ast_fbdev; |
86 | 88 | ||
@@ -114,7 +116,11 @@ struct ast_private { | |||
114 | struct ttm_bo_kmap_obj cache_kmap; | 116 | struct ttm_bo_kmap_obj cache_kmap; |
115 | int next_cursor; | 117 | int next_cursor; |
116 | bool support_wide_screen; | 118 | bool support_wide_screen; |
117 | bool DisableP2A; | 119 | enum { |
120 | ast_use_p2a, | ||
121 | ast_use_dt, | ||
122 | ast_use_defaults | ||
123 | } config_mode; | ||
118 | 124 | ||
119 | enum ast_tx_chip tx_chip_type; | 125 | enum ast_tx_chip tx_chip_type; |
120 | u8 dp501_maxclk; | 126 | u8 dp501_maxclk; |
@@ -301,8 +307,8 @@ struct ast_vbios_dclk_info { | |||
301 | }; | 307 | }; |
302 | 308 | ||
303 | struct ast_vbios_mode_info { | 309 | struct ast_vbios_mode_info { |
304 | struct ast_vbios_stdtable *std_table; | 310 | const struct ast_vbios_stdtable *std_table; |
305 | struct ast_vbios_enhtable *enh_table; | 311 | const struct ast_vbios_enhtable *enh_table; |
306 | }; | 312 | }; |
307 | 313 | ||
308 | extern int ast_mode_init(struct drm_device *dev); | 314 | extern int ast_mode_init(struct drm_device *dev); |
diff --git a/drivers/gpu/drm/ast/ast_main.c b/drivers/gpu/drm/ast/ast_main.c index 993909430736..262c2c0e43b4 100644 --- a/drivers/gpu/drm/ast/ast_main.c +++ b/drivers/gpu/drm/ast/ast_main.c | |||
@@ -32,8 +32,6 @@ | |||
32 | #include <drm/drm_fb_helper.h> | 32 | #include <drm/drm_fb_helper.h> |
33 | #include <drm/drm_crtc_helper.h> | 33 | #include <drm/drm_crtc_helper.h> |
34 | 34 | ||
35 | #include "ast_dram_tables.h" | ||
36 | |||
37 | void ast_set_index_reg_mask(struct ast_private *ast, | 35 | void ast_set_index_reg_mask(struct ast_private *ast, |
38 | uint32_t base, uint8_t index, | 36 | uint32_t base, uint8_t index, |
39 | uint8_t mask, uint8_t val) | 37 | uint8_t mask, uint8_t val) |
@@ -62,30 +60,99 @@ uint8_t ast_get_index_reg_mask(struct ast_private *ast, | |||
62 | return ret; | 60 | return ret; |
63 | } | 61 | } |
64 | 62 | ||
63 | static void ast_detect_config_mode(struct drm_device *dev, u32 *scu_rev) | ||
64 | { | ||
65 | struct device_node *np = dev->pdev->dev.of_node; | ||
66 | struct ast_private *ast = dev->dev_private; | ||
67 | uint32_t data, jregd0, jregd1; | ||
68 | |||
69 | /* Defaults */ | ||
70 | ast->config_mode = ast_use_defaults; | ||
71 | *scu_rev = 0xffffffff; | ||
72 | |||
73 | /* Check if we have device-tree properties */ | ||
74 | if (np && !of_property_read_u32(np, "aspeed,scu-revision-id", | ||
75 | scu_rev)) { | ||
76 | /* We do, disable P2A access */ | ||
77 | ast->config_mode = ast_use_dt; | ||
78 | DRM_INFO("Using device-tree for configuration\n"); | ||
79 | return; | ||
80 | } | ||
81 | |||
82 | /* Not all families have a P2A bridge */ | ||
83 | if (dev->pdev->device != PCI_CHIP_AST2000) | ||
84 | return; | ||
85 | |||
86 | /* | ||
87 | * The BMC will set SCU 0x40 D[12] to 1 if the P2 bridge | ||
88 | * is disabled. We force using P2A if VGA only mode bit | ||
89 | * is set D[7] | ||
90 | */ | ||
91 | jregd0 = ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xd0, 0xff); | ||
92 | jregd1 = ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xd1, 0xff); | ||
93 | if (!(jregd0 & 0x80) || !(jregd1 & 0x10)) { | ||
94 | /* Double check it's actually working */ | ||
95 | data = ast_read32(ast, 0xf004); | ||
96 | if (data != 0xFFFFFFFF) { | ||
97 | /* P2A works, grab silicon revision */ | ||
98 | ast->config_mode = ast_use_p2a; | ||
99 | |||
100 | DRM_INFO("Using P2A bridge for configuration\n"); | ||
101 | |||
102 | /* Read SCU7c (silicon revision register) */ | ||
103 | ast_write32(ast, 0xf004, 0x1e6e0000); | ||
104 | ast_write32(ast, 0xf000, 0x1); | ||
105 | *scu_rev = ast_read32(ast, 0x1207c); | ||
106 | return; | ||
107 | } | ||
108 | } | ||
109 | |||
110 | /* We have a P2A bridge but it's disabled */ | ||
111 | DRM_INFO("P2A bridge disabled, using default configuration\n"); | ||
112 | } | ||
65 | 113 | ||
66 | static int ast_detect_chip(struct drm_device *dev, bool *need_post) | 114 | static int ast_detect_chip(struct drm_device *dev, bool *need_post) |
67 | { | 115 | { |
68 | struct ast_private *ast = dev->dev_private; | 116 | struct ast_private *ast = dev->dev_private; |
69 | uint32_t data, jreg; | 117 | uint32_t jreg, scu_rev; |
118 | |||
119 | /* | ||
120 | * If VGA isn't enabled, we need to enable now or subsequent | ||
121 | * access to the scratch registers will fail. We also inform | ||
122 | * our caller that it needs to POST the chip | ||
123 | * (Assumption: VGA not enabled -> need to POST) | ||
124 | */ | ||
125 | if (!ast_is_vga_enabled(dev)) { | ||
126 | ast_enable_vga(dev); | ||
127 | DRM_INFO("VGA not enabled on entry, requesting chip POST\n"); | ||
128 | *need_post = true; | ||
129 | } else | ||
130 | *need_post = false; | ||
131 | |||
132 | |||
133 | /* Enable extended register access */ | ||
134 | ast_enable_mmio(dev); | ||
70 | ast_open_key(ast); | 135 | ast_open_key(ast); |
71 | 136 | ||
137 | /* Find out whether P2A works or whether to use device-tree */ | ||
138 | ast_detect_config_mode(dev, &scu_rev); | ||
139 | |||
140 | /* Identify chipset */ | ||
72 | if (dev->pdev->device == PCI_CHIP_AST1180) { | 141 | if (dev->pdev->device == PCI_CHIP_AST1180) { |
73 | ast->chip = AST1100; | 142 | ast->chip = AST1100; |
74 | DRM_INFO("AST 1180 detected\n"); | 143 | DRM_INFO("AST 1180 detected\n"); |
75 | } else { | 144 | } else { |
76 | if (dev->pdev->revision >= 0x30) { | 145 | if (dev->pdev->revision >= 0x40) { |
146 | ast->chip = AST2500; | ||
147 | DRM_INFO("AST 2500 detected\n"); | ||
148 | } else if (dev->pdev->revision >= 0x30) { | ||
77 | ast->chip = AST2400; | 149 | ast->chip = AST2400; |
78 | DRM_INFO("AST 2400 detected\n"); | 150 | DRM_INFO("AST 2400 detected\n"); |
79 | } else if (dev->pdev->revision >= 0x20) { | 151 | } else if (dev->pdev->revision >= 0x20) { |
80 | ast->chip = AST2300; | 152 | ast->chip = AST2300; |
81 | DRM_INFO("AST 2300 detected\n"); | 153 | DRM_INFO("AST 2300 detected\n"); |
82 | } else if (dev->pdev->revision >= 0x10) { | 154 | } else if (dev->pdev->revision >= 0x10) { |
83 | uint32_t data; | 155 | switch (scu_rev & 0x0300) { |
84 | ast_write32(ast, 0xf004, 0x1e6e0000); | ||
85 | ast_write32(ast, 0xf000, 0x1); | ||
86 | |||
87 | data = ast_read32(ast, 0x1207c); | ||
88 | switch (data & 0x0300) { | ||
89 | case 0x0200: | 156 | case 0x0200: |
90 | ast->chip = AST1100; | 157 | ast->chip = AST1100; |
91 | DRM_INFO("AST 1100 detected\n"); | 158 | DRM_INFO("AST 1100 detected\n"); |
@@ -110,26 +177,6 @@ static int ast_detect_chip(struct drm_device *dev, bool *need_post) | |||
110 | } | 177 | } |
111 | } | 178 | } |
112 | 179 | ||
113 | /* | ||
114 | * If VGA isn't enabled, we need to enable now or subsequent | ||
115 | * access to the scratch registers will fail. We also inform | ||
116 | * our caller that it needs to POST the chip | ||
117 | * (Assumption: VGA not enabled -> need to POST) | ||
118 | */ | ||
119 | if (!ast_is_vga_enabled(dev)) { | ||
120 | ast_enable_vga(dev); | ||
121 | ast_enable_mmio(dev); | ||
122 | DRM_INFO("VGA not enabled on entry, requesting chip POST\n"); | ||
123 | *need_post = true; | ||
124 | } else | ||
125 | *need_post = false; | ||
126 | |||
127 | /* Check P2A Access */ | ||
128 | ast->DisableP2A = true; | ||
129 | data = ast_read32(ast, 0xf004); | ||
130 | if (data != 0xFFFFFFFF) | ||
131 | ast->DisableP2A = false; | ||
132 | |||
133 | /* Check if we support wide screen */ | 180 | /* Check if we support wide screen */ |
134 | switch (ast->chip) { | 181 | switch (ast->chip) { |
135 | case AST1180: | 182 | case AST1180: |
@@ -146,17 +193,15 @@ static int ast_detect_chip(struct drm_device *dev, bool *need_post) | |||
146 | ast->support_wide_screen = true; | 193 | ast->support_wide_screen = true; |
147 | else { | 194 | else { |
148 | ast->support_wide_screen = false; | 195 | ast->support_wide_screen = false; |
149 | if (ast->DisableP2A == false) { | 196 | if (ast->chip == AST2300 && |
150 | /* Read SCU7c (silicon revision register) */ | 197 | (scu_rev & 0x300) == 0x0) /* ast1300 */ |
151 | ast_write32(ast, 0xf004, 0x1e6e0000); | 198 | ast->support_wide_screen = true; |
152 | ast_write32(ast, 0xf000, 0x1); | 199 | if (ast->chip == AST2400 && |
153 | data = ast_read32(ast, 0x1207c); | 200 | (scu_rev & 0x300) == 0x100) /* ast1400 */ |
154 | data &= 0x300; | 201 | ast->support_wide_screen = true; |
155 | if (ast->chip == AST2300 && data == 0x0) /* ast1300 */ | 202 | if (ast->chip == AST2500 && |
156 | ast->support_wide_screen = true; | 203 | scu_rev == 0x100) /* ast2510 */ |
157 | if (ast->chip == AST2400 && data == 0x100) /* ast1400 */ | 204 | ast->support_wide_screen = true; |
158 | ast->support_wide_screen = true; | ||
159 | } | ||
160 | } | 205 | } |
161 | break; | 206 | break; |
162 | } | 207 | } |
@@ -220,85 +265,121 @@ static int ast_detect_chip(struct drm_device *dev, bool *need_post) | |||
220 | 265 | ||
221 | static int ast_get_dram_info(struct drm_device *dev) | 266 | static int ast_get_dram_info(struct drm_device *dev) |
222 | { | 267 | { |
268 | struct device_node *np = dev->pdev->dev.of_node; | ||
223 | struct ast_private *ast = dev->dev_private; | 269 | struct ast_private *ast = dev->dev_private; |
224 | uint32_t data, data2; | 270 | uint32_t mcr_cfg, mcr_scu_mpll, mcr_scu_strap; |
225 | uint32_t denum, num, div, ref_pll; | 271 | uint32_t denum, num, div, ref_pll, dsel; |
226 | 272 | ||
227 | if (ast->DisableP2A) | 273 | switch (ast->config_mode) { |
228 | { | 274 | case ast_use_dt: |
229 | ast->dram_bus_width = 16; | 275 | /* |
230 | ast->dram_type = AST_DRAM_1Gx16; | 276 | * If some properties are missing, use reasonable |
231 | ast->mclk = 396; | 277 | * defaults for AST2400 |
232 | } | 278 | */ |
233 | else | 279 | if (of_property_read_u32(np, "aspeed,mcr-configuration", |
234 | { | 280 | &mcr_cfg)) |
281 | mcr_cfg = 0x00000577; | ||
282 | if (of_property_read_u32(np, "aspeed,mcr-scu-mpll", | ||
283 | &mcr_scu_mpll)) | ||
284 | mcr_scu_mpll = 0x000050C0; | ||
285 | if (of_property_read_u32(np, "aspeed,mcr-scu-strap", | ||
286 | &mcr_scu_strap)) | ||
287 | mcr_scu_strap = 0; | ||
288 | break; | ||
289 | case ast_use_p2a: | ||
235 | ast_write32(ast, 0xf004, 0x1e6e0000); | 290 | ast_write32(ast, 0xf004, 0x1e6e0000); |
236 | ast_write32(ast, 0xf000, 0x1); | 291 | ast_write32(ast, 0xf000, 0x1); |
237 | data = ast_read32(ast, 0x10004); | 292 | mcr_cfg = ast_read32(ast, 0x10004); |
238 | 293 | mcr_scu_mpll = ast_read32(ast, 0x10120); | |
239 | if (data & 0x40) | 294 | mcr_scu_strap = ast_read32(ast, 0x10170); |
240 | ast->dram_bus_width = 16; | 295 | break; |
296 | case ast_use_defaults: | ||
297 | default: | ||
298 | ast->dram_bus_width = 16; | ||
299 | ast->dram_type = AST_DRAM_1Gx16; | ||
300 | if (ast->chip == AST2500) | ||
301 | ast->mclk = 800; | ||
241 | else | 302 | else |
242 | ast->dram_bus_width = 32; | 303 | ast->mclk = 396; |
243 | 304 | return 0; | |
244 | if (ast->chip == AST2300 || ast->chip == AST2400) { | 305 | } |
245 | switch (data & 0x03) { | ||
246 | case 0: | ||
247 | ast->dram_type = AST_DRAM_512Mx16; | ||
248 | break; | ||
249 | default: | ||
250 | case 1: | ||
251 | ast->dram_type = AST_DRAM_1Gx16; | ||
252 | break; | ||
253 | case 2: | ||
254 | ast->dram_type = AST_DRAM_2Gx16; | ||
255 | break; | ||
256 | case 3: | ||
257 | ast->dram_type = AST_DRAM_4Gx16; | ||
258 | break; | ||
259 | } | ||
260 | } else { | ||
261 | switch (data & 0x0c) { | ||
262 | case 0: | ||
263 | case 4: | ||
264 | ast->dram_type = AST_DRAM_512Mx16; | ||
265 | break; | ||
266 | case 8: | ||
267 | if (data & 0x40) | ||
268 | ast->dram_type = AST_DRAM_1Gx16; | ||
269 | else | ||
270 | ast->dram_type = AST_DRAM_512Mx32; | ||
271 | break; | ||
272 | case 0xc: | ||
273 | ast->dram_type = AST_DRAM_1Gx32; | ||
274 | break; | ||
275 | } | ||
276 | } | ||
277 | 306 | ||
278 | data = ast_read32(ast, 0x10120); | 307 | if (mcr_cfg & 0x40) |
279 | data2 = ast_read32(ast, 0x10170); | 308 | ast->dram_bus_width = 16; |
280 | if (data2 & 0x2000) | 309 | else |
281 | ref_pll = 14318; | 310 | ast->dram_bus_width = 32; |
282 | else | ||
283 | ref_pll = 12000; | ||
284 | 311 | ||
285 | denum = data & 0x1f; | 312 | if (ast->chip == AST2500) { |
286 | num = (data & 0x3fe0) >> 5; | 313 | switch (mcr_cfg & 0x03) { |
287 | data = (data & 0xc000) >> 14; | 314 | case 0: |
288 | switch (data) { | 315 | ast->dram_type = AST_DRAM_1Gx16; |
289 | case 3: | ||
290 | div = 0x4; | ||
291 | break; | 316 | break; |
292 | case 2: | 317 | default: |
293 | case 1: | 318 | case 1: |
294 | div = 0x2; | 319 | ast->dram_type = AST_DRAM_2Gx16; |
320 | break; | ||
321 | case 2: | ||
322 | ast->dram_type = AST_DRAM_4Gx16; | ||
323 | break; | ||
324 | case 3: | ||
325 | ast->dram_type = AST_DRAM_8Gx16; | ||
326 | break; | ||
327 | } | ||
328 | } else if (ast->chip == AST2300 || ast->chip == AST2400) { | ||
329 | switch (mcr_cfg & 0x03) { | ||
330 | case 0: | ||
331 | ast->dram_type = AST_DRAM_512Mx16; | ||
295 | break; | 332 | break; |
296 | default: | 333 | default: |
297 | div = 0x1; | 334 | case 1: |
335 | ast->dram_type = AST_DRAM_1Gx16; | ||
336 | break; | ||
337 | case 2: | ||
338 | ast->dram_type = AST_DRAM_2Gx16; | ||
339 | break; | ||
340 | case 3: | ||
341 | ast->dram_type = AST_DRAM_4Gx16; | ||
342 | break; | ||
343 | } | ||
344 | } else { | ||
345 | switch (mcr_cfg & 0x0c) { | ||
346 | case 0: | ||
347 | case 4: | ||
348 | ast->dram_type = AST_DRAM_512Mx16; | ||
349 | break; | ||
350 | case 8: | ||
351 | if (mcr_cfg & 0x40) | ||
352 | ast->dram_type = AST_DRAM_1Gx16; | ||
353 | else | ||
354 | ast->dram_type = AST_DRAM_512Mx32; | ||
355 | break; | ||
356 | case 0xc: | ||
357 | ast->dram_type = AST_DRAM_1Gx32; | ||
298 | break; | 358 | break; |
299 | } | 359 | } |
300 | ast->mclk = ref_pll * (num + 2) / (denum + 2) * (div * 1000); | ||
301 | } | 360 | } |
361 | |||
362 | if (mcr_scu_strap & 0x2000) | ||
363 | ref_pll = 14318; | ||
364 | else | ||
365 | ref_pll = 12000; | ||
366 | |||
367 | denum = mcr_scu_mpll & 0x1f; | ||
368 | num = (mcr_scu_mpll & 0x3fe0) >> 5; | ||
369 | dsel = (mcr_scu_mpll & 0xc000) >> 14; | ||
370 | switch (dsel) { | ||
371 | case 3: | ||
372 | div = 0x4; | ||
373 | break; | ||
374 | case 2: | ||
375 | case 1: | ||
376 | div = 0x2; | ||
377 | break; | ||
378 | default: | ||
379 | div = 0x1; | ||
380 | break; | ||
381 | } | ||
382 | ast->mclk = ref_pll * (num + 2) / ((denum + 2) * (div * 1000)); | ||
302 | return 0; | 383 | return 0; |
303 | } | 384 | } |
304 | 385 | ||
@@ -437,17 +518,19 @@ int ast_driver_load(struct drm_device *dev, unsigned long flags) | |||
437 | 518 | ||
438 | ast_detect_chip(dev, &need_post); | 519 | ast_detect_chip(dev, &need_post); |
439 | 520 | ||
521 | if (need_post) | ||
522 | ast_post_gpu(dev); | ||
523 | |||
440 | if (ast->chip != AST1180) { | 524 | if (ast->chip != AST1180) { |
441 | ret = ast_get_dram_info(dev); | 525 | ret = ast_get_dram_info(dev); |
442 | if (ret) | 526 | if (ret) |
443 | goto out_free; | 527 | goto out_free; |
444 | ast->vram_size = ast_get_vram_info(dev); | 528 | ast->vram_size = ast_get_vram_info(dev); |
445 | DRM_INFO("dram %d %d %d %08x\n", ast->mclk, ast->dram_type, ast->dram_bus_width, ast->vram_size); | 529 | DRM_INFO("dram MCLK=%u Mhz type=%d bus_width=%d size=%08x\n", |
530 | ast->mclk, ast->dram_type, | ||
531 | ast->dram_bus_width, ast->vram_size); | ||
446 | } | 532 | } |
447 | 533 | ||
448 | if (need_post) | ||
449 | ast_post_gpu(dev); | ||
450 | |||
451 | ret = ast_mm_init(ast); | 534 | ret = ast_mm_init(ast); |
452 | if (ret) | 535 | if (ret) |
453 | goto out_free; | 536 | goto out_free; |
@@ -465,6 +548,7 @@ int ast_driver_load(struct drm_device *dev, unsigned long flags) | |||
465 | ast->chip == AST2200 || | 548 | ast->chip == AST2200 || |
466 | ast->chip == AST2300 || | 549 | ast->chip == AST2300 || |
467 | ast->chip == AST2400 || | 550 | ast->chip == AST2400 || |
551 | ast->chip == AST2500 || | ||
468 | ast->chip == AST1180) { | 552 | ast->chip == AST1180) { |
469 | dev->mode_config.max_width = 1920; | 553 | dev->mode_config.max_width = 1920; |
470 | dev->mode_config.max_height = 2048; | 554 | dev->mode_config.max_height = 2048; |
diff --git a/drivers/gpu/drm/ast/ast_mode.c b/drivers/gpu/drm/ast/ast_mode.c index 606cb40f6c7c..47b78e52691c 100644 --- a/drivers/gpu/drm/ast/ast_mode.c +++ b/drivers/gpu/drm/ast/ast_mode.c | |||
@@ -81,9 +81,9 @@ static bool ast_get_vbios_mode_info(struct drm_crtc *crtc, struct drm_display_mo | |||
81 | struct ast_private *ast = crtc->dev->dev_private; | 81 | struct ast_private *ast = crtc->dev->dev_private; |
82 | const struct drm_framebuffer *fb = crtc->primary->fb; | 82 | const struct drm_framebuffer *fb = crtc->primary->fb; |
83 | u32 refresh_rate_index = 0, mode_id, color_index, refresh_rate; | 83 | u32 refresh_rate_index = 0, mode_id, color_index, refresh_rate; |
84 | const struct ast_vbios_enhtable *best = NULL; | ||
84 | u32 hborder, vborder; | 85 | u32 hborder, vborder; |
85 | bool check_sync; | 86 | bool check_sync; |
86 | struct ast_vbios_enhtable *best = NULL; | ||
87 | 87 | ||
88 | switch (fb->format->cpp[0] * 8) { | 88 | switch (fb->format->cpp[0] * 8) { |
89 | case 8: | 89 | case 8: |
@@ -147,7 +147,7 @@ static bool ast_get_vbios_mode_info(struct drm_crtc *crtc, struct drm_display_mo | |||
147 | refresh_rate = drm_mode_vrefresh(mode); | 147 | refresh_rate = drm_mode_vrefresh(mode); |
148 | check_sync = vbios_mode->enh_table->flags & WideScreenMode; | 148 | check_sync = vbios_mode->enh_table->flags & WideScreenMode; |
149 | do { | 149 | do { |
150 | struct ast_vbios_enhtable *loop = vbios_mode->enh_table; | 150 | const struct ast_vbios_enhtable *loop = vbios_mode->enh_table; |
151 | 151 | ||
152 | while (loop->refresh_rate != 0xff) { | 152 | while (loop->refresh_rate != 0xff) { |
153 | if ((check_sync) && | 153 | if ((check_sync) && |
@@ -227,7 +227,7 @@ static void ast_set_std_reg(struct drm_crtc *crtc, struct drm_display_mode *mode | |||
227 | struct ast_vbios_mode_info *vbios_mode) | 227 | struct ast_vbios_mode_info *vbios_mode) |
228 | { | 228 | { |
229 | struct ast_private *ast = crtc->dev->dev_private; | 229 | struct ast_private *ast = crtc->dev->dev_private; |
230 | struct ast_vbios_stdtable *stdtable; | 230 | const struct ast_vbios_stdtable *stdtable; |
231 | u32 i; | 231 | u32 i; |
232 | u8 jreg; | 232 | u8 jreg; |
233 | 233 | ||
@@ -273,7 +273,11 @@ static void ast_set_crtc_reg(struct drm_crtc *crtc, struct drm_display_mode *mod | |||
273 | { | 273 | { |
274 | struct ast_private *ast = crtc->dev->dev_private; | 274 | struct ast_private *ast = crtc->dev->dev_private; |
275 | u8 jreg05 = 0, jreg07 = 0, jreg09 = 0, jregAC = 0, jregAD = 0, jregAE = 0; | 275 | u8 jreg05 = 0, jreg07 = 0, jreg09 = 0, jregAC = 0, jregAD = 0, jregAE = 0; |
276 | u16 temp; | 276 | u16 temp, precache = 0; |
277 | |||
278 | if ((ast->chip == AST2500) && | ||
279 | (vbios_mode->enh_table->flags & AST2500PreCatchCRT)) | ||
280 | precache = 40; | ||
277 | 281 | ||
278 | ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0x11, 0x7f, 0x00); | 282 | ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0x11, 0x7f, 0x00); |
279 | 283 | ||
@@ -299,12 +303,12 @@ static void ast_set_crtc_reg(struct drm_crtc *crtc, struct drm_display_mode *mod | |||
299 | jregAD |= 0x01; /* HBE D[5] */ | 303 | jregAD |= 0x01; /* HBE D[5] */ |
300 | ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0x03, 0xE0, (temp & 0x1f)); | 304 | ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0x03, 0xE0, (temp & 0x1f)); |
301 | 305 | ||
302 | temp = (mode->crtc_hsync_start >> 3) - 1; | 306 | temp = ((mode->crtc_hsync_start-precache) >> 3) - 1; |
303 | if (temp & 0x100) | 307 | if (temp & 0x100) |
304 | jregAC |= 0x40; /* HRS D[5] */ | 308 | jregAC |= 0x40; /* HRS D[5] */ |
305 | ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0x04, 0x00, temp); | 309 | ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0x04, 0x00, temp); |
306 | 310 | ||
307 | temp = ((mode->crtc_hsync_end >> 3) - 1) & 0x3f; | 311 | temp = (((mode->crtc_hsync_end-precache) >> 3) - 1) & 0x3f; |
308 | if (temp & 0x20) | 312 | if (temp & 0x20) |
309 | jregAD |= 0x04; /* HRE D[5] */ | 313 | jregAD |= 0x04; /* HRE D[5] */ |
310 | ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0x05, 0x60, (u8)((temp & 0x1f) | jreg05)); | 314 | ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0x05, 0x60, (u8)((temp & 0x1f) | jreg05)); |
@@ -365,6 +369,11 @@ static void ast_set_crtc_reg(struct drm_crtc *crtc, struct drm_display_mode *mod | |||
365 | ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0x09, 0xdf, jreg09); | 369 | ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0x09, 0xdf, jreg09); |
366 | ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xAE, 0x00, (jregAE | 0x80)); | 370 | ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xAE, 0x00, (jregAE | 0x80)); |
367 | 371 | ||
372 | if (precache) | ||
373 | ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xb6, 0x3f, 0x80); | ||
374 | else | ||
375 | ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xb6, 0x3f, 0x00); | ||
376 | |||
368 | ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0x11, 0x7f, 0x80); | 377 | ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0x11, 0x7f, 0x80); |
369 | } | 378 | } |
370 | 379 | ||
@@ -384,14 +393,18 @@ static void ast_set_dclk_reg(struct drm_device *dev, struct drm_display_mode *mo | |||
384 | struct ast_vbios_mode_info *vbios_mode) | 393 | struct ast_vbios_mode_info *vbios_mode) |
385 | { | 394 | { |
386 | struct ast_private *ast = dev->dev_private; | 395 | struct ast_private *ast = dev->dev_private; |
387 | struct ast_vbios_dclk_info *clk_info; | 396 | const struct ast_vbios_dclk_info *clk_info; |
388 | 397 | ||
389 | clk_info = &dclk_table[vbios_mode->enh_table->dclk_index]; | 398 | if (ast->chip == AST2500) |
399 | clk_info = &dclk_table_ast2500[vbios_mode->enh_table->dclk_index]; | ||
400 | else | ||
401 | clk_info = &dclk_table[vbios_mode->enh_table->dclk_index]; | ||
390 | 402 | ||
391 | ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xc0, 0x00, clk_info->param1); | 403 | ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xc0, 0x00, clk_info->param1); |
392 | ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xc1, 0x00, clk_info->param2); | 404 | ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xc1, 0x00, clk_info->param2); |
393 | ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xbb, 0x0f, | 405 | ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xbb, 0x0f, |
394 | (clk_info->param3 & 0x80) | ((clk_info->param3 & 0x3) << 4)); | 406 | (clk_info->param3 & 0xc0) | |
407 | ((clk_info->param3 & 0x3) << 4)); | ||
395 | } | 408 | } |
396 | 409 | ||
397 | static void ast_set_ext_reg(struct drm_crtc *crtc, struct drm_display_mode *mode, | 410 | static void ast_set_ext_reg(struct drm_crtc *crtc, struct drm_display_mode *mode, |
@@ -425,7 +438,8 @@ static void ast_set_ext_reg(struct drm_crtc *crtc, struct drm_display_mode *mode | |||
425 | ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xa8, 0xfd, jregA8); | 438 | ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xa8, 0xfd, jregA8); |
426 | 439 | ||
427 | /* Set Threshold */ | 440 | /* Set Threshold */ |
428 | if (ast->chip == AST2300 || ast->chip == AST2400) { | 441 | if (ast->chip == AST2300 || ast->chip == AST2400 || |
442 | ast->chip == AST2500) { | ||
429 | ast_set_index_reg(ast, AST_IO_CRTC_PORT, 0xa7, 0x78); | 443 | ast_set_index_reg(ast, AST_IO_CRTC_PORT, 0xa7, 0x78); |
430 | ast_set_index_reg(ast, AST_IO_CRTC_PORT, 0xa6, 0x60); | 444 | ast_set_index_reg(ast, AST_IO_CRTC_PORT, 0xa6, 0x60); |
431 | } else if (ast->chip == AST2100 || | 445 | } else if (ast->chip == AST2100 || |
@@ -800,7 +814,9 @@ static int ast_mode_valid(struct drm_connector *connector, | |||
800 | if ((mode->hdisplay == 1600) && (mode->vdisplay == 900)) | 814 | if ((mode->hdisplay == 1600) && (mode->vdisplay == 900)) |
801 | return MODE_OK; | 815 | return MODE_OK; |
802 | 816 | ||
803 | if ((ast->chip == AST2100) || (ast->chip == AST2200) || (ast->chip == AST2300) || (ast->chip == AST2400) || (ast->chip == AST1180)) { | 817 | if ((ast->chip == AST2100) || (ast->chip == AST2200) || |
818 | (ast->chip == AST2300) || (ast->chip == AST2400) || | ||
819 | (ast->chip == AST2500) || (ast->chip == AST1180)) { | ||
804 | if ((mode->hdisplay == 1920) && (mode->vdisplay == 1080)) | 820 | if ((mode->hdisplay == 1920) && (mode->vdisplay == 1080)) |
805 | return MODE_OK; | 821 | return MODE_OK; |
806 | 822 | ||
diff --git a/drivers/gpu/drm/ast/ast_post.c b/drivers/gpu/drm/ast/ast_post.c index 5331ee1df086..f7d421359d56 100644 --- a/drivers/gpu/drm/ast/ast_post.c +++ b/drivers/gpu/drm/ast/ast_post.c | |||
@@ -31,7 +31,8 @@ | |||
31 | 31 | ||
32 | #include "ast_dram_tables.h" | 32 | #include "ast_dram_tables.h" |
33 | 33 | ||
34 | static void ast_init_dram_2300(struct drm_device *dev); | 34 | static void ast_post_chip_2300(struct drm_device *dev); |
35 | static void ast_post_chip_2500(struct drm_device *dev); | ||
35 | 36 | ||
36 | void ast_enable_vga(struct drm_device *dev) | 37 | void ast_enable_vga(struct drm_device *dev) |
37 | { | 38 | { |
@@ -58,13 +59,9 @@ bool ast_is_vga_enabled(struct drm_device *dev) | |||
58 | /* TODO 1180 */ | 59 | /* TODO 1180 */ |
59 | } else { | 60 | } else { |
60 | ch = ast_io_read8(ast, AST_IO_VGA_ENABLE_PORT); | 61 | ch = ast_io_read8(ast, AST_IO_VGA_ENABLE_PORT); |
61 | if (ch) { | 62 | return !!(ch & 0x01); |
62 | ast_open_key(ast); | ||
63 | ch = ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xb6, 0xff); | ||
64 | return ch & 0x04; | ||
65 | } | ||
66 | } | 63 | } |
67 | return 0; | 64 | return false; |
68 | } | 65 | } |
69 | 66 | ||
70 | static const u8 extreginfo[] = { 0x0f, 0x04, 0x1c, 0xff }; | 67 | static const u8 extreginfo[] = { 0x0f, 0x04, 0x1c, 0xff }; |
@@ -79,10 +76,11 @@ ast_set_def_ext_reg(struct drm_device *dev) | |||
79 | const u8 *ext_reg_info; | 76 | const u8 *ext_reg_info; |
80 | 77 | ||
81 | /* reset scratch */ | 78 | /* reset scratch */ |
82 | for (i = 0x81; i <= 0x8f; i++) | 79 | for (i = 0x81; i <= 0x9f; i++) |
83 | ast_set_index_reg(ast, AST_IO_CRTC_PORT, i, 0x00); | 80 | ast_set_index_reg(ast, AST_IO_CRTC_PORT, i, 0x00); |
84 | 81 | ||
85 | if (ast->chip == AST2300 || ast->chip == AST2400) { | 82 | if (ast->chip == AST2300 || ast->chip == AST2400 || |
83 | ast->chip == AST2500) { | ||
86 | if (dev->pdev->revision >= 0x20) | 84 | if (dev->pdev->revision >= 0x20) |
87 | ext_reg_info = extreginfo_ast2300; | 85 | ext_reg_info = extreginfo_ast2300; |
88 | else | 86 | else |
@@ -106,7 +104,8 @@ ast_set_def_ext_reg(struct drm_device *dev) | |||
106 | 104 | ||
107 | /* Enable RAMDAC for A1 */ | 105 | /* Enable RAMDAC for A1 */ |
108 | reg = 0x04; | 106 | reg = 0x04; |
109 | if (ast->chip == AST2300 || ast->chip == AST2400) | 107 | if (ast->chip == AST2300 || ast->chip == AST2400 || |
108 | ast->chip == AST2500) | ||
110 | reg |= 0x20; | 109 | reg |= 0x20; |
111 | ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xb6, 0xff, reg); | 110 | ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xb6, 0xff, reg); |
112 | } | 111 | } |
@@ -375,21 +374,20 @@ void ast_post_gpu(struct drm_device *dev) | |||
375 | pci_write_config_dword(ast->dev->pdev, 0x04, reg); | 374 | pci_write_config_dword(ast->dev->pdev, 0x04, reg); |
376 | 375 | ||
377 | ast_enable_vga(dev); | 376 | ast_enable_vga(dev); |
378 | ast_enable_mmio(dev); | ||
379 | ast_open_key(ast); | 377 | ast_open_key(ast); |
378 | ast_enable_mmio(dev); | ||
380 | ast_set_def_ext_reg(dev); | 379 | ast_set_def_ext_reg(dev); |
381 | 380 | ||
382 | if (ast->DisableP2A == false) | 381 | if (ast->config_mode == ast_use_p2a) { |
383 | { | 382 | if (ast->chip == AST2500) |
384 | if (ast->chip == AST2300 || ast->chip == AST2400) | 383 | ast_post_chip_2500(dev); |
385 | ast_init_dram_2300(dev); | 384 | else if (ast->chip == AST2300 || ast->chip == AST2400) |
385 | ast_post_chip_2300(dev); | ||
386 | else | 386 | else |
387 | ast_init_dram_reg(dev); | 387 | ast_init_dram_reg(dev); |
388 | 388 | ||
389 | ast_init_3rdtx(dev); | 389 | ast_init_3rdtx(dev); |
390 | } | 390 | } else { |
391 | else | ||
392 | { | ||
393 | if (ast->tx_chip_type != AST_TX_NONE) | 391 | if (ast->tx_chip_type != AST_TX_NONE) |
394 | ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xa3, 0xcf, 0x80); /* Enable DVO */ | 392 | ast_set_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xa3, 0xcf, 0x80); /* Enable DVO */ |
395 | } | 393 | } |
@@ -448,85 +446,70 @@ static const u32 pattern[8] = { | |||
448 | 0x7C61D253 | 446 | 0x7C61D253 |
449 | }; | 447 | }; |
450 | 448 | ||
451 | static int mmc_test_burst(struct ast_private *ast, u32 datagen) | 449 | static bool mmc_test(struct ast_private *ast, u32 datagen, u8 test_ctl) |
452 | { | 450 | { |
453 | u32 data, timeout; | 451 | u32 data, timeout; |
454 | 452 | ||
455 | ast_moutdwm(ast, 0x1e6e0070, 0x00000000); | 453 | ast_moutdwm(ast, 0x1e6e0070, 0x00000000); |
456 | ast_moutdwm(ast, 0x1e6e0070, 0x000000c1 | (datagen << 3)); | 454 | ast_moutdwm(ast, 0x1e6e0070, (datagen << 3) | test_ctl); |
457 | timeout = 0; | 455 | timeout = 0; |
458 | do { | 456 | do { |
459 | data = ast_mindwm(ast, 0x1e6e0070) & 0x3000; | 457 | data = ast_mindwm(ast, 0x1e6e0070) & 0x3000; |
460 | if (data & 0x2000) { | 458 | if (data & 0x2000) |
461 | return 0; | 459 | return false; |
462 | } | ||
463 | if (++timeout > TIMEOUT) { | 460 | if (++timeout > TIMEOUT) { |
464 | ast_moutdwm(ast, 0x1e6e0070, 0x00000000); | 461 | ast_moutdwm(ast, 0x1e6e0070, 0x00000000); |
465 | return 0; | 462 | return false; |
466 | } | 463 | } |
467 | } while (!data); | 464 | } while (!data); |
468 | ast_moutdwm(ast, 0x1e6e0070, 0x00000000); | 465 | ast_moutdwm(ast, 0x1e6e0070, 0x0); |
469 | return 1; | 466 | return true; |
470 | } | 467 | } |
471 | 468 | ||
472 | static int mmc_test_burst2(struct ast_private *ast, u32 datagen) | 469 | static u32 mmc_test2(struct ast_private *ast, u32 datagen, u8 test_ctl) |
473 | { | 470 | { |
474 | u32 data, timeout; | 471 | u32 data, timeout; |
475 | 472 | ||
476 | ast_moutdwm(ast, 0x1e6e0070, 0x00000000); | 473 | ast_moutdwm(ast, 0x1e6e0070, 0x00000000); |
477 | ast_moutdwm(ast, 0x1e6e0070, 0x00000041 | (datagen << 3)); | 474 | ast_moutdwm(ast, 0x1e6e0070, (datagen << 3) | test_ctl); |
478 | timeout = 0; | 475 | timeout = 0; |
479 | do { | 476 | do { |
480 | data = ast_mindwm(ast, 0x1e6e0070) & 0x1000; | 477 | data = ast_mindwm(ast, 0x1e6e0070) & 0x1000; |
481 | if (++timeout > TIMEOUT) { | 478 | if (++timeout > TIMEOUT) { |
482 | ast_moutdwm(ast, 0x1e6e0070, 0x0); | 479 | ast_moutdwm(ast, 0x1e6e0070, 0x0); |
483 | return -1; | 480 | return 0xffffffff; |
484 | } | 481 | } |
485 | } while (!data); | 482 | } while (!data); |
486 | data = ast_mindwm(ast, 0x1e6e0078); | 483 | data = ast_mindwm(ast, 0x1e6e0078); |
487 | data = (data | (data >> 16)) & 0xffff; | 484 | data = (data | (data >> 16)) & 0xffff; |
488 | ast_moutdwm(ast, 0x1e6e0070, 0x0); | 485 | ast_moutdwm(ast, 0x1e6e0070, 0x00000000); |
489 | return data; | 486 | return data; |
490 | } | 487 | } |
491 | 488 | ||
492 | static int mmc_test_single(struct ast_private *ast, u32 datagen) | 489 | |
490 | static bool mmc_test_burst(struct ast_private *ast, u32 datagen) | ||
493 | { | 491 | { |
494 | u32 data, timeout; | 492 | return mmc_test(ast, datagen, 0xc1); |
493 | } | ||
495 | 494 | ||
496 | ast_moutdwm(ast, 0x1e6e0070, 0x00000000); | 495 | static u32 mmc_test_burst2(struct ast_private *ast, u32 datagen) |
497 | ast_moutdwm(ast, 0x1e6e0070, 0x000000c5 | (datagen << 3)); | 496 | { |
498 | timeout = 0; | 497 | return mmc_test2(ast, datagen, 0x41); |
499 | do { | ||
500 | data = ast_mindwm(ast, 0x1e6e0070) & 0x3000; | ||
501 | if (data & 0x2000) | ||
502 | return 0; | ||
503 | if (++timeout > TIMEOUT) { | ||
504 | ast_moutdwm(ast, 0x1e6e0070, 0x0); | ||
505 | return 0; | ||
506 | } | ||
507 | } while (!data); | ||
508 | ast_moutdwm(ast, 0x1e6e0070, 0x0); | ||
509 | return 1; | ||
510 | } | 498 | } |
511 | 499 | ||
512 | static int mmc_test_single2(struct ast_private *ast, u32 datagen) | 500 | static bool mmc_test_single(struct ast_private *ast, u32 datagen) |
513 | { | 501 | { |
514 | u32 data, timeout; | 502 | return mmc_test(ast, datagen, 0xc5); |
503 | } | ||
515 | 504 | ||
516 | ast_moutdwm(ast, 0x1e6e0070, 0x00000000); | 505 | static u32 mmc_test_single2(struct ast_private *ast, u32 datagen) |
517 | ast_moutdwm(ast, 0x1e6e0070, 0x00000005 | (datagen << 3)); | 506 | { |
518 | timeout = 0; | 507 | return mmc_test2(ast, datagen, 0x05); |
519 | do { | 508 | } |
520 | data = ast_mindwm(ast, 0x1e6e0070) & 0x1000; | 509 | |
521 | if (++timeout > TIMEOUT) { | 510 | static bool mmc_test_single_2500(struct ast_private *ast, u32 datagen) |
522 | ast_moutdwm(ast, 0x1e6e0070, 0x0); | 511 | { |
523 | return -1; | 512 | return mmc_test(ast, datagen, 0x85); |
524 | } | ||
525 | } while (!data); | ||
526 | data = ast_mindwm(ast, 0x1e6e0078); | ||
527 | data = (data | (data >> 16)) & 0xffff; | ||
528 | ast_moutdwm(ast, 0x1e6e0070, 0x0); | ||
529 | return data; | ||
530 | } | 513 | } |
531 | 514 | ||
532 | static int cbr_test(struct ast_private *ast) | 515 | static int cbr_test(struct ast_private *ast) |
@@ -604,16 +587,16 @@ static u32 cbr_scan2(struct ast_private *ast) | |||
604 | return data2; | 587 | return data2; |
605 | } | 588 | } |
606 | 589 | ||
607 | static u32 cbr_test3(struct ast_private *ast) | 590 | static bool cbr_test3(struct ast_private *ast) |
608 | { | 591 | { |
609 | if (!mmc_test_burst(ast, 0)) | 592 | if (!mmc_test_burst(ast, 0)) |
610 | return 0; | 593 | return false; |
611 | if (!mmc_test_single(ast, 0)) | 594 | if (!mmc_test_single(ast, 0)) |
612 | return 0; | 595 | return false; |
613 | return 1; | 596 | return true; |
614 | } | 597 | } |
615 | 598 | ||
616 | static u32 cbr_scan3(struct ast_private *ast) | 599 | static bool cbr_scan3(struct ast_private *ast) |
617 | { | 600 | { |
618 | u32 patcnt, loop; | 601 | u32 patcnt, loop; |
619 | 602 | ||
@@ -624,9 +607,9 @@ static u32 cbr_scan3(struct ast_private *ast) | |||
624 | break; | 607 | break; |
625 | } | 608 | } |
626 | if (loop == 2) | 609 | if (loop == 2) |
627 | return 0; | 610 | return false; |
628 | } | 611 | } |
629 | return 1; | 612 | return true; |
630 | } | 613 | } |
631 | 614 | ||
632 | static bool finetuneDQI_L(struct ast_private *ast, struct ast2300_dram_param *param) | 615 | static bool finetuneDQI_L(struct ast_private *ast, struct ast2300_dram_param *param) |
@@ -1612,7 +1595,7 @@ ddr2_init_start: | |||
1612 | 1595 | ||
1613 | } | 1596 | } |
1614 | 1597 | ||
1615 | static void ast_init_dram_2300(struct drm_device *dev) | 1598 | static void ast_post_chip_2300(struct drm_device *dev) |
1616 | { | 1599 | { |
1617 | struct ast_private *ast = dev->dev_private; | 1600 | struct ast_private *ast = dev->dev_private; |
1618 | struct ast2300_dram_param param; | 1601 | struct ast2300_dram_param param; |
@@ -1638,12 +1621,44 @@ static void ast_init_dram_2300(struct drm_device *dev) | |||
1638 | temp |= 0x73; | 1621 | temp |= 0x73; |
1639 | ast_write32(ast, 0x12008, temp); | 1622 | ast_write32(ast, 0x12008, temp); |
1640 | 1623 | ||
1624 | param.dram_freq = 396; | ||
1641 | param.dram_type = AST_DDR3; | 1625 | param.dram_type = AST_DDR3; |
1626 | temp = ast_mindwm(ast, 0x1e6e2070); | ||
1642 | if (temp & 0x01000000) | 1627 | if (temp & 0x01000000) |
1643 | param.dram_type = AST_DDR2; | 1628 | param.dram_type = AST_DDR2; |
1644 | param.dram_chipid = ast->dram_type; | 1629 | switch (temp & 0x18000000) { |
1645 | param.dram_freq = ast->mclk; | 1630 | case 0: |
1646 | param.vram_size = ast->vram_size; | 1631 | param.dram_chipid = AST_DRAM_512Mx16; |
1632 | break; | ||
1633 | default: | ||
1634 | case 0x08000000: | ||
1635 | param.dram_chipid = AST_DRAM_1Gx16; | ||
1636 | break; | ||
1637 | case 0x10000000: | ||
1638 | param.dram_chipid = AST_DRAM_2Gx16; | ||
1639 | break; | ||
1640 | case 0x18000000: | ||
1641 | param.dram_chipid = AST_DRAM_4Gx16; | ||
1642 | break; | ||
1643 | } | ||
1644 | switch (temp & 0x0c) { | ||
1645 | default: | ||
1646 | case 0x00: | ||
1647 | param.vram_size = AST_VIDMEM_SIZE_8M; | ||
1648 | break; | ||
1649 | |||
1650 | case 0x04: | ||
1651 | param.vram_size = AST_VIDMEM_SIZE_16M; | ||
1652 | break; | ||
1653 | |||
1654 | case 0x08: | ||
1655 | param.vram_size = AST_VIDMEM_SIZE_32M; | ||
1656 | break; | ||
1657 | |||
1658 | case 0x0c: | ||
1659 | param.vram_size = AST_VIDMEM_SIZE_64M; | ||
1660 | break; | ||
1661 | } | ||
1647 | 1662 | ||
1648 | if (param.dram_type == AST_DDR3) { | 1663 | if (param.dram_type == AST_DDR3) { |
1649 | get_ddr3_info(ast, ¶m); | 1664 | get_ddr3_info(ast, ¶m); |
@@ -1663,3 +1678,404 @@ static void ast_init_dram_2300(struct drm_device *dev) | |||
1663 | } while ((reg & 0x40) == 0); | 1678 | } while ((reg & 0x40) == 0); |
1664 | } | 1679 | } |
1665 | 1680 | ||
1681 | static bool cbr_test_2500(struct ast_private *ast) | ||
1682 | { | ||
1683 | ast_moutdwm(ast, 0x1E6E0074, 0x0000FFFF); | ||
1684 | ast_moutdwm(ast, 0x1E6E007C, 0xFF00FF00); | ||
1685 | if (!mmc_test_burst(ast, 0)) | ||
1686 | return false; | ||
1687 | if (!mmc_test_single_2500(ast, 0)) | ||
1688 | return false; | ||
1689 | return true; | ||
1690 | } | ||
1691 | |||
1692 | static bool ddr_test_2500(struct ast_private *ast) | ||
1693 | { | ||
1694 | ast_moutdwm(ast, 0x1E6E0074, 0x0000FFFF); | ||
1695 | ast_moutdwm(ast, 0x1E6E007C, 0xFF00FF00); | ||
1696 | if (!mmc_test_burst(ast, 0)) | ||
1697 | return false; | ||
1698 | if (!mmc_test_burst(ast, 1)) | ||
1699 | return false; | ||
1700 | if (!mmc_test_burst(ast, 2)) | ||
1701 | return false; | ||
1702 | if (!mmc_test_burst(ast, 3)) | ||
1703 | return false; | ||
1704 | if (!mmc_test_single_2500(ast, 0)) | ||
1705 | return false; | ||
1706 | return true; | ||
1707 | } | ||
1708 | |||
1709 | static void ddr_init_common_2500(struct ast_private *ast) | ||
1710 | { | ||
1711 | ast_moutdwm(ast, 0x1E6E0034, 0x00020080); | ||
1712 | ast_moutdwm(ast, 0x1E6E0008, 0x2003000F); | ||
1713 | ast_moutdwm(ast, 0x1E6E0038, 0x00000FFF); | ||
1714 | ast_moutdwm(ast, 0x1E6E0040, 0x88448844); | ||
1715 | ast_moutdwm(ast, 0x1E6E0044, 0x24422288); | ||
1716 | ast_moutdwm(ast, 0x1E6E0048, 0x22222222); | ||
1717 | ast_moutdwm(ast, 0x1E6E004C, 0x22222222); | ||
1718 | ast_moutdwm(ast, 0x1E6E0050, 0x80000000); | ||
1719 | ast_moutdwm(ast, 0x1E6E0208, 0x00000000); | ||
1720 | ast_moutdwm(ast, 0x1E6E0218, 0x00000000); | ||
1721 | ast_moutdwm(ast, 0x1E6E0220, 0x00000000); | ||
1722 | ast_moutdwm(ast, 0x1E6E0228, 0x00000000); | ||
1723 | ast_moutdwm(ast, 0x1E6E0230, 0x00000000); | ||
1724 | ast_moutdwm(ast, 0x1E6E02A8, 0x00000000); | ||
1725 | ast_moutdwm(ast, 0x1E6E02B0, 0x00000000); | ||
1726 | ast_moutdwm(ast, 0x1E6E0240, 0x86000000); | ||
1727 | ast_moutdwm(ast, 0x1E6E0244, 0x00008600); | ||
1728 | ast_moutdwm(ast, 0x1E6E0248, 0x80000000); | ||
1729 | ast_moutdwm(ast, 0x1E6E024C, 0x80808080); | ||
1730 | } | ||
1731 | |||
1732 | static void ddr_phy_init_2500(struct ast_private *ast) | ||
1733 | { | ||
1734 | u32 data, pass, timecnt; | ||
1735 | |||
1736 | pass = 0; | ||
1737 | ast_moutdwm(ast, 0x1E6E0060, 0x00000005); | ||
1738 | while (!pass) { | ||
1739 | for (timecnt = 0; timecnt < TIMEOUT; timecnt++) { | ||
1740 | data = ast_mindwm(ast, 0x1E6E0060) & 0x1; | ||
1741 | if (!data) | ||
1742 | break; | ||
1743 | } | ||
1744 | if (timecnt != TIMEOUT) { | ||
1745 | data = ast_mindwm(ast, 0x1E6E0300) & 0x000A0000; | ||
1746 | if (!data) | ||
1747 | pass = 1; | ||
1748 | } | ||
1749 | if (!pass) { | ||
1750 | ast_moutdwm(ast, 0x1E6E0060, 0x00000000); | ||
1751 | udelay(10); /* delay 10 us */ | ||
1752 | ast_moutdwm(ast, 0x1E6E0060, 0x00000005); | ||
1753 | } | ||
1754 | } | ||
1755 | |||
1756 | ast_moutdwm(ast, 0x1E6E0060, 0x00000006); | ||
1757 | } | ||
1758 | |||
1759 | /* | ||
1760 | * Check DRAM Size | ||
1761 | * 1Gb : 0x80000000 ~ 0x87FFFFFF | ||
1762 | * 2Gb : 0x80000000 ~ 0x8FFFFFFF | ||
1763 | * 4Gb : 0x80000000 ~ 0x9FFFFFFF | ||
1764 | * 8Gb : 0x80000000 ~ 0xBFFFFFFF | ||
1765 | */ | ||
1766 | static void check_dram_size_2500(struct ast_private *ast, u32 tRFC) | ||
1767 | { | ||
1768 | u32 reg_04, reg_14; | ||
1769 | |||
1770 | reg_04 = ast_mindwm(ast, 0x1E6E0004) & 0xfffffffc; | ||
1771 | reg_14 = ast_mindwm(ast, 0x1E6E0014) & 0xffffff00; | ||
1772 | |||
1773 | ast_moutdwm(ast, 0xA0100000, 0x41424344); | ||
1774 | ast_moutdwm(ast, 0x90100000, 0x35363738); | ||
1775 | ast_moutdwm(ast, 0x88100000, 0x292A2B2C); | ||
1776 | ast_moutdwm(ast, 0x80100000, 0x1D1E1F10); | ||
1777 | |||
1778 | /* Check 8Gbit */ | ||
1779 | if (ast_mindwm(ast, 0xA0100000) == 0x41424344) { | ||
1780 | reg_04 |= 0x03; | ||
1781 | reg_14 |= (tRFC >> 24) & 0xFF; | ||
1782 | /* Check 4Gbit */ | ||
1783 | } else if (ast_mindwm(ast, 0x90100000) == 0x35363738) { | ||
1784 | reg_04 |= 0x02; | ||
1785 | reg_14 |= (tRFC >> 16) & 0xFF; | ||
1786 | /* Check 2Gbit */ | ||
1787 | } else if (ast_mindwm(ast, 0x88100000) == 0x292A2B2C) { | ||
1788 | reg_04 |= 0x01; | ||
1789 | reg_14 |= (tRFC >> 8) & 0xFF; | ||
1790 | } else { | ||
1791 | reg_14 |= tRFC & 0xFF; | ||
1792 | } | ||
1793 | ast_moutdwm(ast, 0x1E6E0004, reg_04); | ||
1794 | ast_moutdwm(ast, 0x1E6E0014, reg_14); | ||
1795 | } | ||
1796 | |||
1797 | static void enable_cache_2500(struct ast_private *ast) | ||
1798 | { | ||
1799 | u32 reg_04, data; | ||
1800 | |||
1801 | reg_04 = ast_mindwm(ast, 0x1E6E0004); | ||
1802 | ast_moutdwm(ast, 0x1E6E0004, reg_04 | 0x1000); | ||
1803 | |||
1804 | do | ||
1805 | data = ast_mindwm(ast, 0x1E6E0004); | ||
1806 | while (!(data & 0x80000)); | ||
1807 | ast_moutdwm(ast, 0x1E6E0004, reg_04 | 0x400); | ||
1808 | } | ||
1809 | |||
1810 | static void set_mpll_2500(struct ast_private *ast) | ||
1811 | { | ||
1812 | u32 addr, data, param; | ||
1813 | |||
1814 | /* Reset MMC */ | ||
1815 | ast_moutdwm(ast, 0x1E6E0000, 0xFC600309); | ||
1816 | ast_moutdwm(ast, 0x1E6E0034, 0x00020080); | ||
1817 | for (addr = 0x1e6e0004; addr < 0x1e6e0090;) { | ||
1818 | ast_moutdwm(ast, addr, 0x0); | ||
1819 | addr += 4; | ||
1820 | } | ||
1821 | ast_moutdwm(ast, 0x1E6E0034, 0x00020000); | ||
1822 | |||
1823 | ast_moutdwm(ast, 0x1E6E2000, 0x1688A8A8); | ||
1824 | data = ast_mindwm(ast, 0x1E6E2070) & 0x00800000; | ||
1825 | if (data) { | ||
1826 | /* CLKIN = 25MHz */ | ||
1827 | param = 0x930023E0; | ||
1828 | ast_moutdwm(ast, 0x1E6E2160, 0x00011320); | ||
1829 | } else { | ||
1830 | /* CLKIN = 24MHz */ | ||
1831 | param = 0x93002400; | ||
1832 | } | ||
1833 | ast_moutdwm(ast, 0x1E6E2020, param); | ||
1834 | udelay(100); | ||
1835 | } | ||
1836 | |||
1837 | static void reset_mmc_2500(struct ast_private *ast) | ||
1838 | { | ||
1839 | ast_moutdwm(ast, 0x1E78505C, 0x00000004); | ||
1840 | ast_moutdwm(ast, 0x1E785044, 0x00000001); | ||
1841 | ast_moutdwm(ast, 0x1E785048, 0x00004755); | ||
1842 | ast_moutdwm(ast, 0x1E78504C, 0x00000013); | ||
1843 | mdelay(100); | ||
1844 | ast_moutdwm(ast, 0x1E785054, 0x00000077); | ||
1845 | ast_moutdwm(ast, 0x1E6E0000, 0xFC600309); | ||
1846 | } | ||
1847 | |||
1848 | static void ddr3_init_2500(struct ast_private *ast, const u32 *ddr_table) | ||
1849 | { | ||
1850 | |||
1851 | ast_moutdwm(ast, 0x1E6E0004, 0x00000303); | ||
1852 | ast_moutdwm(ast, 0x1E6E0010, ddr_table[REGIDX_010]); | ||
1853 | ast_moutdwm(ast, 0x1E6E0014, ddr_table[REGIDX_014]); | ||
1854 | ast_moutdwm(ast, 0x1E6E0018, ddr_table[REGIDX_018]); | ||
1855 | ast_moutdwm(ast, 0x1E6E0020, ddr_table[REGIDX_020]); /* MODEREG4/6 */ | ||
1856 | ast_moutdwm(ast, 0x1E6E0024, ddr_table[REGIDX_024]); /* MODEREG5 */ | ||
1857 | ast_moutdwm(ast, 0x1E6E002C, ddr_table[REGIDX_02C] | 0x100); /* MODEREG0/2 */ | ||
1858 | ast_moutdwm(ast, 0x1E6E0030, ddr_table[REGIDX_030]); /* MODEREG1/3 */ | ||
1859 | |||
1860 | /* DDR PHY Setting */ | ||
1861 | ast_moutdwm(ast, 0x1E6E0200, 0x02492AAE); | ||
1862 | ast_moutdwm(ast, 0x1E6E0204, 0x00001001); | ||
1863 | ast_moutdwm(ast, 0x1E6E020C, 0x55E00B0B); | ||
1864 | ast_moutdwm(ast, 0x1E6E0210, 0x20000000); | ||
1865 | ast_moutdwm(ast, 0x1E6E0214, ddr_table[REGIDX_214]); | ||
1866 | ast_moutdwm(ast, 0x1E6E02E0, ddr_table[REGIDX_2E0]); | ||
1867 | ast_moutdwm(ast, 0x1E6E02E4, ddr_table[REGIDX_2E4]); | ||
1868 | ast_moutdwm(ast, 0x1E6E02E8, ddr_table[REGIDX_2E8]); | ||
1869 | ast_moutdwm(ast, 0x1E6E02EC, ddr_table[REGIDX_2EC]); | ||
1870 | ast_moutdwm(ast, 0x1E6E02F0, ddr_table[REGIDX_2F0]); | ||
1871 | ast_moutdwm(ast, 0x1E6E02F4, ddr_table[REGIDX_2F4]); | ||
1872 | ast_moutdwm(ast, 0x1E6E02F8, ddr_table[REGIDX_2F8]); | ||
1873 | ast_moutdwm(ast, 0x1E6E0290, 0x00100008); | ||
1874 | ast_moutdwm(ast, 0x1E6E02C0, 0x00000006); | ||
1875 | |||
1876 | /* Controller Setting */ | ||
1877 | ast_moutdwm(ast, 0x1E6E0034, 0x00020091); | ||
1878 | |||
1879 | /* Wait DDR PHY init done */ | ||
1880 | ddr_phy_init_2500(ast); | ||
1881 | |||
1882 | ast_moutdwm(ast, 0x1E6E0120, ddr_table[REGIDX_PLL]); | ||
1883 | ast_moutdwm(ast, 0x1E6E000C, 0x42AA5C81); | ||
1884 | ast_moutdwm(ast, 0x1E6E0034, 0x0001AF93); | ||
1885 | |||
1886 | check_dram_size_2500(ast, ddr_table[REGIDX_RFC]); | ||
1887 | enable_cache_2500(ast); | ||
1888 | ast_moutdwm(ast, 0x1E6E001C, 0x00000008); | ||
1889 | ast_moutdwm(ast, 0x1E6E0038, 0xFFFFFF00); | ||
1890 | } | ||
1891 | |||
1892 | static void ddr4_init_2500(struct ast_private *ast, const u32 *ddr_table) | ||
1893 | { | ||
1894 | u32 data, data2, pass, retrycnt; | ||
1895 | u32 ddr_vref, phy_vref; | ||
1896 | u32 min_ddr_vref = 0, min_phy_vref = 0; | ||
1897 | u32 max_ddr_vref = 0, max_phy_vref = 0; | ||
1898 | |||
1899 | ast_moutdwm(ast, 0x1E6E0004, 0x00000313); | ||
1900 | ast_moutdwm(ast, 0x1E6E0010, ddr_table[REGIDX_010]); | ||
1901 | ast_moutdwm(ast, 0x1E6E0014, ddr_table[REGIDX_014]); | ||
1902 | ast_moutdwm(ast, 0x1E6E0018, ddr_table[REGIDX_018]); | ||
1903 | ast_moutdwm(ast, 0x1E6E0020, ddr_table[REGIDX_020]); /* MODEREG4/6 */ | ||
1904 | ast_moutdwm(ast, 0x1E6E0024, ddr_table[REGIDX_024]); /* MODEREG5 */ | ||
1905 | ast_moutdwm(ast, 0x1E6E002C, ddr_table[REGIDX_02C] | 0x100); /* MODEREG0/2 */ | ||
1906 | ast_moutdwm(ast, 0x1E6E0030, ddr_table[REGIDX_030]); /* MODEREG1/3 */ | ||
1907 | |||
1908 | /* DDR PHY Setting */ | ||
1909 | ast_moutdwm(ast, 0x1E6E0200, 0x42492AAE); | ||
1910 | ast_moutdwm(ast, 0x1E6E0204, 0x09002000); | ||
1911 | ast_moutdwm(ast, 0x1E6E020C, 0x55E00B0B); | ||
1912 | ast_moutdwm(ast, 0x1E6E0210, 0x20000000); | ||
1913 | ast_moutdwm(ast, 0x1E6E0214, ddr_table[REGIDX_214]); | ||
1914 | ast_moutdwm(ast, 0x1E6E02E0, ddr_table[REGIDX_2E0]); | ||
1915 | ast_moutdwm(ast, 0x1E6E02E4, ddr_table[REGIDX_2E4]); | ||
1916 | ast_moutdwm(ast, 0x1E6E02E8, ddr_table[REGIDX_2E8]); | ||
1917 | ast_moutdwm(ast, 0x1E6E02EC, ddr_table[REGIDX_2EC]); | ||
1918 | ast_moutdwm(ast, 0x1E6E02F0, ddr_table[REGIDX_2F0]); | ||
1919 | ast_moutdwm(ast, 0x1E6E02F4, ddr_table[REGIDX_2F4]); | ||
1920 | ast_moutdwm(ast, 0x1E6E02F8, ddr_table[REGIDX_2F8]); | ||
1921 | ast_moutdwm(ast, 0x1E6E0290, 0x00100008); | ||
1922 | ast_moutdwm(ast, 0x1E6E02C4, 0x3C183C3C); | ||
1923 | ast_moutdwm(ast, 0x1E6E02C8, 0x00631E0E); | ||
1924 | |||
1925 | /* Controller Setting */ | ||
1926 | ast_moutdwm(ast, 0x1E6E0034, 0x0001A991); | ||
1927 | |||
1928 | /* Train PHY Vref first */ | ||
1929 | pass = 0; | ||
1930 | |||
1931 | for (retrycnt = 0; retrycnt < 4 && pass == 0; retrycnt++) { | ||
1932 | max_phy_vref = 0x0; | ||
1933 | pass = 0; | ||
1934 | ast_moutdwm(ast, 0x1E6E02C0, 0x00001C06); | ||
1935 | for (phy_vref = 0x40; phy_vref < 0x80; phy_vref++) { | ||
1936 | ast_moutdwm(ast, 0x1E6E000C, 0x00000000); | ||
1937 | ast_moutdwm(ast, 0x1E6E0060, 0x00000000); | ||
1938 | ast_moutdwm(ast, 0x1E6E02CC, phy_vref | (phy_vref << 8)); | ||
1939 | /* Fire DFI Init */ | ||
1940 | ddr_phy_init_2500(ast); | ||
1941 | ast_moutdwm(ast, 0x1E6E000C, 0x00005C01); | ||
1942 | if (cbr_test_2500(ast)) { | ||
1943 | pass++; | ||
1944 | data = ast_mindwm(ast, 0x1E6E03D0); | ||
1945 | data2 = data >> 8; | ||
1946 | data = data & 0xff; | ||
1947 | if (data > data2) | ||
1948 | data = data2; | ||
1949 | if (max_phy_vref < data) { | ||
1950 | max_phy_vref = data; | ||
1951 | min_phy_vref = phy_vref; | ||
1952 | } | ||
1953 | } else if (pass > 0) | ||
1954 | break; | ||
1955 | } | ||
1956 | } | ||
1957 | ast_moutdwm(ast, 0x1E6E02CC, min_phy_vref | (min_phy_vref << 8)); | ||
1958 | |||
1959 | /* Train DDR Vref next */ | ||
1960 | pass = 0; | ||
1961 | |||
1962 | for (retrycnt = 0; retrycnt < 4 && pass == 0; retrycnt++) { | ||
1963 | min_ddr_vref = 0xFF; | ||
1964 | max_ddr_vref = 0x0; | ||
1965 | pass = 0; | ||
1966 | for (ddr_vref = 0x00; ddr_vref < 0x40; ddr_vref++) { | ||
1967 | ast_moutdwm(ast, 0x1E6E000C, 0x00000000); | ||
1968 | ast_moutdwm(ast, 0x1E6E0060, 0x00000000); | ||
1969 | ast_moutdwm(ast, 0x1E6E02C0, 0x00000006 | (ddr_vref << 8)); | ||
1970 | /* Fire DFI Init */ | ||
1971 | ddr_phy_init_2500(ast); | ||
1972 | ast_moutdwm(ast, 0x1E6E000C, 0x00005C01); | ||
1973 | if (cbr_test_2500(ast)) { | ||
1974 | pass++; | ||
1975 | if (min_ddr_vref > ddr_vref) | ||
1976 | min_ddr_vref = ddr_vref; | ||
1977 | if (max_ddr_vref < ddr_vref) | ||
1978 | max_ddr_vref = ddr_vref; | ||
1979 | } else if (pass != 0) | ||
1980 | break; | ||
1981 | } | ||
1982 | } | ||
1983 | |||
1984 | ast_moutdwm(ast, 0x1E6E000C, 0x00000000); | ||
1985 | ast_moutdwm(ast, 0x1E6E0060, 0x00000000); | ||
1986 | ddr_vref = (min_ddr_vref + max_ddr_vref + 1) >> 1; | ||
1987 | ast_moutdwm(ast, 0x1E6E02C0, 0x00000006 | (ddr_vref << 8)); | ||
1988 | |||
1989 | /* Wait DDR PHY init done */ | ||
1990 | ddr_phy_init_2500(ast); | ||
1991 | |||
1992 | ast_moutdwm(ast, 0x1E6E0120, ddr_table[REGIDX_PLL]); | ||
1993 | ast_moutdwm(ast, 0x1E6E000C, 0x42AA5C81); | ||
1994 | ast_moutdwm(ast, 0x1E6E0034, 0x0001AF93); | ||
1995 | |||
1996 | check_dram_size_2500(ast, ddr_table[REGIDX_RFC]); | ||
1997 | enable_cache_2500(ast); | ||
1998 | ast_moutdwm(ast, 0x1E6E001C, 0x00000008); | ||
1999 | ast_moutdwm(ast, 0x1E6E0038, 0xFFFFFF00); | ||
2000 | } | ||
2001 | |||
2002 | static bool ast_dram_init_2500(struct ast_private *ast) | ||
2003 | { | ||
2004 | u32 data; | ||
2005 | u32 max_tries = 5; | ||
2006 | |||
2007 | do { | ||
2008 | if (max_tries-- == 0) | ||
2009 | return false; | ||
2010 | set_mpll_2500(ast); | ||
2011 | reset_mmc_2500(ast); | ||
2012 | ddr_init_common_2500(ast); | ||
2013 | |||
2014 | data = ast_mindwm(ast, 0x1E6E2070); | ||
2015 | if (data & 0x01000000) | ||
2016 | ddr4_init_2500(ast, ast2500_ddr4_1600_timing_table); | ||
2017 | else | ||
2018 | ddr3_init_2500(ast, ast2500_ddr3_1600_timing_table); | ||
2019 | } while (!ddr_test_2500(ast)); | ||
2020 | |||
2021 | ast_moutdwm(ast, 0x1E6E2040, ast_mindwm(ast, 0x1E6E2040) | 0x41); | ||
2022 | |||
2023 | /* Patch code */ | ||
2024 | data = ast_mindwm(ast, 0x1E6E200C) & 0xF9FFFFFF; | ||
2025 | ast_moutdwm(ast, 0x1E6E200C, data | 0x10000000); | ||
2026 | |||
2027 | return true; | ||
2028 | } | ||
2029 | |||
2030 | void ast_post_chip_2500(struct drm_device *dev) | ||
2031 | { | ||
2032 | struct ast_private *ast = dev->dev_private; | ||
2033 | u32 temp; | ||
2034 | u8 reg; | ||
2035 | |||
2036 | reg = ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xd0, 0xff); | ||
2037 | if ((reg & 0x80) == 0) {/* vga only */ | ||
2038 | /* Clear bus lock condition */ | ||
2039 | ast_moutdwm(ast, 0x1e600000, 0xAEED1A03); | ||
2040 | ast_moutdwm(ast, 0x1e600084, 0x00010000); | ||
2041 | ast_moutdwm(ast, 0x1e600088, 0x00000000); | ||
2042 | ast_moutdwm(ast, 0x1e6e2000, 0x1688A8A8); | ||
2043 | ast_write32(ast, 0xf004, 0x1e6e0000); | ||
2044 | ast_write32(ast, 0xf000, 0x1); | ||
2045 | ast_write32(ast, 0x12000, 0x1688a8a8); | ||
2046 | while (ast_read32(ast, 0x12000) != 0x1) | ||
2047 | ; | ||
2048 | |||
2049 | ast_write32(ast, 0x10000, 0xfc600309); | ||
2050 | while (ast_read32(ast, 0x10000) != 0x1) | ||
2051 | ; | ||
2052 | |||
2053 | /* Slow down CPU/AHB CLK in VGA only mode */ | ||
2054 | temp = ast_read32(ast, 0x12008); | ||
2055 | temp |= 0x73; | ||
2056 | ast_write32(ast, 0x12008, temp); | ||
2057 | |||
2058 | /* Reset USB port to patch USB unknown device issue */ | ||
2059 | ast_moutdwm(ast, 0x1e6e2090, 0x20000000); | ||
2060 | temp = ast_mindwm(ast, 0x1e6e2094); | ||
2061 | temp |= 0x00004000; | ||
2062 | ast_moutdwm(ast, 0x1e6e2094, temp); | ||
2063 | temp = ast_mindwm(ast, 0x1e6e2070); | ||
2064 | if (temp & 0x00800000) { | ||
2065 | ast_moutdwm(ast, 0x1e6e207c, 0x00800000); | ||
2066 | mdelay(100); | ||
2067 | ast_moutdwm(ast, 0x1e6e2070, 0x00800000); | ||
2068 | } | ||
2069 | |||
2070 | if (!ast_dram_init_2500(ast)) | ||
2071 | DRM_ERROR("DRAM init failed !\n"); | ||
2072 | |||
2073 | temp = ast_mindwm(ast, 0x1e6e2040); | ||
2074 | ast_moutdwm(ast, 0x1e6e2040, temp | 0x40); | ||
2075 | } | ||
2076 | |||
2077 | /* wait ready */ | ||
2078 | do { | ||
2079 | reg = ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xd0, 0xff); | ||
2080 | } while ((reg & 0x40) == 0); | ||
2081 | } | ||
diff --git a/drivers/gpu/drm/ast/ast_tables.h b/drivers/gpu/drm/ast/ast_tables.h index 3608d5aa7451..5f4c2e833a65 100644 --- a/drivers/gpu/drm/ast/ast_tables.h +++ b/drivers/gpu/drm/ast/ast_tables.h | |||
@@ -47,6 +47,7 @@ | |||
47 | #define SyncPN (PVSync | NHSync) | 47 | #define SyncPN (PVSync | NHSync) |
48 | #define SyncNP (NVSync | PHSync) | 48 | #define SyncNP (NVSync | PHSync) |
49 | #define SyncNN (NVSync | NHSync) | 49 | #define SyncNN (NVSync | NHSync) |
50 | #define AST2500PreCatchCRT 0x00004000 | ||
50 | 51 | ||
51 | /* DCLK Index */ | 52 | /* DCLK Index */ |
52 | #define VCLK25_175 0x00 | 53 | #define VCLK25_175 0x00 |
@@ -78,37 +79,67 @@ | |||
78 | #define VCLK97_75 0x19 | 79 | #define VCLK97_75 0x19 |
79 | #define VCLK118_25 0x1A | 80 | #define VCLK118_25 0x1A |
80 | 81 | ||
81 | static struct ast_vbios_dclk_info dclk_table[] = { | 82 | static const struct ast_vbios_dclk_info dclk_table[] = { |
82 | {0x2C, 0xE7, 0x03}, /* 00: VCLK25_175 */ | 83 | {0x2C, 0xE7, 0x03}, /* 00: VCLK25_175 */ |
83 | {0x95, 0x62, 0x03}, /* 01: VCLK28_322 */ | 84 | {0x95, 0x62, 0x03}, /* 01: VCLK28_322 */ |
84 | {0x67, 0x63, 0x01}, /* 02: VCLK31_5 */ | 85 | {0x67, 0x63, 0x01}, /* 02: VCLK31_5 */ |
85 | {0x76, 0x63, 0x01}, /* 03: VCLK36 */ | 86 | {0x76, 0x63, 0x01}, /* 03: VCLK36 */ |
86 | {0xEE, 0x67, 0x01}, /* 04: VCLK40 */ | 87 | {0xEE, 0x67, 0x01}, /* 04: VCLK40 */ |
87 | {0x82, 0x62, 0x01}, /* 05: VCLK49_5 */ | 88 | {0x82, 0x62, 0x01}, /* 05: VCLK49_5 */ |
88 | {0xC6, 0x64, 0x01}, /* 06: VCLK50 */ | 89 | {0xC6, 0x64, 0x01}, /* 06: VCLK50 */ |
89 | {0x94, 0x62, 0x01}, /* 07: VCLK56_25 */ | 90 | {0x94, 0x62, 0x01}, /* 07: VCLK56_25 */ |
90 | {0x80, 0x64, 0x00}, /* 08: VCLK65 */ | 91 | {0x80, 0x64, 0x00}, /* 08: VCLK65 */ |
91 | {0x7B, 0x63, 0x00}, /* 09: VCLK75 */ | 92 | {0x7B, 0x63, 0x00}, /* 09: VCLK75 */ |
92 | {0x67, 0x62, 0x00}, /* 0A: VCLK78_75 */ | 93 | {0x67, 0x62, 0x00}, /* 0A: VCLK78_75 */ |
93 | {0x7C, 0x62, 0x00}, /* 0B: VCLK94_5 */ | 94 | {0x7C, 0x62, 0x00}, /* 0B: VCLK94_5 */ |
94 | {0x8E, 0x62, 0x00}, /* 0C: VCLK108 */ | 95 | {0x8E, 0x62, 0x00}, /* 0C: VCLK108 */ |
95 | {0x85, 0x24, 0x00}, /* 0D: VCLK135 */ | 96 | {0x85, 0x24, 0x00}, /* 0D: VCLK135 */ |
96 | {0x67, 0x22, 0x00}, /* 0E: VCLK157_5 */ | 97 | {0x67, 0x22, 0x00}, /* 0E: VCLK157_5 */ |
97 | {0x6A, 0x22, 0x00}, /* 0F: VCLK162 */ | 98 | {0x6A, 0x22, 0x00}, /* 0F: VCLK162 */ |
98 | {0x4d, 0x4c, 0x80}, /* 10: VCLK154 */ | 99 | {0x4d, 0x4c, 0x80}, /* 10: VCLK154 */ |
99 | {0xa7, 0x78, 0x80}, /* 11: VCLK83.5 */ | 100 | {0xa7, 0x78, 0x80}, /* 11: VCLK83.5 */ |
100 | {0x28, 0x49, 0x80}, /* 12: VCLK106.5 */ | 101 | {0x28, 0x49, 0x80}, /* 12: VCLK106.5 */ |
101 | {0x37, 0x49, 0x80}, /* 13: VCLK146.25 */ | 102 | {0x37, 0x49, 0x80}, /* 13: VCLK146.25 */ |
102 | {0x1f, 0x45, 0x80}, /* 14: VCLK148.5 */ | 103 | {0x1f, 0x45, 0x80}, /* 14: VCLK148.5 */ |
103 | {0x47, 0x6c, 0x80}, /* 15: VCLK71 */ | 104 | {0x47, 0x6c, 0x80}, /* 15: VCLK71 */ |
104 | {0x25, 0x65, 0x80}, /* 16: VCLK88.75 */ | 105 | {0x25, 0x65, 0x80}, /* 16: VCLK88.75 */ |
105 | {0x77, 0x58, 0x80}, /* 17: VCLK119 */ | 106 | {0x77, 0x58, 0x80}, /* 17: VCLK119 */ |
106 | {0x32, 0x67, 0x80}, /* 18: VCLK85_5 */ | 107 | {0x32, 0x67, 0x80}, /* 18: VCLK85_5 */ |
107 | {0x6a, 0x6d, 0x80}, /* 19: VCLK97_75 */ | 108 | {0x6a, 0x6d, 0x80}, /* 19: VCLK97_75 */ |
108 | {0x3b, 0x2c, 0x81}, /* 1A: VCLK118_25 */ | 109 | {0x3b, 0x2c, 0x81}, /* 1A: VCLK118_25 */ |
109 | }; | 110 | }; |
110 | 111 | ||
111 | static struct ast_vbios_stdtable vbios_stdtable[] = { | 112 | static const struct ast_vbios_dclk_info dclk_table_ast2500[] = { |
113 | {0x2C, 0xE7, 0x03}, /* 00: VCLK25_175 */ | ||
114 | {0x95, 0x62, 0x03}, /* 01: VCLK28_322 */ | ||
115 | {0x67, 0x63, 0x01}, /* 02: VCLK31_5 */ | ||
116 | {0x76, 0x63, 0x01}, /* 03: VCLK36 */ | ||
117 | {0xEE, 0x67, 0x01}, /* 04: VCLK40 */ | ||
118 | {0x82, 0x62, 0x01}, /* 05: VCLK49_5 */ | ||
119 | {0xC6, 0x64, 0x01}, /* 06: VCLK50 */ | ||
120 | {0x94, 0x62, 0x01}, /* 07: VCLK56_25 */ | ||
121 | {0x80, 0x64, 0x00}, /* 08: VCLK65 */ | ||
122 | {0x7B, 0x63, 0x00}, /* 09: VCLK75 */ | ||
123 | {0x67, 0x62, 0x00}, /* 0A: VCLK78_75 */ | ||
124 | {0x7C, 0x62, 0x00}, /* 0B: VCLK94_5 */ | ||
125 | {0x8E, 0x62, 0x00}, /* 0C: VCLK108 */ | ||
126 | {0x85, 0x24, 0x00}, /* 0D: VCLK135 */ | ||
127 | {0x67, 0x22, 0x00}, /* 0E: VCLK157_5 */ | ||
128 | {0x6A, 0x22, 0x00}, /* 0F: VCLK162 */ | ||
129 | {0x4d, 0x4c, 0x80}, /* 10: VCLK154 */ | ||
130 | {0xa7, 0x78, 0x80}, /* 11: VCLK83.5 */ | ||
131 | {0x28, 0x49, 0x80}, /* 12: VCLK106.5 */ | ||
132 | {0x37, 0x49, 0x80}, /* 13: VCLK146.25 */ | ||
133 | {0x1f, 0x45, 0x80}, /* 14: VCLK148.5 */ | ||
134 | {0x47, 0x6c, 0x80}, /* 15: VCLK71 */ | ||
135 | {0x25, 0x65, 0x80}, /* 16: VCLK88.75 */ | ||
136 | {0x58, 0x01, 0x42}, /* 17: VCLK119 */ | ||
137 | {0x32, 0x67, 0x80}, /* 18: VCLK85_5 */ | ||
138 | {0x6a, 0x6d, 0x80}, /* 19: VCLK97_75 */ | ||
139 | {0x44, 0x20, 0x43}, /* 1A: VCLK118_25 */ | ||
140 | }; | ||
141 | |||
142 | static const struct ast_vbios_stdtable vbios_stdtable[] = { | ||
112 | /* MD_2_3_400 */ | 143 | /* MD_2_3_400 */ |
113 | { | 144 | { |
114 | 0x67, | 145 | 0x67, |
@@ -181,21 +212,21 @@ static struct ast_vbios_stdtable vbios_stdtable[] = { | |||
181 | }, | 212 | }, |
182 | }; | 213 | }; |
183 | 214 | ||
184 | static struct ast_vbios_enhtable res_640x480[] = { | 215 | static const struct ast_vbios_enhtable res_640x480[] = { |
185 | { 800, 640, 8, 96, 525, 480, 2, 2, VCLK25_175, /* 60Hz */ | 216 | { 800, 640, 8, 96, 525, 480, 2, 2, VCLK25_175, /* 60Hz */ |
186 | (SyncNN | HBorder | VBorder | Charx8Dot), 60, 1, 0x2E }, | 217 | (SyncNN | HBorder | VBorder | Charx8Dot), 60, 1, 0x2E }, |
187 | { 832, 640, 16, 40, 520, 480, 1, 3, VCLK31_5, /* 72Hz */ | 218 | { 832, 640, 16, 40, 520, 480, 1, 3, VCLK31_5, /* 72Hz */ |
188 | (SyncNN | HBorder | VBorder | Charx8Dot), 72, 2, 0x2E }, | 219 | (SyncNN | HBorder | VBorder | Charx8Dot), 72, 2, 0x2E }, |
189 | { 840, 640, 16, 64, 500, 480, 1, 3, VCLK31_5, /* 75Hz */ | 220 | { 840, 640, 16, 64, 500, 480, 1, 3, VCLK31_5, /* 75Hz */ |
190 | (SyncNN | Charx8Dot) , 75, 3, 0x2E }, | 221 | (SyncNN | Charx8Dot) , 75, 3, 0x2E }, |
191 | { 832, 640, 56, 56, 509, 480, 1, 3, VCLK36, /* 85Hz */ | 222 | { 832, 640, 56, 56, 509, 480, 1, 3, VCLK36, /* 85Hz */ |
192 | (SyncNN | Charx8Dot) , 85, 4, 0x2E }, | 223 | (SyncNN | Charx8Dot) , 85, 4, 0x2E }, |
193 | { 832, 640, 56, 56, 509, 480, 1, 3, VCLK36, /* end */ | 224 | { 832, 640, 56, 56, 509, 480, 1, 3, VCLK36, /* end */ |
194 | (SyncNN | Charx8Dot) , 0xFF, 4, 0x2E }, | 225 | (SyncNN | Charx8Dot) , 0xFF, 4, 0x2E }, |
195 | }; | 226 | }; |
196 | 227 | ||
197 | static struct ast_vbios_enhtable res_800x600[] = { | 228 | static const struct ast_vbios_enhtable res_800x600[] = { |
198 | {1024, 800, 24, 72, 625, 600, 1, 2, VCLK36, /* 56Hz */ | 229 | {1024, 800, 24, 72, 625, 600, 1, 2, VCLK36, /* 56Hz */ |
199 | (SyncPP | Charx8Dot), 56, 1, 0x30 }, | 230 | (SyncPP | Charx8Dot), 56, 1, 0x30 }, |
200 | {1056, 800, 40, 128, 628, 600, 1, 4, VCLK40, /* 60Hz */ | 231 | {1056, 800, 40, 128, 628, 600, 1, 4, VCLK40, /* 60Hz */ |
201 | (SyncPP | Charx8Dot), 60, 2, 0x30 }, | 232 | (SyncPP | Charx8Dot), 60, 2, 0x30 }, |
@@ -210,7 +241,7 @@ static struct ast_vbios_enhtable res_800x600[] = { | |||
210 | }; | 241 | }; |
211 | 242 | ||
212 | 243 | ||
213 | static struct ast_vbios_enhtable res_1024x768[] = { | 244 | static const struct ast_vbios_enhtable res_1024x768[] = { |
214 | {1344, 1024, 24, 136, 806, 768, 3, 6, VCLK65, /* 60Hz */ | 245 | {1344, 1024, 24, 136, 806, 768, 3, 6, VCLK65, /* 60Hz */ |
215 | (SyncNN | Charx8Dot), 60, 1, 0x31 }, | 246 | (SyncNN | Charx8Dot), 60, 1, 0x31 }, |
216 | {1328, 1024, 24, 136, 806, 768, 3, 6, VCLK75, /* 70Hz */ | 247 | {1328, 1024, 24, 136, 806, 768, 3, 6, VCLK75, /* 70Hz */ |
@@ -223,7 +254,7 @@ static struct ast_vbios_enhtable res_1024x768[] = { | |||
223 | (SyncPP | Charx8Dot), 0xFF, 4, 0x31 }, | 254 | (SyncPP | Charx8Dot), 0xFF, 4, 0x31 }, |
224 | }; | 255 | }; |
225 | 256 | ||
226 | static struct ast_vbios_enhtable res_1280x1024[] = { | 257 | static const struct ast_vbios_enhtable res_1280x1024[] = { |
227 | {1688, 1280, 48, 112, 1066, 1024, 1, 3, VCLK108, /* 60Hz */ | 258 | {1688, 1280, 48, 112, 1066, 1024, 1, 3, VCLK108, /* 60Hz */ |
228 | (SyncPP | Charx8Dot), 60, 1, 0x32 }, | 259 | (SyncPP | Charx8Dot), 60, 1, 0x32 }, |
229 | {1688, 1280, 16, 144, 1066, 1024, 1, 3, VCLK135, /* 75Hz */ | 260 | {1688, 1280, 16, 144, 1066, 1024, 1, 3, VCLK135, /* 75Hz */ |
@@ -234,7 +265,7 @@ static struct ast_vbios_enhtable res_1280x1024[] = { | |||
234 | (SyncPP | Charx8Dot), 0xFF, 3, 0x32 }, | 265 | (SyncPP | Charx8Dot), 0xFF, 3, 0x32 }, |
235 | }; | 266 | }; |
236 | 267 | ||
237 | static struct ast_vbios_enhtable res_1600x1200[] = { | 268 | static const struct ast_vbios_enhtable res_1600x1200[] = { |
238 | {2160, 1600, 64, 192, 1250, 1200, 1, 3, VCLK162, /* 60Hz */ | 269 | {2160, 1600, 64, 192, 1250, 1200, 1, 3, VCLK162, /* 60Hz */ |
239 | (SyncPP | Charx8Dot), 60, 1, 0x33 }, | 270 | (SyncPP | Charx8Dot), 60, 1, 0x33 }, |
240 | {2160, 1600, 64, 192, 1250, 1200, 1, 3, VCLK162, /* end */ | 271 | {2160, 1600, 64, 192, 1250, 1200, 1, 3, VCLK162, /* end */ |
@@ -242,34 +273,39 @@ static struct ast_vbios_enhtable res_1600x1200[] = { | |||
242 | }; | 273 | }; |
243 | 274 | ||
244 | /* 16:9 */ | 275 | /* 16:9 */ |
245 | static struct ast_vbios_enhtable res_1360x768[] = { | 276 | static const struct ast_vbios_enhtable res_1360x768[] = { |
246 | {1792, 1360, 64,112, 795, 768, 3, 6, VCLK85_5, /* 60Hz */ | 277 | {1792, 1360, 64, 112, 795, 768, 3, 6, VCLK85_5, /* 60Hz */ |
247 | (SyncPP | Charx8Dot | LineCompareOff | WideScreenMode | NewModeInfo), 60, 1, 0x39 }, | 278 | (SyncPP | Charx8Dot | LineCompareOff | WideScreenMode | NewModeInfo), 60, 1, 0x39 }, |
248 | {1792, 1360, 64,112, 795, 768, 3, 6, VCLK85_5, /* end */ | 279 | {1792, 1360, 64, 112, 795, 768, 3, 6, VCLK85_5, /* end */ |
249 | (SyncPP | Charx8Dot | LineCompareOff | WideScreenMode | NewModeInfo), 0xFF, 1, 0x39 }, | 280 | (SyncPP | Charx8Dot | LineCompareOff | WideScreenMode | NewModeInfo | |
281 | AST2500PreCatchCRT), 0xFF, 1, 0x39 }, | ||
250 | }; | 282 | }; |
251 | 283 | ||
252 | static struct ast_vbios_enhtable res_1600x900[] = { | 284 | static const struct ast_vbios_enhtable res_1600x900[] = { |
253 | {1760, 1600, 48, 32, 926, 900, 3, 5, VCLK97_75, /* 60Hz CVT RB */ | 285 | {1760, 1600, 48, 32, 926, 900, 3, 5, VCLK97_75, /* 60Hz CVT RB */ |
254 | (SyncNP | Charx8Dot | LineCompareOff | WideScreenMode | NewModeInfo), 60, 1, 0x3A }, | 286 | (SyncNP | Charx8Dot | LineCompareOff | WideScreenMode | NewModeInfo | |
255 | {2112, 1600, 88,168, 934, 900, 3, 5, VCLK118_25, /* 60Hz CVT */ | 287 | AST2500PreCatchCRT), 60, 1, 0x3A }, |
288 | {2112, 1600, 88, 168, 934, 900, 3, 5, VCLK118_25, /* 60Hz CVT */ | ||
256 | (SyncPN | Charx8Dot | LineCompareOff | WideScreenMode | NewModeInfo), 60, 2, 0x3A }, | 289 | (SyncPN | Charx8Dot | LineCompareOff | WideScreenMode | NewModeInfo), 60, 2, 0x3A }, |
257 | {2112, 1600, 88,168, 934, 900, 3, 5, VCLK118_25, /* 60Hz CVT */ | 290 | {2112, 1600, 88, 168, 934, 900, 3, 5, VCLK118_25, /* 60Hz CVT */ |
258 | (SyncPN | Charx8Dot | LineCompareOff | WideScreenMode | NewModeInfo), 0xFF, 2, 0x3A }, | 291 | (SyncPN | Charx8Dot | LineCompareOff | WideScreenMode | NewModeInfo), 0xFF, 2, 0x3A }, |
259 | }; | 292 | }; |
260 | 293 | ||
261 | static struct ast_vbios_enhtable res_1920x1080[] = { | 294 | static const struct ast_vbios_enhtable res_1920x1080[] = { |
262 | {2200, 1920, 88, 44, 1125, 1080, 4, 5, VCLK148_5, /* 60Hz */ | 295 | {2200, 1920, 88, 44, 1125, 1080, 4, 5, VCLK148_5, /* 60Hz */ |
263 | (SyncNP | Charx8Dot | LineCompareOff | WideScreenMode | NewModeInfo), 60, 1, 0x38 }, | 296 | (SyncNP | Charx8Dot | LineCompareOff | WideScreenMode | NewModeInfo | |
297 | AST2500PreCatchCRT), 60, 1, 0x38 }, | ||
264 | {2200, 1920, 88, 44, 1125, 1080, 4, 5, VCLK148_5, /* 60Hz */ | 298 | {2200, 1920, 88, 44, 1125, 1080, 4, 5, VCLK148_5, /* 60Hz */ |
265 | (SyncNP | Charx8Dot | LineCompareOff | WideScreenMode | NewModeInfo), 0xFF, 1, 0x38 }, | 299 | (SyncNP | Charx8Dot | LineCompareOff | WideScreenMode | NewModeInfo | |
300 | AST2500PreCatchCRT), 0xFF, 1, 0x38 }, | ||
266 | }; | 301 | }; |
267 | 302 | ||
268 | 303 | ||
269 | /* 16:10 */ | 304 | /* 16:10 */ |
270 | static struct ast_vbios_enhtable res_1280x800[] = { | 305 | static const struct ast_vbios_enhtable res_1280x800[] = { |
271 | {1440, 1280, 48, 32, 823, 800, 3, 6, VCLK71, /* 60Hz RB */ | 306 | {1440, 1280, 48, 32, 823, 800, 3, 6, VCLK71, /* 60Hz RB */ |
272 | (SyncNP | Charx8Dot | LineCompareOff | WideScreenMode | NewModeInfo), 60, 1, 0x35 }, | 307 | (SyncNP | Charx8Dot | LineCompareOff | WideScreenMode | NewModeInfo | |
308 | AST2500PreCatchCRT), 60, 1, 0x35 }, | ||
273 | {1680, 1280, 72,128, 831, 800, 3, 6, VCLK83_5, /* 60Hz */ | 309 | {1680, 1280, 72,128, 831, 800, 3, 6, VCLK83_5, /* 60Hz */ |
274 | (SyncPN | Charx8Dot | LineCompareOff | WideScreenMode | NewModeInfo), 60, 2, 0x35 }, | 310 | (SyncPN | Charx8Dot | LineCompareOff | WideScreenMode | NewModeInfo), 60, 2, 0x35 }, |
275 | {1680, 1280, 72,128, 831, 800, 3, 6, VCLK83_5, /* 60Hz */ | 311 | {1680, 1280, 72,128, 831, 800, 3, 6, VCLK83_5, /* 60Hz */ |
@@ -277,29 +313,33 @@ static struct ast_vbios_enhtable res_1280x800[] = { | |||
277 | 313 | ||
278 | }; | 314 | }; |
279 | 315 | ||
280 | static struct ast_vbios_enhtable res_1440x900[] = { | 316 | static const struct ast_vbios_enhtable res_1440x900[] = { |
281 | {1600, 1440, 48, 32, 926, 900, 3, 6, VCLK88_75, /* 60Hz RB */ | 317 | {1600, 1440, 48, 32, 926, 900, 3, 6, VCLK88_75, /* 60Hz RB */ |
282 | (SyncNP | Charx8Dot | LineCompareOff | WideScreenMode | NewModeInfo), 60, 1, 0x36 }, | 318 | (SyncNP | Charx8Dot | LineCompareOff | WideScreenMode | NewModeInfo | |
319 | AST2500PreCatchCRT), 60, 1, 0x36 }, | ||
283 | {1904, 1440, 80,152, 934, 900, 3, 6, VCLK106_5, /* 60Hz */ | 320 | {1904, 1440, 80,152, 934, 900, 3, 6, VCLK106_5, /* 60Hz */ |
284 | (SyncPN | Charx8Dot | LineCompareOff | WideScreenMode | NewModeInfo), 60, 2, 0x36 }, | 321 | (SyncPN | Charx8Dot | LineCompareOff | WideScreenMode | NewModeInfo), 60, 2, 0x36 }, |
285 | {1904, 1440, 80,152, 934, 900, 3, 6, VCLK106_5, /* 60Hz */ | 322 | {1904, 1440, 80,152, 934, 900, 3, 6, VCLK106_5, /* 60Hz */ |
286 | (SyncPN | Charx8Dot | LineCompareOff | WideScreenMode | NewModeInfo), 0xFF, 2, 0x36 }, | 323 | (SyncPN | Charx8Dot | LineCompareOff | WideScreenMode | NewModeInfo), 0xFF, 2, 0x36 }, |
287 | }; | 324 | }; |
288 | 325 | ||
289 | static struct ast_vbios_enhtable res_1680x1050[] = { | 326 | static const struct ast_vbios_enhtable res_1680x1050[] = { |
290 | {1840, 1680, 48, 32, 1080, 1050, 3, 6, VCLK119, /* 60Hz RB */ | 327 | {1840, 1680, 48, 32, 1080, 1050, 3, 6, VCLK119, /* 60Hz RB */ |
291 | (SyncNP | Charx8Dot | LineCompareOff | WideScreenMode | NewModeInfo), 60, 1, 0x37 }, | 328 | (SyncNP | Charx8Dot | LineCompareOff | WideScreenMode | NewModeInfo | |
329 | AST2500PreCatchCRT), 60, 1, 0x37 }, | ||
292 | {2240, 1680,104,176, 1089, 1050, 3, 6, VCLK146_25, /* 60Hz */ | 330 | {2240, 1680,104,176, 1089, 1050, 3, 6, VCLK146_25, /* 60Hz */ |
293 | (SyncPN | Charx8Dot | LineCompareOff | WideScreenMode | NewModeInfo), 60, 2, 0x37 }, | 331 | (SyncPN | Charx8Dot | LineCompareOff | WideScreenMode | NewModeInfo), 60, 2, 0x37 }, |
294 | {2240, 1680,104,176, 1089, 1050, 3, 6, VCLK146_25, /* 60Hz */ | 332 | {2240, 1680,104,176, 1089, 1050, 3, 6, VCLK146_25, /* 60Hz */ |
295 | (SyncPN | Charx8Dot | LineCompareOff | WideScreenMode | NewModeInfo), 0xFF, 2, 0x37 }, | 333 | (SyncPN | Charx8Dot | LineCompareOff | WideScreenMode | NewModeInfo), 0xFF, 2, 0x37 }, |
296 | }; | 334 | }; |
297 | 335 | ||
298 | static struct ast_vbios_enhtable res_1920x1200[] = { | 336 | static const struct ast_vbios_enhtable res_1920x1200[] = { |
299 | {2080, 1920, 48, 32, 1235, 1200, 3, 6, VCLK154, /* 60Hz RB*/ | 337 | {2080, 1920, 48, 32, 1235, 1200, 3, 6, VCLK154, /* 60Hz RB*/ |
300 | (SyncNP | Charx8Dot | LineCompareOff | WideScreenMode | NewModeInfo), 60, 1, 0x34 }, | 338 | (SyncNP | Charx8Dot | LineCompareOff | WideScreenMode | NewModeInfo | |
301 | {2080, 1920, 48, 32, 1235, 1200, 3, 6, VCLK154, /* 60Hz RB */ | 339 | AST2500PreCatchCRT), 60, 1, 0x34 }, |
302 | (SyncNP | Charx8Dot | LineCompareOff | WideScreenMode | NewModeInfo), 0xFF, 1, 0x34 }, | 340 | {2080, 1920, 48, 32, 1235, 1200, 3, 6, VCLK154, /* 60Hz RB */ |
341 | (SyncNP | Charx8Dot | LineCompareOff | WideScreenMode | NewModeInfo | | ||
342 | AST2500PreCatchCRT), 0xFF, 1, 0x34 }, | ||
303 | }; | 343 | }; |
304 | 344 | ||
305 | #endif | 345 | #endif |
diff --git a/drivers/gpu/drm/rockchip/Kconfig b/drivers/gpu/drm/rockchip/Kconfig index ad31b3eb408f..0e4eb845cbb0 100644 --- a/drivers/gpu/drm/rockchip/Kconfig +++ b/drivers/gpu/drm/rockchip/Kconfig | |||
@@ -24,6 +24,7 @@ config ROCKCHIP_ANALOGIX_DP | |||
24 | config ROCKCHIP_CDN_DP | 24 | config ROCKCHIP_CDN_DP |
25 | tristate "Rockchip cdn DP" | 25 | tristate "Rockchip cdn DP" |
26 | depends on DRM_ROCKCHIP | 26 | depends on DRM_ROCKCHIP |
27 | depends on EXTCON | ||
27 | select SND_SOC_HDMI_CODEC if SND_SOC | 28 | select SND_SOC_HDMI_CODEC if SND_SOC |
28 | help | 29 | help |
29 | This selects support for Rockchip SoC specific extensions | 30 | This selects support for Rockchip SoC specific extensions |
diff --git a/drivers/gpu/drm/rockchip/cdn-dp-core.c b/drivers/gpu/drm/rockchip/cdn-dp-core.c index 9ab67a670885..fd79a70b8552 100644 --- a/drivers/gpu/drm/rockchip/cdn-dp-core.c +++ b/drivers/gpu/drm/rockchip/cdn-dp-core.c | |||
@@ -111,7 +111,7 @@ static int cdn_dp_clk_enable(struct cdn_dp_device *dp) | |||
111 | ret = pm_runtime_get_sync(dp->dev); | 111 | ret = pm_runtime_get_sync(dp->dev); |
112 | if (ret < 0) { | 112 | if (ret < 0) { |
113 | DRM_DEV_ERROR(dp->dev, "cannot get pm runtime %d\n", ret); | 113 | DRM_DEV_ERROR(dp->dev, "cannot get pm runtime %d\n", ret); |
114 | goto err_pclk; | 114 | goto err_pm_runtime_get; |
115 | } | 115 | } |
116 | 116 | ||
117 | reset_control_assert(dp->core_rst); | 117 | reset_control_assert(dp->core_rst); |
@@ -133,6 +133,8 @@ static int cdn_dp_clk_enable(struct cdn_dp_device *dp) | |||
133 | return 0; | 133 | return 0; |
134 | 134 | ||
135 | err_set_rate: | 135 | err_set_rate: |
136 | pm_runtime_put(dp->dev); | ||
137 | err_pm_runtime_get: | ||
136 | clk_disable_unprepare(dp->core_clk); | 138 | clk_disable_unprepare(dp->core_clk); |
137 | err_core_clk: | 139 | err_core_clk: |
138 | clk_disable_unprepare(dp->pclk); | 140 | clk_disable_unprepare(dp->pclk); |
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c index 541a5887dd6c..d08f26973d0b 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c | |||
@@ -199,9 +199,14 @@ static const struct drm_ioctl_desc vmw_ioctls[] = { | |||
199 | VMW_IOCTL_DEF(VMW_PRESENT_READBACK, | 199 | VMW_IOCTL_DEF(VMW_PRESENT_READBACK, |
200 | vmw_present_readback_ioctl, | 200 | vmw_present_readback_ioctl, |
201 | DRM_MASTER | DRM_AUTH), | 201 | DRM_MASTER | DRM_AUTH), |
202 | /* | ||
203 | * The permissions of the below ioctl are overridden in | ||
204 | * vmw_generic_ioctl(). We require either | ||
205 | * DRM_MASTER or capable(CAP_SYS_ADMIN). | ||
206 | */ | ||
202 | VMW_IOCTL_DEF(VMW_UPDATE_LAYOUT, | 207 | VMW_IOCTL_DEF(VMW_UPDATE_LAYOUT, |
203 | vmw_kms_update_layout_ioctl, | 208 | vmw_kms_update_layout_ioctl, |
204 | DRM_MASTER | DRM_CONTROL_ALLOW), | 209 | DRM_RENDER_ALLOW), |
205 | VMW_IOCTL_DEF(VMW_CREATE_SHADER, | 210 | VMW_IOCTL_DEF(VMW_CREATE_SHADER, |
206 | vmw_shader_define_ioctl, | 211 | vmw_shader_define_ioctl, |
207 | DRM_AUTH | DRM_RENDER_ALLOW), | 212 | DRM_AUTH | DRM_RENDER_ALLOW), |
@@ -1123,6 +1128,10 @@ static long vmw_generic_ioctl(struct file *filp, unsigned int cmd, | |||
1123 | 1128 | ||
1124 | return (long) vmw_execbuf_ioctl(dev, arg, file_priv, | 1129 | return (long) vmw_execbuf_ioctl(dev, arg, file_priv, |
1125 | _IOC_SIZE(cmd)); | 1130 | _IOC_SIZE(cmd)); |
1131 | } else if (nr == DRM_COMMAND_BASE + DRM_VMW_UPDATE_LAYOUT) { | ||
1132 | if (!drm_is_current_master(file_priv) && | ||
1133 | !capable(CAP_SYS_ADMIN)) | ||
1134 | return -EACCES; | ||
1126 | } | 1135 | } |
1127 | 1136 | ||
1128 | if (unlikely(ioctl->cmd != cmd)) | 1137 | if (unlikely(ioctl->cmd != cmd)) |
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h index 1e59a486bba8..59ff4197173a 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h | |||
@@ -41,9 +41,9 @@ | |||
41 | #include <drm/ttm/ttm_module.h> | 41 | #include <drm/ttm/ttm_module.h> |
42 | #include "vmwgfx_fence.h" | 42 | #include "vmwgfx_fence.h" |
43 | 43 | ||
44 | #define VMWGFX_DRIVER_DATE "20160210" | 44 | #define VMWGFX_DRIVER_DATE "20170221" |
45 | #define VMWGFX_DRIVER_MAJOR 2 | 45 | #define VMWGFX_DRIVER_MAJOR 2 |
46 | #define VMWGFX_DRIVER_MINOR 11 | 46 | #define VMWGFX_DRIVER_MINOR 12 |
47 | #define VMWGFX_DRIVER_PATCHLEVEL 0 | 47 | #define VMWGFX_DRIVER_PATCHLEVEL 0 |
48 | #define VMWGFX_FILE_PAGE_OFFSET 0x00100000 | 48 | #define VMWGFX_FILE_PAGE_OFFSET 0x00100000 |
49 | #define VMWGFX_FIFO_STATIC_SIZE (1024*1024) | 49 | #define VMWGFX_FIFO_STATIC_SIZE (1024*1024) |
diff --git a/drivers/gpu/drm/zte/zx_plane.c b/drivers/gpu/drm/zte/zx_plane.c index 1d08ba381098..d646ac931663 100644 --- a/drivers/gpu/drm/zte/zx_plane.c +++ b/drivers/gpu/drm/zte/zx_plane.c | |||
@@ -159,7 +159,7 @@ static void zx_vl_rsz_setup(struct zx_plane *zplane, uint32_t format, | |||
159 | void __iomem *rsz = zplane->rsz; | 159 | void __iomem *rsz = zplane->rsz; |
160 | u32 src_chroma_w = src_w; | 160 | u32 src_chroma_w = src_w; |
161 | u32 src_chroma_h = src_h; | 161 | u32 src_chroma_h = src_h; |
162 | u32 fmt; | 162 | int fmt; |
163 | 163 | ||
164 | /* Set up source and destination resolution */ | 164 | /* Set up source and destination resolution */ |
165 | zx_writel(rsz + RSZ_SRC_CFG, RSZ_VER(src_h - 1) | RSZ_HOR(src_w - 1)); | 165 | zx_writel(rsz + RSZ_SRC_CFG, RSZ_VER(src_h - 1) | RSZ_HOR(src_w - 1)); |
@@ -203,7 +203,7 @@ static void zx_vl_plane_atomic_update(struct drm_plane *plane, | |||
203 | u32 src_x, src_y, src_w, src_h; | 203 | u32 src_x, src_y, src_w, src_h; |
204 | u32 dst_x, dst_y, dst_w, dst_h; | 204 | u32 dst_x, dst_y, dst_w, dst_h; |
205 | uint32_t format; | 205 | uint32_t format; |
206 | u32 fmt; | 206 | int fmt; |
207 | int num_planes; | 207 | int num_planes; |
208 | int i; | 208 | int i; |
209 | 209 | ||
diff --git a/drivers/input/rmi4/rmi_f30.c b/drivers/input/rmi4/rmi_f30.c index 3422464af229..198678613382 100644 --- a/drivers/input/rmi4/rmi_f30.c +++ b/drivers/input/rmi4/rmi_f30.c | |||
@@ -258,9 +258,10 @@ static int rmi_f30_map_gpios(struct rmi_function *fn, | |||
258 | 258 | ||
259 | /* | 259 | /* |
260 | * Buttonpad could be also inferred from f30->has_mech_mouse_btns, | 260 | * Buttonpad could be also inferred from f30->has_mech_mouse_btns, |
261 | * but I am not sure, so use only the pdata info. | 261 | * but I am not sure, so use only the pdata info and the number of |
262 | * mapped buttons. | ||
262 | */ | 263 | */ |
263 | if (pdata->f30_data.buttonpad) | 264 | if (pdata->f30_data.buttonpad || (button - BTN_LEFT == 1)) |
264 | __set_bit(INPUT_PROP_BUTTONPAD, input->propbit); | 265 | __set_bit(INPUT_PROP_BUTTONPAD, input->propbit); |
265 | 266 | ||
266 | return 0; | 267 | return 0; |
diff --git a/drivers/leds/leds-pwm.c b/drivers/leds/leds-pwm.c index a9145aa7f36a..8d456dc6c5bf 100644 --- a/drivers/leds/leds-pwm.c +++ b/drivers/leds/leds-pwm.c | |||
@@ -29,7 +29,6 @@ struct led_pwm_data { | |||
29 | unsigned int active_low; | 29 | unsigned int active_low; |
30 | unsigned int period; | 30 | unsigned int period; |
31 | int duty; | 31 | int duty; |
32 | bool can_sleep; | ||
33 | }; | 32 | }; |
34 | 33 | ||
35 | struct led_pwm_priv { | 34 | struct led_pwm_priv { |
@@ -49,8 +48,8 @@ static void __led_pwm_set(struct led_pwm_data *led_dat) | |||
49 | pwm_enable(led_dat->pwm); | 48 | pwm_enable(led_dat->pwm); |
50 | } | 49 | } |
51 | 50 | ||
52 | static void led_pwm_set(struct led_classdev *led_cdev, | 51 | static int led_pwm_set(struct led_classdev *led_cdev, |
53 | enum led_brightness brightness) | 52 | enum led_brightness brightness) |
54 | { | 53 | { |
55 | struct led_pwm_data *led_dat = | 54 | struct led_pwm_data *led_dat = |
56 | container_of(led_cdev, struct led_pwm_data, cdev); | 55 | container_of(led_cdev, struct led_pwm_data, cdev); |
@@ -66,12 +65,7 @@ static void led_pwm_set(struct led_classdev *led_cdev, | |||
66 | led_dat->duty = duty; | 65 | led_dat->duty = duty; |
67 | 66 | ||
68 | __led_pwm_set(led_dat); | 67 | __led_pwm_set(led_dat); |
69 | } | ||
70 | 68 | ||
71 | static int led_pwm_set_blocking(struct led_classdev *led_cdev, | ||
72 | enum led_brightness brightness) | ||
73 | { | ||
74 | led_pwm_set(led_cdev, brightness); | ||
75 | return 0; | 69 | return 0; |
76 | } | 70 | } |
77 | 71 | ||
@@ -112,11 +106,7 @@ static int led_pwm_add(struct device *dev, struct led_pwm_priv *priv, | |||
112 | return ret; | 106 | return ret; |
113 | } | 107 | } |
114 | 108 | ||
115 | led_data->can_sleep = pwm_can_sleep(led_data->pwm); | 109 | led_data->cdev.brightness_set_blocking = led_pwm_set; |
116 | if (!led_data->can_sleep) | ||
117 | led_data->cdev.brightness_set = led_pwm_set; | ||
118 | else | ||
119 | led_data->cdev.brightness_set_blocking = led_pwm_set_blocking; | ||
120 | 110 | ||
121 | /* | 111 | /* |
122 | * FIXME: pwm_apply_args() should be removed when switching to the | 112 | * FIXME: pwm_apply_args() should be removed when switching to the |
diff --git a/drivers/misc/cxl/cxl.h b/drivers/misc/cxl/cxl.h index 6c722d96b775..79e60ec70bd3 100644 --- a/drivers/misc/cxl/cxl.h +++ b/drivers/misc/cxl/cxl.h | |||
@@ -418,8 +418,9 @@ struct cxl_afu { | |||
418 | struct dentry *debugfs; | 418 | struct dentry *debugfs; |
419 | struct mutex contexts_lock; | 419 | struct mutex contexts_lock; |
420 | spinlock_t afu_cntl_lock; | 420 | spinlock_t afu_cntl_lock; |
421 | /* Used to block access to AFU config space while deconfigured */ | 421 | |
422 | struct rw_semaphore configured_rwsem; | 422 | /* -1: AFU deconfigured/locked, >= 0: number of readers */ |
423 | atomic_t configured_state; | ||
423 | 424 | ||
424 | /* AFU error buffer fields and bin attribute for sysfs */ | 425 | /* AFU error buffer fields and bin attribute for sysfs */ |
425 | u64 eb_len, eb_offset; | 426 | u64 eb_len, eb_offset; |
diff --git a/drivers/misc/cxl/main.c b/drivers/misc/cxl/main.c index 2a6bf1d0a3a4..cc1706a92ace 100644 --- a/drivers/misc/cxl/main.c +++ b/drivers/misc/cxl/main.c | |||
@@ -268,8 +268,7 @@ struct cxl_afu *cxl_alloc_afu(struct cxl *adapter, int slice) | |||
268 | idr_init(&afu->contexts_idr); | 268 | idr_init(&afu->contexts_idr); |
269 | mutex_init(&afu->contexts_lock); | 269 | mutex_init(&afu->contexts_lock); |
270 | spin_lock_init(&afu->afu_cntl_lock); | 270 | spin_lock_init(&afu->afu_cntl_lock); |
271 | init_rwsem(&afu->configured_rwsem); | 271 | atomic_set(&afu->configured_state, -1); |
272 | down_write(&afu->configured_rwsem); | ||
273 | afu->prefault_mode = CXL_PREFAULT_NONE; | 272 | afu->prefault_mode = CXL_PREFAULT_NONE; |
274 | afu->irqs_max = afu->adapter->user_irqs; | 273 | afu->irqs_max = afu->adapter->user_irqs; |
275 | 274 | ||
diff --git a/drivers/misc/cxl/pci.c b/drivers/misc/cxl/pci.c index cca938845ffd..91f645992c94 100644 --- a/drivers/misc/cxl/pci.c +++ b/drivers/misc/cxl/pci.c | |||
@@ -1129,7 +1129,7 @@ static int pci_configure_afu(struct cxl_afu *afu, struct cxl *adapter, struct pc | |||
1129 | if ((rc = cxl_native_register_psl_irq(afu))) | 1129 | if ((rc = cxl_native_register_psl_irq(afu))) |
1130 | goto err2; | 1130 | goto err2; |
1131 | 1131 | ||
1132 | up_write(&afu->configured_rwsem); | 1132 | atomic_set(&afu->configured_state, 0); |
1133 | return 0; | 1133 | return 0; |
1134 | 1134 | ||
1135 | err2: | 1135 | err2: |
@@ -1142,7 +1142,14 @@ err1: | |||
1142 | 1142 | ||
1143 | static void pci_deconfigure_afu(struct cxl_afu *afu) | 1143 | static void pci_deconfigure_afu(struct cxl_afu *afu) |
1144 | { | 1144 | { |
1145 | down_write(&afu->configured_rwsem); | 1145 | /* |
1146 | * It's okay to deconfigure when AFU is already locked, otherwise wait | ||
1147 | * until there are no readers | ||
1148 | */ | ||
1149 | if (atomic_read(&afu->configured_state) != -1) { | ||
1150 | while (atomic_cmpxchg(&afu->configured_state, 0, -1) != -1) | ||
1151 | schedule(); | ||
1152 | } | ||
1146 | cxl_native_release_psl_irq(afu); | 1153 | cxl_native_release_psl_irq(afu); |
1147 | if (afu->adapter->native->sl_ops->release_serr_irq) | 1154 | if (afu->adapter->native->sl_ops->release_serr_irq) |
1148 | afu->adapter->native->sl_ops->release_serr_irq(afu); | 1155 | afu->adapter->native->sl_ops->release_serr_irq(afu); |
diff --git a/drivers/misc/cxl/vphb.c b/drivers/misc/cxl/vphb.c index 639a343b7836..512a4897dbf6 100644 --- a/drivers/misc/cxl/vphb.c +++ b/drivers/misc/cxl/vphb.c | |||
@@ -83,6 +83,16 @@ static inline struct cxl_afu *pci_bus_to_afu(struct pci_bus *bus) | |||
83 | return phb ? phb->private_data : NULL; | 83 | return phb ? phb->private_data : NULL; |
84 | } | 84 | } |
85 | 85 | ||
86 | static void cxl_afu_configured_put(struct cxl_afu *afu) | ||
87 | { | ||
88 | atomic_dec_if_positive(&afu->configured_state); | ||
89 | } | ||
90 | |||
91 | static bool cxl_afu_configured_get(struct cxl_afu *afu) | ||
92 | { | ||
93 | return atomic_inc_unless_negative(&afu->configured_state); | ||
94 | } | ||
95 | |||
86 | static inline int cxl_pcie_config_info(struct pci_bus *bus, unsigned int devfn, | 96 | static inline int cxl_pcie_config_info(struct pci_bus *bus, unsigned int devfn, |
87 | struct cxl_afu *afu, int *_record) | 97 | struct cxl_afu *afu, int *_record) |
88 | { | 98 | { |
@@ -107,7 +117,7 @@ static int cxl_pcie_read_config(struct pci_bus *bus, unsigned int devfn, | |||
107 | 117 | ||
108 | afu = pci_bus_to_afu(bus); | 118 | afu = pci_bus_to_afu(bus); |
109 | /* Grab a reader lock on afu. */ | 119 | /* Grab a reader lock on afu. */ |
110 | if (afu == NULL || !down_read_trylock(&afu->configured_rwsem)) | 120 | if (afu == NULL || !cxl_afu_configured_get(afu)) |
111 | return PCIBIOS_DEVICE_NOT_FOUND; | 121 | return PCIBIOS_DEVICE_NOT_FOUND; |
112 | 122 | ||
113 | rc = cxl_pcie_config_info(bus, devfn, afu, &record); | 123 | rc = cxl_pcie_config_info(bus, devfn, afu, &record); |
@@ -132,7 +142,7 @@ static int cxl_pcie_read_config(struct pci_bus *bus, unsigned int devfn, | |||
132 | } | 142 | } |
133 | 143 | ||
134 | out: | 144 | out: |
135 | up_read(&afu->configured_rwsem); | 145 | cxl_afu_configured_put(afu); |
136 | return rc ? PCIBIOS_DEVICE_NOT_FOUND : PCIBIOS_SUCCESSFUL; | 146 | return rc ? PCIBIOS_DEVICE_NOT_FOUND : PCIBIOS_SUCCESSFUL; |
137 | } | 147 | } |
138 | 148 | ||
@@ -144,7 +154,7 @@ static int cxl_pcie_write_config(struct pci_bus *bus, unsigned int devfn, | |||
144 | 154 | ||
145 | afu = pci_bus_to_afu(bus); | 155 | afu = pci_bus_to_afu(bus); |
146 | /* Grab a reader lock on afu. */ | 156 | /* Grab a reader lock on afu. */ |
147 | if (afu == NULL || !down_read_trylock(&afu->configured_rwsem)) | 157 | if (afu == NULL || !cxl_afu_configured_get(afu)) |
148 | return PCIBIOS_DEVICE_NOT_FOUND; | 158 | return PCIBIOS_DEVICE_NOT_FOUND; |
149 | 159 | ||
150 | rc = cxl_pcie_config_info(bus, devfn, afu, &record); | 160 | rc = cxl_pcie_config_info(bus, devfn, afu, &record); |
@@ -166,7 +176,7 @@ static int cxl_pcie_write_config(struct pci_bus *bus, unsigned int devfn, | |||
166 | } | 176 | } |
167 | 177 | ||
168 | out: | 178 | out: |
169 | up_read(&afu->configured_rwsem); | 179 | cxl_afu_configured_put(afu); |
170 | return rc ? PCIBIOS_SET_FAILED : PCIBIOS_SUCCESSFUL; | 180 | return rc ? PCIBIOS_SET_FAILED : PCIBIOS_SUCCESSFUL; |
171 | } | 181 | } |
172 | 182 | ||
diff --git a/drivers/pci/hotplug/pnv_php.c b/drivers/pci/hotplug/pnv_php.c index d2961ef39a3a..7c203198b582 100644 --- a/drivers/pci/hotplug/pnv_php.c +++ b/drivers/pci/hotplug/pnv_php.c | |||
@@ -35,9 +35,11 @@ static void pnv_php_register(struct device_node *dn); | |||
35 | static void pnv_php_unregister_one(struct device_node *dn); | 35 | static void pnv_php_unregister_one(struct device_node *dn); |
36 | static void pnv_php_unregister(struct device_node *dn); | 36 | static void pnv_php_unregister(struct device_node *dn); |
37 | 37 | ||
38 | static void pnv_php_disable_irq(struct pnv_php_slot *php_slot) | 38 | static void pnv_php_disable_irq(struct pnv_php_slot *php_slot, |
39 | bool disable_device) | ||
39 | { | 40 | { |
40 | struct pci_dev *pdev = php_slot->pdev; | 41 | struct pci_dev *pdev = php_slot->pdev; |
42 | int irq = php_slot->irq; | ||
41 | u16 ctrl; | 43 | u16 ctrl; |
42 | 44 | ||
43 | if (php_slot->irq > 0) { | 45 | if (php_slot->irq > 0) { |
@@ -56,10 +58,14 @@ static void pnv_php_disable_irq(struct pnv_php_slot *php_slot) | |||
56 | php_slot->wq = NULL; | 58 | php_slot->wq = NULL; |
57 | } | 59 | } |
58 | 60 | ||
59 | if (pdev->msix_enabled) | 61 | if (disable_device || irq > 0) { |
60 | pci_disable_msix(pdev); | 62 | if (pdev->msix_enabled) |
61 | else if (pdev->msi_enabled) | 63 | pci_disable_msix(pdev); |
62 | pci_disable_msi(pdev); | 64 | else if (pdev->msi_enabled) |
65 | pci_disable_msi(pdev); | ||
66 | |||
67 | pci_disable_device(pdev); | ||
68 | } | ||
63 | } | 69 | } |
64 | 70 | ||
65 | static void pnv_php_free_slot(struct kref *kref) | 71 | static void pnv_php_free_slot(struct kref *kref) |
@@ -68,7 +74,7 @@ static void pnv_php_free_slot(struct kref *kref) | |||
68 | struct pnv_php_slot, kref); | 74 | struct pnv_php_slot, kref); |
69 | 75 | ||
70 | WARN_ON(!list_empty(&php_slot->children)); | 76 | WARN_ON(!list_empty(&php_slot->children)); |
71 | pnv_php_disable_irq(php_slot); | 77 | pnv_php_disable_irq(php_slot, false); |
72 | kfree(php_slot->name); | 78 | kfree(php_slot->name); |
73 | kfree(php_slot); | 79 | kfree(php_slot); |
74 | } | 80 | } |
@@ -76,7 +82,7 @@ static void pnv_php_free_slot(struct kref *kref) | |||
76 | static inline void pnv_php_put_slot(struct pnv_php_slot *php_slot) | 82 | static inline void pnv_php_put_slot(struct pnv_php_slot *php_slot) |
77 | { | 83 | { |
78 | 84 | ||
79 | if (WARN_ON(!php_slot)) | 85 | if (!php_slot) |
80 | return; | 86 | return; |
81 | 87 | ||
82 | kref_put(&php_slot->kref, pnv_php_free_slot); | 88 | kref_put(&php_slot->kref, pnv_php_free_slot); |
@@ -430,9 +436,21 @@ static int pnv_php_enable(struct pnv_php_slot *php_slot, bool rescan) | |||
430 | if (ret) | 436 | if (ret) |
431 | return ret; | 437 | return ret; |
432 | 438 | ||
433 | /* Proceed if there have nothing behind the slot */ | 439 | /* |
434 | if (presence == OPAL_PCI_SLOT_EMPTY) | 440 | * Proceed if there have nothing behind the slot. However, |
441 | * we should leave the slot in registered state at the | ||
442 | * beginning. Otherwise, the PCI devices inserted afterwards | ||
443 | * won't be probed and populated. | ||
444 | */ | ||
445 | if (presence == OPAL_PCI_SLOT_EMPTY) { | ||
446 | if (!php_slot->power_state_check) { | ||
447 | php_slot->power_state_check = true; | ||
448 | |||
449 | return 0; | ||
450 | } | ||
451 | |||
435 | goto scan; | 452 | goto scan; |
453 | } | ||
436 | 454 | ||
437 | /* | 455 | /* |
438 | * If the power supply to the slot is off, we can't detect | 456 | * If the power supply to the slot is off, we can't detect |
@@ -705,10 +723,15 @@ static irqreturn_t pnv_php_interrupt(int irq, void *data) | |||
705 | if (sts & PCI_EXP_SLTSTA_DLLSC) { | 723 | if (sts & PCI_EXP_SLTSTA_DLLSC) { |
706 | pcie_capability_read_word(pdev, PCI_EXP_LNKSTA, &lsts); | 724 | pcie_capability_read_word(pdev, PCI_EXP_LNKSTA, &lsts); |
707 | added = !!(lsts & PCI_EXP_LNKSTA_DLLLA); | 725 | added = !!(lsts & PCI_EXP_LNKSTA_DLLLA); |
708 | } else if (sts & PCI_EXP_SLTSTA_PDC) { | 726 | } else if (!(php_slot->flags & PNV_PHP_FLAG_BROKEN_PDC) && |
727 | (sts & PCI_EXP_SLTSTA_PDC)) { | ||
709 | ret = pnv_pci_get_presence_state(php_slot->id, &presence); | 728 | ret = pnv_pci_get_presence_state(php_slot->id, &presence); |
710 | if (!ret) | 729 | if (ret) { |
730 | dev_warn(&pdev->dev, "PCI slot [%s] error %d getting presence (0x%04x), to retry the operation.\n", | ||
731 | php_slot->name, ret, sts); | ||
711 | return IRQ_HANDLED; | 732 | return IRQ_HANDLED; |
733 | } | ||
734 | |||
712 | added = !!(presence == OPAL_PCI_SLOT_PRESENT); | 735 | added = !!(presence == OPAL_PCI_SLOT_PRESENT); |
713 | } else { | 736 | } else { |
714 | return IRQ_NONE; | 737 | return IRQ_NONE; |
@@ -752,6 +775,7 @@ static irqreturn_t pnv_php_interrupt(int irq, void *data) | |||
752 | static void pnv_php_init_irq(struct pnv_php_slot *php_slot, int irq) | 775 | static void pnv_php_init_irq(struct pnv_php_slot *php_slot, int irq) |
753 | { | 776 | { |
754 | struct pci_dev *pdev = php_slot->pdev; | 777 | struct pci_dev *pdev = php_slot->pdev; |
778 | u32 broken_pdc = 0; | ||
755 | u16 sts, ctrl; | 779 | u16 sts, ctrl; |
756 | int ret; | 780 | int ret; |
757 | 781 | ||
@@ -759,29 +783,44 @@ static void pnv_php_init_irq(struct pnv_php_slot *php_slot, int irq) | |||
759 | php_slot->wq = alloc_workqueue("pciehp-%s", 0, 0, php_slot->name); | 783 | php_slot->wq = alloc_workqueue("pciehp-%s", 0, 0, php_slot->name); |
760 | if (!php_slot->wq) { | 784 | if (!php_slot->wq) { |
761 | dev_warn(&pdev->dev, "Cannot alloc workqueue\n"); | 785 | dev_warn(&pdev->dev, "Cannot alloc workqueue\n"); |
762 | pnv_php_disable_irq(php_slot); | 786 | pnv_php_disable_irq(php_slot, true); |
763 | return; | 787 | return; |
764 | } | 788 | } |
765 | 789 | ||
790 | /* Check PDC (Presence Detection Change) is broken or not */ | ||
791 | ret = of_property_read_u32(php_slot->dn, "ibm,slot-broken-pdc", | ||
792 | &broken_pdc); | ||
793 | if (!ret && broken_pdc) | ||
794 | php_slot->flags |= PNV_PHP_FLAG_BROKEN_PDC; | ||
795 | |||
766 | /* Clear pending interrupts */ | 796 | /* Clear pending interrupts */ |
767 | pcie_capability_read_word(pdev, PCI_EXP_SLTSTA, &sts); | 797 | pcie_capability_read_word(pdev, PCI_EXP_SLTSTA, &sts); |
768 | sts |= (PCI_EXP_SLTSTA_PDC | PCI_EXP_SLTSTA_DLLSC); | 798 | if (php_slot->flags & PNV_PHP_FLAG_BROKEN_PDC) |
799 | sts |= PCI_EXP_SLTSTA_DLLSC; | ||
800 | else | ||
801 | sts |= (PCI_EXP_SLTSTA_PDC | PCI_EXP_SLTSTA_DLLSC); | ||
769 | pcie_capability_write_word(pdev, PCI_EXP_SLTSTA, sts); | 802 | pcie_capability_write_word(pdev, PCI_EXP_SLTSTA, sts); |
770 | 803 | ||
771 | /* Request the interrupt */ | 804 | /* Request the interrupt */ |
772 | ret = request_irq(irq, pnv_php_interrupt, IRQF_SHARED, | 805 | ret = request_irq(irq, pnv_php_interrupt, IRQF_SHARED, |
773 | php_slot->name, php_slot); | 806 | php_slot->name, php_slot); |
774 | if (ret) { | 807 | if (ret) { |
775 | pnv_php_disable_irq(php_slot); | 808 | pnv_php_disable_irq(php_slot, true); |
776 | dev_warn(&pdev->dev, "Error %d enabling IRQ %d\n", ret, irq); | 809 | dev_warn(&pdev->dev, "Error %d enabling IRQ %d\n", ret, irq); |
777 | return; | 810 | return; |
778 | } | 811 | } |
779 | 812 | ||
780 | /* Enable the interrupts */ | 813 | /* Enable the interrupts */ |
781 | pcie_capability_read_word(pdev, PCI_EXP_SLTCTL, &ctrl); | 814 | pcie_capability_read_word(pdev, PCI_EXP_SLTCTL, &ctrl); |
782 | ctrl |= (PCI_EXP_SLTCTL_HPIE | | 815 | if (php_slot->flags & PNV_PHP_FLAG_BROKEN_PDC) { |
783 | PCI_EXP_SLTCTL_PDCE | | 816 | ctrl &= ~PCI_EXP_SLTCTL_PDCE; |
784 | PCI_EXP_SLTCTL_DLLSCE); | 817 | ctrl |= (PCI_EXP_SLTCTL_HPIE | |
818 | PCI_EXP_SLTCTL_DLLSCE); | ||
819 | } else { | ||
820 | ctrl |= (PCI_EXP_SLTCTL_HPIE | | ||
821 | PCI_EXP_SLTCTL_PDCE | | ||
822 | PCI_EXP_SLTCTL_DLLSCE); | ||
823 | } | ||
785 | pcie_capability_write_word(pdev, PCI_EXP_SLTCTL, ctrl); | 824 | pcie_capability_write_word(pdev, PCI_EXP_SLTCTL, ctrl); |
786 | 825 | ||
787 | /* The interrupt is initialized successfully when @irq is valid */ | 826 | /* The interrupt is initialized successfully when @irq is valid */ |
@@ -793,6 +832,14 @@ static void pnv_php_enable_irq(struct pnv_php_slot *php_slot) | |||
793 | struct pci_dev *pdev = php_slot->pdev; | 832 | struct pci_dev *pdev = php_slot->pdev; |
794 | int irq, ret; | 833 | int irq, ret; |
795 | 834 | ||
835 | /* | ||
836 | * The MSI/MSIx interrupt might have been occupied by other | ||
837 | * drivers. Don't populate the surprise hotplug capability | ||
838 | * in that case. | ||
839 | */ | ||
840 | if (pci_dev_msi_enabled(pdev)) | ||
841 | return; | ||
842 | |||
796 | ret = pci_enable_device(pdev); | 843 | ret = pci_enable_device(pdev); |
797 | if (ret) { | 844 | if (ret) { |
798 | dev_warn(&pdev->dev, "Error %d enabling device\n", ret); | 845 | dev_warn(&pdev->dev, "Error %d enabling device\n", ret); |
diff --git a/drivers/pwm/Kconfig b/drivers/pwm/Kconfig index 2d0cfaa6d84c..42e37c20b361 100644 --- a/drivers/pwm/Kconfig +++ b/drivers/pwm/Kconfig | |||
@@ -76,7 +76,9 @@ config PWM_ATMEL_TCB | |||
76 | 76 | ||
77 | config PWM_BCM_IPROC | 77 | config PWM_BCM_IPROC |
78 | tristate "iProc PWM support" | 78 | tristate "iProc PWM support" |
79 | depends on ARCH_BCM_IPROC | 79 | depends on ARCH_BCM_IPROC || COMPILE_TEST |
80 | depends on COMMON_CLK | ||
81 | default ARCH_BCM_IPROC | ||
80 | help | 82 | help |
81 | Generic PWM framework driver for Broadcom iProc PWM block. This | 83 | Generic PWM framework driver for Broadcom iProc PWM block. This |
82 | block is used in Broadcom iProc SoC's. | 84 | block is used in Broadcom iProc SoC's. |
diff --git a/drivers/pwm/core.c b/drivers/pwm/core.c index 172ef8245811..a0860b30bd93 100644 --- a/drivers/pwm/core.c +++ b/drivers/pwm/core.c | |||
@@ -137,9 +137,14 @@ of_pwm_xlate_with_flags(struct pwm_chip *pc, const struct of_phandle_args *args) | |||
137 | { | 137 | { |
138 | struct pwm_device *pwm; | 138 | struct pwm_device *pwm; |
139 | 139 | ||
140 | /* check, whether the driver supports a third cell for flags */ | ||
140 | if (pc->of_pwm_n_cells < 3) | 141 | if (pc->of_pwm_n_cells < 3) |
141 | return ERR_PTR(-EINVAL); | 142 | return ERR_PTR(-EINVAL); |
142 | 143 | ||
144 | /* flags in the third cell are optional */ | ||
145 | if (args->args_count < 2) | ||
146 | return ERR_PTR(-EINVAL); | ||
147 | |||
143 | if (args->args[0] >= pc->npwm) | 148 | if (args->args[0] >= pc->npwm) |
144 | return ERR_PTR(-EINVAL); | 149 | return ERR_PTR(-EINVAL); |
145 | 150 | ||
@@ -148,11 +153,10 @@ of_pwm_xlate_with_flags(struct pwm_chip *pc, const struct of_phandle_args *args) | |||
148 | return pwm; | 153 | return pwm; |
149 | 154 | ||
150 | pwm->args.period = args->args[1]; | 155 | pwm->args.period = args->args[1]; |
156 | pwm->args.polarity = PWM_POLARITY_NORMAL; | ||
151 | 157 | ||
152 | if (args->args[2] & PWM_POLARITY_INVERTED) | 158 | if (args->args_count > 2 && args->args[2] & PWM_POLARITY_INVERTED) |
153 | pwm->args.polarity = PWM_POLARITY_INVERSED; | 159 | pwm->args.polarity = PWM_POLARITY_INVERSED; |
154 | else | ||
155 | pwm->args.polarity = PWM_POLARITY_NORMAL; | ||
156 | 160 | ||
157 | return pwm; | 161 | return pwm; |
158 | } | 162 | } |
@@ -163,9 +167,14 @@ of_pwm_simple_xlate(struct pwm_chip *pc, const struct of_phandle_args *args) | |||
163 | { | 167 | { |
164 | struct pwm_device *pwm; | 168 | struct pwm_device *pwm; |
165 | 169 | ||
170 | /* sanity check driver support */ | ||
166 | if (pc->of_pwm_n_cells < 2) | 171 | if (pc->of_pwm_n_cells < 2) |
167 | return ERR_PTR(-EINVAL); | 172 | return ERR_PTR(-EINVAL); |
168 | 173 | ||
174 | /* all cells are required */ | ||
175 | if (args->args_count != pc->of_pwm_n_cells) | ||
176 | return ERR_PTR(-EINVAL); | ||
177 | |||
169 | if (args->args[0] >= pc->npwm) | 178 | if (args->args[0] >= pc->npwm) |
170 | return ERR_PTR(-EINVAL); | 179 | return ERR_PTR(-EINVAL); |
171 | 180 | ||
@@ -663,24 +672,17 @@ struct pwm_device *of_pwm_get(struct device_node *np, const char *con_id) | |||
663 | err = of_parse_phandle_with_args(np, "pwms", "#pwm-cells", index, | 672 | err = of_parse_phandle_with_args(np, "pwms", "#pwm-cells", index, |
664 | &args); | 673 | &args); |
665 | if (err) { | 674 | if (err) { |
666 | pr_debug("%s(): can't parse \"pwms\" property\n", __func__); | 675 | pr_err("%s(): can't parse \"pwms\" property\n", __func__); |
667 | return ERR_PTR(err); | 676 | return ERR_PTR(err); |
668 | } | 677 | } |
669 | 678 | ||
670 | pc = of_node_to_pwmchip(args.np); | 679 | pc = of_node_to_pwmchip(args.np); |
671 | if (IS_ERR(pc)) { | 680 | if (IS_ERR(pc)) { |
672 | pr_debug("%s(): PWM chip not found\n", __func__); | 681 | pr_err("%s(): PWM chip not found\n", __func__); |
673 | pwm = ERR_CAST(pc); | 682 | pwm = ERR_CAST(pc); |
674 | goto put; | 683 | goto put; |
675 | } | 684 | } |
676 | 685 | ||
677 | if (args.args_count != pc->of_pwm_n_cells) { | ||
678 | pr_debug("%s: wrong #pwm-cells for %s\n", np->full_name, | ||
679 | args.np->full_name); | ||
680 | pwm = ERR_PTR(-EINVAL); | ||
681 | goto put; | ||
682 | } | ||
683 | |||
684 | pwm = pc->of_xlate(pc, &args); | 686 | pwm = pc->of_xlate(pc, &args); |
685 | if (IS_ERR(pwm)) | 687 | if (IS_ERR(pwm)) |
686 | goto put; | 688 | goto put; |
@@ -757,12 +759,13 @@ void pwm_remove_table(struct pwm_lookup *table, size_t num) | |||
757 | */ | 759 | */ |
758 | struct pwm_device *pwm_get(struct device *dev, const char *con_id) | 760 | struct pwm_device *pwm_get(struct device *dev, const char *con_id) |
759 | { | 761 | { |
760 | struct pwm_device *pwm = ERR_PTR(-EPROBE_DEFER); | ||
761 | const char *dev_id = dev ? dev_name(dev) : NULL; | 762 | const char *dev_id = dev ? dev_name(dev) : NULL; |
762 | struct pwm_chip *chip = NULL; | 763 | struct pwm_device *pwm; |
764 | struct pwm_chip *chip; | ||
763 | unsigned int best = 0; | 765 | unsigned int best = 0; |
764 | struct pwm_lookup *p, *chosen = NULL; | 766 | struct pwm_lookup *p, *chosen = NULL; |
765 | unsigned int match; | 767 | unsigned int match; |
768 | int err; | ||
766 | 769 | ||
767 | /* look up via DT first */ | 770 | /* look up via DT first */ |
768 | if (IS_ENABLED(CONFIG_OF) && dev && dev->of_node) | 771 | if (IS_ENABLED(CONFIG_OF) && dev && dev->of_node) |
@@ -817,24 +820,35 @@ struct pwm_device *pwm_get(struct device *dev, const char *con_id) | |||
817 | } | 820 | } |
818 | } | 821 | } |
819 | 822 | ||
820 | if (!chosen) { | 823 | mutex_unlock(&pwm_lookup_lock); |
821 | pwm = ERR_PTR(-ENODEV); | 824 | |
822 | goto out; | 825 | if (!chosen) |
823 | } | 826 | return ERR_PTR(-ENODEV); |
824 | 827 | ||
825 | chip = pwmchip_find_by_name(chosen->provider); | 828 | chip = pwmchip_find_by_name(chosen->provider); |
829 | |||
830 | /* | ||
831 | * If the lookup entry specifies a module, load the module and retry | ||
832 | * the PWM chip lookup. This can be used to work around driver load | ||
833 | * ordering issues if driver's can't be made to properly support the | ||
834 | * deferred probe mechanism. | ||
835 | */ | ||
836 | if (!chip && chosen->module) { | ||
837 | err = request_module(chosen->module); | ||
838 | if (err == 0) | ||
839 | chip = pwmchip_find_by_name(chosen->provider); | ||
840 | } | ||
841 | |||
826 | if (!chip) | 842 | if (!chip) |
827 | goto out; | 843 | return ERR_PTR(-EPROBE_DEFER); |
828 | 844 | ||
829 | pwm = pwm_request_from_chip(chip, chosen->index, con_id ?: dev_id); | 845 | pwm = pwm_request_from_chip(chip, chosen->index, con_id ?: dev_id); |
830 | if (IS_ERR(pwm)) | 846 | if (IS_ERR(pwm)) |
831 | goto out; | 847 | return pwm; |
832 | 848 | ||
833 | pwm->args.period = chosen->period; | 849 | pwm->args.period = chosen->period; |
834 | pwm->args.polarity = chosen->polarity; | 850 | pwm->args.polarity = chosen->polarity; |
835 | 851 | ||
836 | out: | ||
837 | mutex_unlock(&pwm_lookup_lock); | ||
838 | return pwm; | 852 | return pwm; |
839 | } | 853 | } |
840 | EXPORT_SYMBOL_GPL(pwm_get); | 854 | EXPORT_SYMBOL_GPL(pwm_get); |
@@ -960,18 +974,6 @@ void devm_pwm_put(struct device *dev, struct pwm_device *pwm) | |||
960 | } | 974 | } |
961 | EXPORT_SYMBOL_GPL(devm_pwm_put); | 975 | EXPORT_SYMBOL_GPL(devm_pwm_put); |
962 | 976 | ||
963 | /** | ||
964 | * pwm_can_sleep() - report whether PWM access will sleep | ||
965 | * @pwm: PWM device | ||
966 | * | ||
967 | * Returns: True if accessing the PWM can sleep, false otherwise. | ||
968 | */ | ||
969 | bool pwm_can_sleep(struct pwm_device *pwm) | ||
970 | { | ||
971 | return true; | ||
972 | } | ||
973 | EXPORT_SYMBOL_GPL(pwm_can_sleep); | ||
974 | |||
975 | #ifdef CONFIG_DEBUG_FS | 977 | #ifdef CONFIG_DEBUG_FS |
976 | static void pwm_dbg_show(struct pwm_chip *chip, struct seq_file *s) | 978 | static void pwm_dbg_show(struct pwm_chip *chip, struct seq_file *s) |
977 | { | 979 | { |
diff --git a/drivers/pwm/pwm-atmel-hlcdc.c b/drivers/pwm/pwm-atmel-hlcdc.c index 14fc011faa32..999187277ea5 100644 --- a/drivers/pwm/pwm-atmel-hlcdc.c +++ b/drivers/pwm/pwm-atmel-hlcdc.c | |||
@@ -270,7 +270,6 @@ static int atmel_hlcdc_pwm_probe(struct platform_device *pdev) | |||
270 | chip->chip.npwm = 1; | 270 | chip->chip.npwm = 1; |
271 | chip->chip.of_xlate = of_pwm_xlate_with_flags; | 271 | chip->chip.of_xlate = of_pwm_xlate_with_flags; |
272 | chip->chip.of_pwm_n_cells = 3; | 272 | chip->chip.of_pwm_n_cells = 3; |
273 | chip->chip.can_sleep = 1; | ||
274 | 273 | ||
275 | ret = pwmchip_add_with_polarity(&chip->chip, PWM_POLARITY_INVERSED); | 274 | ret = pwmchip_add_with_polarity(&chip->chip, PWM_POLARITY_INVERSED); |
276 | if (ret) { | 275 | if (ret) { |
diff --git a/drivers/pwm/pwm-atmel.c b/drivers/pwm/pwm-atmel.c index e6b8b1b7e6ba..67a7023be5c2 100644 --- a/drivers/pwm/pwm-atmel.c +++ b/drivers/pwm/pwm-atmel.c | |||
@@ -385,7 +385,6 @@ static int atmel_pwm_probe(struct platform_device *pdev) | |||
385 | 385 | ||
386 | atmel_pwm->chip.base = -1; | 386 | atmel_pwm->chip.base = -1; |
387 | atmel_pwm->chip.npwm = 4; | 387 | atmel_pwm->chip.npwm = 4; |
388 | atmel_pwm->chip.can_sleep = true; | ||
389 | atmel_pwm->config = data->config; | 388 | atmel_pwm->config = data->config; |
390 | atmel_pwm->updated_pwms = 0; | 389 | atmel_pwm->updated_pwms = 0; |
391 | mutex_init(&atmel_pwm->isr_lock); | 390 | mutex_init(&atmel_pwm->isr_lock); |
diff --git a/drivers/pwm/pwm-bcm-kona.c b/drivers/pwm/pwm-bcm-kona.c index c63418322023..09a95aeb3a70 100644 --- a/drivers/pwm/pwm-bcm-kona.c +++ b/drivers/pwm/pwm-bcm-kona.c | |||
@@ -276,7 +276,6 @@ static int kona_pwmc_probe(struct platform_device *pdev) | |||
276 | kp->chip.npwm = 6; | 276 | kp->chip.npwm = 6; |
277 | kp->chip.of_xlate = of_pwm_xlate_with_flags; | 277 | kp->chip.of_xlate = of_pwm_xlate_with_flags; |
278 | kp->chip.of_pwm_n_cells = 3; | 278 | kp->chip.of_pwm_n_cells = 3; |
279 | kp->chip.can_sleep = true; | ||
280 | 279 | ||
281 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 280 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
282 | kp->base = devm_ioremap_resource(&pdev->dev, res); | 281 | kp->base = devm_ioremap_resource(&pdev->dev, res); |
diff --git a/drivers/pwm/pwm-berlin.c b/drivers/pwm/pwm-berlin.c index 01339c152ab0..771859aca4be 100644 --- a/drivers/pwm/pwm-berlin.c +++ b/drivers/pwm/pwm-berlin.c | |||
@@ -206,7 +206,6 @@ static int berlin_pwm_probe(struct platform_device *pdev) | |||
206 | pwm->chip.ops = &berlin_pwm_ops; | 206 | pwm->chip.ops = &berlin_pwm_ops; |
207 | pwm->chip.base = -1; | 207 | pwm->chip.base = -1; |
208 | pwm->chip.npwm = 4; | 208 | pwm->chip.npwm = 4; |
209 | pwm->chip.can_sleep = true; | ||
210 | pwm->chip.of_xlate = of_pwm_xlate_with_flags; | 209 | pwm->chip.of_xlate = of_pwm_xlate_with_flags; |
211 | pwm->chip.of_pwm_n_cells = 3; | 210 | pwm->chip.of_pwm_n_cells = 3; |
212 | 211 | ||
diff --git a/drivers/pwm/pwm-bfin.c b/drivers/pwm/pwm-bfin.c index 7631ef194de7..d2ed0a2a18e8 100644 --- a/drivers/pwm/pwm-bfin.c +++ b/drivers/pwm/pwm-bfin.c | |||
@@ -103,7 +103,7 @@ static void bfin_pwm_disable(struct pwm_chip *chip, struct pwm_device *pwm) | |||
103 | disable_gptimer(priv->pin); | 103 | disable_gptimer(priv->pin); |
104 | } | 104 | } |
105 | 105 | ||
106 | static struct pwm_ops bfin_pwm_ops = { | 106 | static const struct pwm_ops bfin_pwm_ops = { |
107 | .request = bfin_pwm_request, | 107 | .request = bfin_pwm_request, |
108 | .free = bfin_pwm_free, | 108 | .free = bfin_pwm_free, |
109 | .config = bfin_pwm_config, | 109 | .config = bfin_pwm_config, |
diff --git a/drivers/pwm/pwm-brcmstb.c b/drivers/pwm/pwm-brcmstb.c index 5d5adee16886..8063cffa1c96 100644 --- a/drivers/pwm/pwm-brcmstb.c +++ b/drivers/pwm/pwm-brcmstb.c | |||
@@ -270,7 +270,6 @@ static int brcmstb_pwm_probe(struct platform_device *pdev) | |||
270 | p->chip.ops = &brcmstb_pwm_ops; | 270 | p->chip.ops = &brcmstb_pwm_ops; |
271 | p->chip.base = -1; | 271 | p->chip.base = -1; |
272 | p->chip.npwm = 2; | 272 | p->chip.npwm = 2; |
273 | p->chip.can_sleep = true; | ||
274 | 273 | ||
275 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 274 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
276 | p->base = devm_ioremap_resource(&pdev->dev, res); | 275 | p->base = devm_ioremap_resource(&pdev->dev, res); |
diff --git a/drivers/pwm/pwm-fsl-ftm.c b/drivers/pwm/pwm-fsl-ftm.c index fad968eb75f6..557b4ea16796 100644 --- a/drivers/pwm/pwm-fsl-ftm.c +++ b/drivers/pwm/pwm-fsl-ftm.c | |||
@@ -446,7 +446,6 @@ static int fsl_pwm_probe(struct platform_device *pdev) | |||
446 | fpc->chip.of_pwm_n_cells = 3; | 446 | fpc->chip.of_pwm_n_cells = 3; |
447 | fpc->chip.base = -1; | 447 | fpc->chip.base = -1; |
448 | fpc->chip.npwm = 8; | 448 | fpc->chip.npwm = 8; |
449 | fpc->chip.can_sleep = true; | ||
450 | 449 | ||
451 | ret = pwmchip_add(&fpc->chip); | 450 | ret = pwmchip_add(&fpc->chip); |
452 | if (ret < 0) { | 451 | if (ret < 0) { |
diff --git a/drivers/pwm/pwm-imx.c b/drivers/pwm/pwm-imx.c index d600fd5cd4ba..2ba5c3a398ff 100644 --- a/drivers/pwm/pwm-imx.c +++ b/drivers/pwm/pwm-imx.c | |||
@@ -38,6 +38,7 @@ | |||
38 | #define MX3_PWMCR_DOZEEN (1 << 24) | 38 | #define MX3_PWMCR_DOZEEN (1 << 24) |
39 | #define MX3_PWMCR_WAITEN (1 << 23) | 39 | #define MX3_PWMCR_WAITEN (1 << 23) |
40 | #define MX3_PWMCR_DBGEN (1 << 22) | 40 | #define MX3_PWMCR_DBGEN (1 << 22) |
41 | #define MX3_PWMCR_POUTC (1 << 18) | ||
41 | #define MX3_PWMCR_CLKSRC_IPG_HIGH (2 << 16) | 42 | #define MX3_PWMCR_CLKSRC_IPG_HIGH (2 << 16) |
42 | #define MX3_PWMCR_CLKSRC_IPG (1 << 16) | 43 | #define MX3_PWMCR_CLKSRC_IPG (1 << 16) |
43 | #define MX3_PWMCR_SWR (1 << 3) | 44 | #define MX3_PWMCR_SWR (1 << 3) |
@@ -49,15 +50,10 @@ | |||
49 | 50 | ||
50 | struct imx_chip { | 51 | struct imx_chip { |
51 | struct clk *clk_per; | 52 | struct clk *clk_per; |
52 | struct clk *clk_ipg; | ||
53 | 53 | ||
54 | void __iomem *mmio_base; | 54 | void __iomem *mmio_base; |
55 | 55 | ||
56 | struct pwm_chip chip; | 56 | struct pwm_chip chip; |
57 | |||
58 | int (*config)(struct pwm_chip *chip, | ||
59 | struct pwm_device *pwm, int duty_ns, int period_ns); | ||
60 | void (*set_enable)(struct pwm_chip *chip, bool enable); | ||
61 | }; | 57 | }; |
62 | 58 | ||
63 | #define to_imx_chip(chip) container_of(chip, struct imx_chip, chip) | 59 | #define to_imx_chip(chip) container_of(chip, struct imx_chip, chip) |
@@ -91,176 +87,170 @@ static int imx_pwm_config_v1(struct pwm_chip *chip, | |||
91 | return 0; | 87 | return 0; |
92 | } | 88 | } |
93 | 89 | ||
94 | static void imx_pwm_set_enable_v1(struct pwm_chip *chip, bool enable) | 90 | static int imx_pwm_enable_v1(struct pwm_chip *chip, struct pwm_device *pwm) |
95 | { | 91 | { |
96 | struct imx_chip *imx = to_imx_chip(chip); | 92 | struct imx_chip *imx = to_imx_chip(chip); |
97 | u32 val; | 93 | u32 val; |
94 | int ret; | ||
98 | 95 | ||
99 | val = readl(imx->mmio_base + MX1_PWMC); | 96 | ret = clk_prepare_enable(imx->clk_per); |
100 | 97 | if (ret < 0) | |
101 | if (enable) | 98 | return ret; |
102 | val |= MX1_PWMC_EN; | ||
103 | else | ||
104 | val &= ~MX1_PWMC_EN; | ||
105 | 99 | ||
100 | val = readl(imx->mmio_base + MX1_PWMC); | ||
101 | val |= MX1_PWMC_EN; | ||
106 | writel(val, imx->mmio_base + MX1_PWMC); | 102 | writel(val, imx->mmio_base + MX1_PWMC); |
107 | } | ||
108 | |||
109 | static int imx_pwm_config_v2(struct pwm_chip *chip, | ||
110 | struct pwm_device *pwm, int duty_ns, int period_ns) | ||
111 | { | ||
112 | struct imx_chip *imx = to_imx_chip(chip); | ||
113 | struct device *dev = chip->dev; | ||
114 | unsigned long long c; | ||
115 | unsigned long period_cycles, duty_cycles, prescale; | ||
116 | unsigned int period_ms; | ||
117 | bool enable = pwm_is_enabled(pwm); | ||
118 | int wait_count = 0, fifoav; | ||
119 | u32 cr, sr; | ||
120 | |||
121 | /* | ||
122 | * i.MX PWMv2 has a 4-word sample FIFO. | ||
123 | * In order to avoid FIFO overflow issue, we do software reset | ||
124 | * to clear all sample FIFO if the controller is disabled or | ||
125 | * wait for a full PWM cycle to get a relinquished FIFO slot | ||
126 | * when the controller is enabled and the FIFO is fully loaded. | ||
127 | */ | ||
128 | if (enable) { | ||
129 | sr = readl(imx->mmio_base + MX3_PWMSR); | ||
130 | fifoav = sr & MX3_PWMSR_FIFOAV_MASK; | ||
131 | if (fifoav == MX3_PWMSR_FIFOAV_4WORDS) { | ||
132 | period_ms = DIV_ROUND_UP(pwm_get_period(pwm), | ||
133 | NSEC_PER_MSEC); | ||
134 | msleep(period_ms); | ||
135 | |||
136 | sr = readl(imx->mmio_base + MX3_PWMSR); | ||
137 | if (fifoav == (sr & MX3_PWMSR_FIFOAV_MASK)) | ||
138 | dev_warn(dev, "there is no free FIFO slot\n"); | ||
139 | } | ||
140 | } else { | ||
141 | writel(MX3_PWMCR_SWR, imx->mmio_base + MX3_PWMCR); | ||
142 | do { | ||
143 | usleep_range(200, 1000); | ||
144 | cr = readl(imx->mmio_base + MX3_PWMCR); | ||
145 | } while ((cr & MX3_PWMCR_SWR) && | ||
146 | (wait_count++ < MX3_PWM_SWR_LOOP)); | ||
147 | |||
148 | if (cr & MX3_PWMCR_SWR) | ||
149 | dev_warn(dev, "software reset timeout\n"); | ||
150 | } | ||
151 | |||
152 | c = clk_get_rate(imx->clk_per); | ||
153 | c = c * period_ns; | ||
154 | do_div(c, 1000000000); | ||
155 | period_cycles = c; | ||
156 | |||
157 | prescale = period_cycles / 0x10000 + 1; | ||
158 | |||
159 | period_cycles /= prescale; | ||
160 | c = (unsigned long long)period_cycles * duty_ns; | ||
161 | do_div(c, period_ns); | ||
162 | duty_cycles = c; | ||
163 | |||
164 | /* | ||
165 | * according to imx pwm RM, the real period value should be | ||
166 | * PERIOD value in PWMPR plus 2. | ||
167 | */ | ||
168 | if (period_cycles > 2) | ||
169 | period_cycles -= 2; | ||
170 | else | ||
171 | period_cycles = 0; | ||
172 | |||
173 | writel(duty_cycles, imx->mmio_base + MX3_PWMSAR); | ||
174 | writel(period_cycles, imx->mmio_base + MX3_PWMPR); | ||
175 | |||
176 | cr = MX3_PWMCR_PRESCALER(prescale) | | ||
177 | MX3_PWMCR_DOZEEN | MX3_PWMCR_WAITEN | | ||
178 | MX3_PWMCR_DBGEN | MX3_PWMCR_CLKSRC_IPG_HIGH; | ||
179 | |||
180 | if (enable) | ||
181 | cr |= MX3_PWMCR_EN; | ||
182 | |||
183 | writel(cr, imx->mmio_base + MX3_PWMCR); | ||
184 | 103 | ||
185 | return 0; | 104 | return 0; |
186 | } | 105 | } |
187 | 106 | ||
188 | static void imx_pwm_set_enable_v2(struct pwm_chip *chip, bool enable) | 107 | static void imx_pwm_disable_v1(struct pwm_chip *chip, struct pwm_device *pwm) |
189 | { | 108 | { |
190 | struct imx_chip *imx = to_imx_chip(chip); | 109 | struct imx_chip *imx = to_imx_chip(chip); |
191 | u32 val; | 110 | u32 val; |
192 | 111 | ||
193 | val = readl(imx->mmio_base + MX3_PWMCR); | 112 | val = readl(imx->mmio_base + MX1_PWMC); |
194 | 113 | val &= ~MX1_PWMC_EN; | |
195 | if (enable) | 114 | writel(val, imx->mmio_base + MX1_PWMC); |
196 | val |= MX3_PWMCR_EN; | ||
197 | else | ||
198 | val &= ~MX3_PWMCR_EN; | ||
199 | 115 | ||
200 | writel(val, imx->mmio_base + MX3_PWMCR); | 116 | clk_disable_unprepare(imx->clk_per); |
201 | } | 117 | } |
202 | 118 | ||
203 | static int imx_pwm_config(struct pwm_chip *chip, | 119 | static void imx_pwm_sw_reset(struct pwm_chip *chip) |
204 | struct pwm_device *pwm, int duty_ns, int period_ns) | ||
205 | { | 120 | { |
206 | struct imx_chip *imx = to_imx_chip(chip); | 121 | struct imx_chip *imx = to_imx_chip(chip); |
207 | int ret; | 122 | struct device *dev = chip->dev; |
208 | 123 | int wait_count = 0; | |
209 | ret = clk_prepare_enable(imx->clk_ipg); | 124 | u32 cr; |
210 | if (ret) | 125 | |
211 | return ret; | 126 | writel(MX3_PWMCR_SWR, imx->mmio_base + MX3_PWMCR); |
127 | do { | ||
128 | usleep_range(200, 1000); | ||
129 | cr = readl(imx->mmio_base + MX3_PWMCR); | ||
130 | } while ((cr & MX3_PWMCR_SWR) && | ||
131 | (wait_count++ < MX3_PWM_SWR_LOOP)); | ||
132 | |||
133 | if (cr & MX3_PWMCR_SWR) | ||
134 | dev_warn(dev, "software reset timeout\n"); | ||
135 | } | ||
212 | 136 | ||
213 | ret = imx->config(chip, pwm, duty_ns, period_ns); | 137 | static void imx_pwm_wait_fifo_slot(struct pwm_chip *chip, |
138 | struct pwm_device *pwm) | ||
139 | { | ||
140 | struct imx_chip *imx = to_imx_chip(chip); | ||
141 | struct device *dev = chip->dev; | ||
142 | unsigned int period_ms; | ||
143 | int fifoav; | ||
144 | u32 sr; | ||
214 | 145 | ||
215 | clk_disable_unprepare(imx->clk_ipg); | 146 | sr = readl(imx->mmio_base + MX3_PWMSR); |
147 | fifoav = sr & MX3_PWMSR_FIFOAV_MASK; | ||
148 | if (fifoav == MX3_PWMSR_FIFOAV_4WORDS) { | ||
149 | period_ms = DIV_ROUND_UP(pwm_get_period(pwm), | ||
150 | NSEC_PER_MSEC); | ||
151 | msleep(period_ms); | ||
216 | 152 | ||
217 | return ret; | 153 | sr = readl(imx->mmio_base + MX3_PWMSR); |
154 | if (fifoav == (sr & MX3_PWMSR_FIFOAV_MASK)) | ||
155 | dev_warn(dev, "there is no free FIFO slot\n"); | ||
156 | } | ||
218 | } | 157 | } |
219 | 158 | ||
220 | static int imx_pwm_enable(struct pwm_chip *chip, struct pwm_device *pwm) | 159 | static int imx_pwm_apply_v2(struct pwm_chip *chip, struct pwm_device *pwm, |
160 | struct pwm_state *state) | ||
221 | { | 161 | { |
162 | unsigned long period_cycles, duty_cycles, prescale; | ||
222 | struct imx_chip *imx = to_imx_chip(chip); | 163 | struct imx_chip *imx = to_imx_chip(chip); |
164 | struct pwm_state cstate; | ||
165 | unsigned long long c; | ||
223 | int ret; | 166 | int ret; |
167 | u32 cr; | ||
168 | |||
169 | pwm_get_state(pwm, &cstate); | ||
170 | |||
171 | if (state->enabled) { | ||
172 | c = clk_get_rate(imx->clk_per); | ||
173 | c *= state->period; | ||
174 | |||
175 | do_div(c, 1000000000); | ||
176 | period_cycles = c; | ||
177 | |||
178 | prescale = period_cycles / 0x10000 + 1; | ||
179 | |||
180 | period_cycles /= prescale; | ||
181 | c = (unsigned long long)period_cycles * state->duty_cycle; | ||
182 | do_div(c, state->period); | ||
183 | duty_cycles = c; | ||
184 | |||
185 | /* | ||
186 | * according to imx pwm RM, the real period value should be | ||
187 | * PERIOD value in PWMPR plus 2. | ||
188 | */ | ||
189 | if (period_cycles > 2) | ||
190 | period_cycles -= 2; | ||
191 | else | ||
192 | period_cycles = 0; | ||
193 | |||
194 | /* | ||
195 | * Wait for a free FIFO slot if the PWM is already enabled, and | ||
196 | * flush the FIFO if the PWM was disabled and is about to be | ||
197 | * enabled. | ||
198 | */ | ||
199 | if (cstate.enabled) { | ||
200 | imx_pwm_wait_fifo_slot(chip, pwm); | ||
201 | } else { | ||
202 | ret = clk_prepare_enable(imx->clk_per); | ||
203 | if (ret) | ||
204 | return ret; | ||
205 | |||
206 | imx_pwm_sw_reset(chip); | ||
207 | } | ||
224 | 208 | ||
225 | ret = clk_prepare_enable(imx->clk_per); | 209 | writel(duty_cycles, imx->mmio_base + MX3_PWMSAR); |
226 | if (ret) | 210 | writel(period_cycles, imx->mmio_base + MX3_PWMPR); |
227 | return ret; | ||
228 | 211 | ||
229 | imx->set_enable(chip, true); | 212 | cr = MX3_PWMCR_PRESCALER(prescale) | |
213 | MX3_PWMCR_DOZEEN | MX3_PWMCR_WAITEN | | ||
214 | MX3_PWMCR_DBGEN | MX3_PWMCR_CLKSRC_IPG_HIGH | | ||
215 | MX3_PWMCR_EN; | ||
230 | 216 | ||
231 | return 0; | 217 | if (state->polarity == PWM_POLARITY_INVERSED) |
232 | } | 218 | cr |= MX3_PWMCR_POUTC; |
233 | 219 | ||
234 | static void imx_pwm_disable(struct pwm_chip *chip, struct pwm_device *pwm) | 220 | writel(cr, imx->mmio_base + MX3_PWMCR); |
235 | { | 221 | } else if (cstate.enabled) { |
236 | struct imx_chip *imx = to_imx_chip(chip); | 222 | writel(0, imx->mmio_base + MX3_PWMCR); |
237 | 223 | ||
238 | imx->set_enable(chip, false); | 224 | clk_disable_unprepare(imx->clk_per); |
225 | } | ||
239 | 226 | ||
240 | clk_disable_unprepare(imx->clk_per); | 227 | return 0; |
241 | } | 228 | } |
242 | 229 | ||
243 | static struct pwm_ops imx_pwm_ops = { | 230 | static const struct pwm_ops imx_pwm_ops_v1 = { |
244 | .enable = imx_pwm_enable, | 231 | .enable = imx_pwm_enable_v1, |
245 | .disable = imx_pwm_disable, | 232 | .disable = imx_pwm_disable_v1, |
246 | .config = imx_pwm_config, | 233 | .config = imx_pwm_config_v1, |
234 | .owner = THIS_MODULE, | ||
235 | }; | ||
236 | |||
237 | static const struct pwm_ops imx_pwm_ops_v2 = { | ||
238 | .apply = imx_pwm_apply_v2, | ||
247 | .owner = THIS_MODULE, | 239 | .owner = THIS_MODULE, |
248 | }; | 240 | }; |
249 | 241 | ||
250 | struct imx_pwm_data { | 242 | struct imx_pwm_data { |
251 | int (*config)(struct pwm_chip *chip, | 243 | bool polarity_supported; |
252 | struct pwm_device *pwm, int duty_ns, int period_ns); | 244 | const struct pwm_ops *ops; |
253 | void (*set_enable)(struct pwm_chip *chip, bool enable); | ||
254 | }; | 245 | }; |
255 | 246 | ||
256 | static struct imx_pwm_data imx_pwm_data_v1 = { | 247 | static struct imx_pwm_data imx_pwm_data_v1 = { |
257 | .config = imx_pwm_config_v1, | 248 | .ops = &imx_pwm_ops_v1, |
258 | .set_enable = imx_pwm_set_enable_v1, | ||
259 | }; | 249 | }; |
260 | 250 | ||
261 | static struct imx_pwm_data imx_pwm_data_v2 = { | 251 | static struct imx_pwm_data imx_pwm_data_v2 = { |
262 | .config = imx_pwm_config_v2, | 252 | .polarity_supported = true, |
263 | .set_enable = imx_pwm_set_enable_v2, | 253 | .ops = &imx_pwm_ops_v2, |
264 | }; | 254 | }; |
265 | 255 | ||
266 | static const struct of_device_id imx_pwm_dt_ids[] = { | 256 | static const struct of_device_id imx_pwm_dt_ids[] = { |
@@ -282,6 +272,8 @@ static int imx_pwm_probe(struct platform_device *pdev) | |||
282 | if (!of_id) | 272 | if (!of_id) |
283 | return -ENODEV; | 273 | return -ENODEV; |
284 | 274 | ||
275 | data = of_id->data; | ||
276 | |||
285 | imx = devm_kzalloc(&pdev->dev, sizeof(*imx), GFP_KERNEL); | 277 | imx = devm_kzalloc(&pdev->dev, sizeof(*imx), GFP_KERNEL); |
286 | if (imx == NULL) | 278 | if (imx == NULL) |
287 | return -ENOMEM; | 279 | return -ENOMEM; |
@@ -293,28 +285,22 @@ static int imx_pwm_probe(struct platform_device *pdev) | |||
293 | return PTR_ERR(imx->clk_per); | 285 | return PTR_ERR(imx->clk_per); |
294 | } | 286 | } |
295 | 287 | ||
296 | imx->clk_ipg = devm_clk_get(&pdev->dev, "ipg"); | 288 | imx->chip.ops = data->ops; |
297 | if (IS_ERR(imx->clk_ipg)) { | ||
298 | dev_err(&pdev->dev, "getting ipg clock failed with %ld\n", | ||
299 | PTR_ERR(imx->clk_ipg)); | ||
300 | return PTR_ERR(imx->clk_ipg); | ||
301 | } | ||
302 | |||
303 | imx->chip.ops = &imx_pwm_ops; | ||
304 | imx->chip.dev = &pdev->dev; | 289 | imx->chip.dev = &pdev->dev; |
305 | imx->chip.base = -1; | 290 | imx->chip.base = -1; |
306 | imx->chip.npwm = 1; | 291 | imx->chip.npwm = 1; |
307 | imx->chip.can_sleep = true; | 292 | |
293 | if (data->polarity_supported) { | ||
294 | dev_dbg(&pdev->dev, "PWM supports output inversion\n"); | ||
295 | imx->chip.of_xlate = of_pwm_xlate_with_flags; | ||
296 | imx->chip.of_pwm_n_cells = 3; | ||
297 | } | ||
308 | 298 | ||
309 | r = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 299 | r = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
310 | imx->mmio_base = devm_ioremap_resource(&pdev->dev, r); | 300 | imx->mmio_base = devm_ioremap_resource(&pdev->dev, r); |
311 | if (IS_ERR(imx->mmio_base)) | 301 | if (IS_ERR(imx->mmio_base)) |
312 | return PTR_ERR(imx->mmio_base); | 302 | return PTR_ERR(imx->mmio_base); |
313 | 303 | ||
314 | data = of_id->data; | ||
315 | imx->config = data->config; | ||
316 | imx->set_enable = data->set_enable; | ||
317 | |||
318 | ret = pwmchip_add(&imx->chip); | 304 | ret = pwmchip_add(&imx->chip); |
319 | if (ret < 0) | 305 | if (ret < 0) |
320 | return ret; | 306 | return ret; |
diff --git a/drivers/pwm/pwm-lp3943.c b/drivers/pwm/pwm-lp3943.c index 872ea76a4f19..52584e9962ed 100644 --- a/drivers/pwm/pwm-lp3943.c +++ b/drivers/pwm/pwm-lp3943.c | |||
@@ -278,7 +278,6 @@ static int lp3943_pwm_probe(struct platform_device *pdev) | |||
278 | lp3943_pwm->chip.dev = &pdev->dev; | 278 | lp3943_pwm->chip.dev = &pdev->dev; |
279 | lp3943_pwm->chip.ops = &lp3943_pwm_ops; | 279 | lp3943_pwm->chip.ops = &lp3943_pwm_ops; |
280 | lp3943_pwm->chip.npwm = LP3943_NUM_PWMS; | 280 | lp3943_pwm->chip.npwm = LP3943_NUM_PWMS; |
281 | lp3943_pwm->chip.can_sleep = true; | ||
282 | 281 | ||
283 | platform_set_drvdata(pdev, lp3943_pwm); | 282 | platform_set_drvdata(pdev, lp3943_pwm); |
284 | 283 | ||
diff --git a/drivers/pwm/pwm-lpss-pci.c b/drivers/pwm/pwm-lpss-pci.c index 3622f093490e..053088b9b66e 100644 --- a/drivers/pwm/pwm-lpss-pci.c +++ b/drivers/pwm/pwm-lpss-pci.c | |||
@@ -17,6 +17,27 @@ | |||
17 | 17 | ||
18 | #include "pwm-lpss.h" | 18 | #include "pwm-lpss.h" |
19 | 19 | ||
20 | /* BayTrail */ | ||
21 | static const struct pwm_lpss_boardinfo pwm_lpss_byt_info = { | ||
22 | .clk_rate = 25000000, | ||
23 | .npwm = 1, | ||
24 | .base_unit_bits = 16, | ||
25 | }; | ||
26 | |||
27 | /* Braswell */ | ||
28 | static const struct pwm_lpss_boardinfo pwm_lpss_bsw_info = { | ||
29 | .clk_rate = 19200000, | ||
30 | .npwm = 1, | ||
31 | .base_unit_bits = 16, | ||
32 | }; | ||
33 | |||
34 | /* Broxton */ | ||
35 | static const struct pwm_lpss_boardinfo pwm_lpss_bxt_info = { | ||
36 | .clk_rate = 19200000, | ||
37 | .npwm = 4, | ||
38 | .base_unit_bits = 22, | ||
39 | }; | ||
40 | |||
20 | static int pwm_lpss_probe_pci(struct pci_dev *pdev, | 41 | static int pwm_lpss_probe_pci(struct pci_dev *pdev, |
21 | const struct pci_device_id *id) | 42 | const struct pci_device_id *id) |
22 | { | 43 | { |
@@ -80,6 +101,7 @@ static const struct pci_device_id pwm_lpss_pci_ids[] = { | |||
80 | { PCI_VDEVICE(INTEL, 0x1ac8), (unsigned long)&pwm_lpss_bxt_info}, | 101 | { PCI_VDEVICE(INTEL, 0x1ac8), (unsigned long)&pwm_lpss_bxt_info}, |
81 | { PCI_VDEVICE(INTEL, 0x2288), (unsigned long)&pwm_lpss_bsw_info}, | 102 | { PCI_VDEVICE(INTEL, 0x2288), (unsigned long)&pwm_lpss_bsw_info}, |
82 | { PCI_VDEVICE(INTEL, 0x2289), (unsigned long)&pwm_lpss_bsw_info}, | 103 | { PCI_VDEVICE(INTEL, 0x2289), (unsigned long)&pwm_lpss_bsw_info}, |
104 | { PCI_VDEVICE(INTEL, 0x31c8), (unsigned long)&pwm_lpss_bxt_info}, | ||
83 | { PCI_VDEVICE(INTEL, 0x5ac8), (unsigned long)&pwm_lpss_bxt_info}, | 105 | { PCI_VDEVICE(INTEL, 0x5ac8), (unsigned long)&pwm_lpss_bxt_info}, |
84 | { }, | 106 | { }, |
85 | }; | 107 | }; |
diff --git a/drivers/pwm/pwm-lpss-platform.c b/drivers/pwm/pwm-lpss-platform.c index 54433fc6d1a4..b22b6fdadb9a 100644 --- a/drivers/pwm/pwm-lpss-platform.c +++ b/drivers/pwm/pwm-lpss-platform.c | |||
@@ -18,6 +18,27 @@ | |||
18 | 18 | ||
19 | #include "pwm-lpss.h" | 19 | #include "pwm-lpss.h" |
20 | 20 | ||
21 | /* BayTrail */ | ||
22 | static const struct pwm_lpss_boardinfo pwm_lpss_byt_info = { | ||
23 | .clk_rate = 25000000, | ||
24 | .npwm = 1, | ||
25 | .base_unit_bits = 16, | ||
26 | }; | ||
27 | |||
28 | /* Braswell */ | ||
29 | static const struct pwm_lpss_boardinfo pwm_lpss_bsw_info = { | ||
30 | .clk_rate = 19200000, | ||
31 | .npwm = 1, | ||
32 | .base_unit_bits = 16, | ||
33 | }; | ||
34 | |||
35 | /* Broxton */ | ||
36 | static const struct pwm_lpss_boardinfo pwm_lpss_bxt_info = { | ||
37 | .clk_rate = 19200000, | ||
38 | .npwm = 4, | ||
39 | .base_unit_bits = 22, | ||
40 | }; | ||
41 | |||
21 | static int pwm_lpss_probe_platform(struct platform_device *pdev) | 42 | static int pwm_lpss_probe_platform(struct platform_device *pdev) |
22 | { | 43 | { |
23 | const struct pwm_lpss_boardinfo *info; | 44 | const struct pwm_lpss_boardinfo *info; |
diff --git a/drivers/pwm/pwm-lpss.c b/drivers/pwm/pwm-lpss.c index 72c0bce5a75c..689d2c1cbead 100644 --- a/drivers/pwm/pwm-lpss.c +++ b/drivers/pwm/pwm-lpss.c | |||
@@ -15,6 +15,7 @@ | |||
15 | 15 | ||
16 | #include <linux/delay.h> | 16 | #include <linux/delay.h> |
17 | #include <linux/io.h> | 17 | #include <linux/io.h> |
18 | #include <linux/iopoll.h> | ||
18 | #include <linux/kernel.h> | 19 | #include <linux/kernel.h> |
19 | #include <linux/module.h> | 20 | #include <linux/module.h> |
20 | #include <linux/pm_runtime.h> | 21 | #include <linux/pm_runtime.h> |
@@ -37,30 +38,6 @@ struct pwm_lpss_chip { | |||
37 | const struct pwm_lpss_boardinfo *info; | 38 | const struct pwm_lpss_boardinfo *info; |
38 | }; | 39 | }; |
39 | 40 | ||
40 | /* BayTrail */ | ||
41 | const struct pwm_lpss_boardinfo pwm_lpss_byt_info = { | ||
42 | .clk_rate = 25000000, | ||
43 | .npwm = 1, | ||
44 | .base_unit_bits = 16, | ||
45 | }; | ||
46 | EXPORT_SYMBOL_GPL(pwm_lpss_byt_info); | ||
47 | |||
48 | /* Braswell */ | ||
49 | const struct pwm_lpss_boardinfo pwm_lpss_bsw_info = { | ||
50 | .clk_rate = 19200000, | ||
51 | .npwm = 1, | ||
52 | .base_unit_bits = 16, | ||
53 | }; | ||
54 | EXPORT_SYMBOL_GPL(pwm_lpss_bsw_info); | ||
55 | |||
56 | /* Broxton */ | ||
57 | const struct pwm_lpss_boardinfo pwm_lpss_bxt_info = { | ||
58 | .clk_rate = 19200000, | ||
59 | .npwm = 4, | ||
60 | .base_unit_bits = 22, | ||
61 | }; | ||
62 | EXPORT_SYMBOL_GPL(pwm_lpss_bxt_info); | ||
63 | |||
64 | static inline struct pwm_lpss_chip *to_lpwm(struct pwm_chip *chip) | 41 | static inline struct pwm_lpss_chip *to_lpwm(struct pwm_chip *chip) |
65 | { | 42 | { |
66 | return container_of(chip, struct pwm_lpss_chip, chip); | 43 | return container_of(chip, struct pwm_lpss_chip, chip); |
@@ -80,17 +57,42 @@ static inline void pwm_lpss_write(const struct pwm_device *pwm, u32 value) | |||
80 | writel(value, lpwm->regs + pwm->hwpwm * PWM_SIZE + PWM); | 57 | writel(value, lpwm->regs + pwm->hwpwm * PWM_SIZE + PWM); |
81 | } | 58 | } |
82 | 59 | ||
83 | static void pwm_lpss_update(struct pwm_device *pwm) | 60 | static int pwm_lpss_update(struct pwm_device *pwm) |
84 | { | 61 | { |
62 | struct pwm_lpss_chip *lpwm = to_lpwm(pwm->chip); | ||
63 | const void __iomem *addr = lpwm->regs + pwm->hwpwm * PWM_SIZE + PWM; | ||
64 | const unsigned int ms = 500 * USEC_PER_MSEC; | ||
65 | u32 val; | ||
66 | int err; | ||
67 | |||
85 | pwm_lpss_write(pwm, pwm_lpss_read(pwm) | PWM_SW_UPDATE); | 68 | pwm_lpss_write(pwm, pwm_lpss_read(pwm) | PWM_SW_UPDATE); |
86 | /* Give it some time to propagate */ | 69 | |
87 | usleep_range(10, 50); | 70 | /* |
71 | * PWM Configuration register has SW_UPDATE bit that is set when a new | ||
72 | * configuration is written to the register. The bit is automatically | ||
73 | * cleared at the start of the next output cycle by the IP block. | ||
74 | * | ||
75 | * If one writes a new configuration to the register while it still has | ||
76 | * the bit enabled, PWM may freeze. That is, while one can still write | ||
77 | * to the register, it won't have an effect. Thus, we try to sleep long | ||
78 | * enough that the bit gets cleared and make sure the bit is not | ||
79 | * enabled while we update the configuration. | ||
80 | */ | ||
81 | err = readl_poll_timeout(addr, val, !(val & PWM_SW_UPDATE), 40, ms); | ||
82 | if (err) | ||
83 | dev_err(pwm->chip->dev, "PWM_SW_UPDATE was not cleared\n"); | ||
84 | |||
85 | return err; | ||
88 | } | 86 | } |
89 | 87 | ||
90 | static int pwm_lpss_config(struct pwm_chip *chip, struct pwm_device *pwm, | 88 | static inline int pwm_lpss_is_updating(struct pwm_device *pwm) |
91 | int duty_ns, int period_ns) | 89 | { |
90 | return (pwm_lpss_read(pwm) & PWM_SW_UPDATE) ? -EBUSY : 0; | ||
91 | } | ||
92 | |||
93 | static void pwm_lpss_prepare(struct pwm_lpss_chip *lpwm, struct pwm_device *pwm, | ||
94 | int duty_ns, int period_ns) | ||
92 | { | 95 | { |
93 | struct pwm_lpss_chip *lpwm = to_lpwm(chip); | ||
94 | unsigned long long on_time_div; | 96 | unsigned long long on_time_div; |
95 | unsigned long c = lpwm->info->clk_rate, base_unit_range; | 97 | unsigned long c = lpwm->info->clk_rate, base_unit_range; |
96 | unsigned long long base_unit, freq = NSEC_PER_SEC; | 98 | unsigned long long base_unit, freq = NSEC_PER_SEC; |
@@ -102,62 +104,62 @@ static int pwm_lpss_config(struct pwm_chip *chip, struct pwm_device *pwm, | |||
102 | * The equation is: | 104 | * The equation is: |
103 | * base_unit = round(base_unit_range * freq / c) | 105 | * base_unit = round(base_unit_range * freq / c) |
104 | */ | 106 | */ |
105 | base_unit_range = BIT(lpwm->info->base_unit_bits); | 107 | base_unit_range = BIT(lpwm->info->base_unit_bits) - 1; |
106 | freq *= base_unit_range; | 108 | freq *= base_unit_range; |
107 | 109 | ||
108 | base_unit = DIV_ROUND_CLOSEST_ULL(freq, c); | 110 | base_unit = DIV_ROUND_CLOSEST_ULL(freq, c); |
109 | 111 | ||
110 | if (duty_ns <= 0) | ||
111 | duty_ns = 1; | ||
112 | on_time_div = 255ULL * duty_ns; | 112 | on_time_div = 255ULL * duty_ns; |
113 | do_div(on_time_div, period_ns); | 113 | do_div(on_time_div, period_ns); |
114 | on_time_div = 255ULL - on_time_div; | 114 | on_time_div = 255ULL - on_time_div; |
115 | 115 | ||
116 | pm_runtime_get_sync(chip->dev); | ||
117 | |||
118 | ctrl = pwm_lpss_read(pwm); | 116 | ctrl = pwm_lpss_read(pwm); |
119 | ctrl &= ~PWM_ON_TIME_DIV_MASK; | 117 | ctrl &= ~PWM_ON_TIME_DIV_MASK; |
120 | ctrl &= ~((base_unit_range - 1) << PWM_BASE_UNIT_SHIFT); | 118 | ctrl &= ~(base_unit_range << PWM_BASE_UNIT_SHIFT); |
121 | base_unit &= (base_unit_range - 1); | 119 | base_unit &= base_unit_range; |
122 | ctrl |= (u32) base_unit << PWM_BASE_UNIT_SHIFT; | 120 | ctrl |= (u32) base_unit << PWM_BASE_UNIT_SHIFT; |
123 | ctrl |= on_time_div; | 121 | ctrl |= on_time_div; |
124 | pwm_lpss_write(pwm, ctrl); | 122 | pwm_lpss_write(pwm, ctrl); |
125 | |||
126 | /* | ||
127 | * If the PWM is already enabled we need to notify the hardware | ||
128 | * about the change by setting PWM_SW_UPDATE. | ||
129 | */ | ||
130 | if (pwm_is_enabled(pwm)) | ||
131 | pwm_lpss_update(pwm); | ||
132 | |||
133 | pm_runtime_put(chip->dev); | ||
134 | |||
135 | return 0; | ||
136 | } | 123 | } |
137 | 124 | ||
138 | static int pwm_lpss_enable(struct pwm_chip *chip, struct pwm_device *pwm) | 125 | static int pwm_lpss_apply(struct pwm_chip *chip, struct pwm_device *pwm, |
126 | struct pwm_state *state) | ||
139 | { | 127 | { |
140 | pm_runtime_get_sync(chip->dev); | 128 | struct pwm_lpss_chip *lpwm = to_lpwm(chip); |
129 | int ret; | ||
141 | 130 | ||
142 | /* | 131 | if (state->enabled) { |
143 | * Hardware must first see PWM_SW_UPDATE before the PWM can be | 132 | if (!pwm_is_enabled(pwm)) { |
144 | * enabled. | 133 | pm_runtime_get_sync(chip->dev); |
145 | */ | 134 | ret = pwm_lpss_is_updating(pwm); |
146 | pwm_lpss_update(pwm); | 135 | if (ret) { |
147 | pwm_lpss_write(pwm, pwm_lpss_read(pwm) | PWM_ENABLE); | 136 | pm_runtime_put(chip->dev); |
148 | return 0; | 137 | return ret; |
149 | } | 138 | } |
139 | pwm_lpss_prepare(lpwm, pwm, state->duty_cycle, state->period); | ||
140 | ret = pwm_lpss_update(pwm); | ||
141 | if (ret) { | ||
142 | pm_runtime_put(chip->dev); | ||
143 | return ret; | ||
144 | } | ||
145 | pwm_lpss_write(pwm, pwm_lpss_read(pwm) | PWM_ENABLE); | ||
146 | } else { | ||
147 | ret = pwm_lpss_is_updating(pwm); | ||
148 | if (ret) | ||
149 | return ret; | ||
150 | pwm_lpss_prepare(lpwm, pwm, state->duty_cycle, state->period); | ||
151 | return pwm_lpss_update(pwm); | ||
152 | } | ||
153 | } else if (pwm_is_enabled(pwm)) { | ||
154 | pwm_lpss_write(pwm, pwm_lpss_read(pwm) & ~PWM_ENABLE); | ||
155 | pm_runtime_put(chip->dev); | ||
156 | } | ||
150 | 157 | ||
151 | static void pwm_lpss_disable(struct pwm_chip *chip, struct pwm_device *pwm) | 158 | return 0; |
152 | { | ||
153 | pwm_lpss_write(pwm, pwm_lpss_read(pwm) & ~PWM_ENABLE); | ||
154 | pm_runtime_put(chip->dev); | ||
155 | } | 159 | } |
156 | 160 | ||
157 | static const struct pwm_ops pwm_lpss_ops = { | 161 | static const struct pwm_ops pwm_lpss_ops = { |
158 | .config = pwm_lpss_config, | 162 | .apply = pwm_lpss_apply, |
159 | .enable = pwm_lpss_enable, | ||
160 | .disable = pwm_lpss_disable, | ||
161 | .owner = THIS_MODULE, | 163 | .owner = THIS_MODULE, |
162 | }; | 164 | }; |
163 | 165 | ||
diff --git a/drivers/pwm/pwm-lpss.h b/drivers/pwm/pwm-lpss.h index 04766e0d41aa..c94cd7c2695d 100644 --- a/drivers/pwm/pwm-lpss.h +++ b/drivers/pwm/pwm-lpss.h | |||
@@ -24,10 +24,6 @@ struct pwm_lpss_boardinfo { | |||
24 | unsigned long base_unit_bits; | 24 | unsigned long base_unit_bits; |
25 | }; | 25 | }; |
26 | 26 | ||
27 | extern const struct pwm_lpss_boardinfo pwm_lpss_byt_info; | ||
28 | extern const struct pwm_lpss_boardinfo pwm_lpss_bsw_info; | ||
29 | extern const struct pwm_lpss_boardinfo pwm_lpss_bxt_info; | ||
30 | |||
31 | struct pwm_lpss_chip *pwm_lpss_probe(struct device *dev, struct resource *r, | 27 | struct pwm_lpss_chip *pwm_lpss_probe(struct device *dev, struct resource *r, |
32 | const struct pwm_lpss_boardinfo *info); | 28 | const struct pwm_lpss_boardinfo *info); |
33 | int pwm_lpss_remove(struct pwm_lpss_chip *lpwm); | 29 | int pwm_lpss_remove(struct pwm_lpss_chip *lpwm); |
diff --git a/drivers/pwm/pwm-mxs.c b/drivers/pwm/pwm-mxs.c index 9a596324ebef..a6017ad9926c 100644 --- a/drivers/pwm/pwm-mxs.c +++ b/drivers/pwm/pwm-mxs.c | |||
@@ -151,7 +151,7 @@ static int mxs_pwm_probe(struct platform_device *pdev) | |||
151 | mxs->chip.dev = &pdev->dev; | 151 | mxs->chip.dev = &pdev->dev; |
152 | mxs->chip.ops = &mxs_pwm_ops; | 152 | mxs->chip.ops = &mxs_pwm_ops; |
153 | mxs->chip.base = -1; | 153 | mxs->chip.base = -1; |
154 | mxs->chip.can_sleep = true; | 154 | |
155 | ret = of_property_read_u32(np, "fsl,pwm-number", &mxs->chip.npwm); | 155 | ret = of_property_read_u32(np, "fsl,pwm-number", &mxs->chip.npwm); |
156 | if (ret < 0) { | 156 | if (ret < 0) { |
157 | dev_err(&pdev->dev, "failed to get pwm number: %d\n", ret); | 157 | dev_err(&pdev->dev, "failed to get pwm number: %d\n", ret); |
diff --git a/drivers/pwm/pwm-pca9685.c b/drivers/pwm/pwm-pca9685.c index 117fccf7934a..0cfb3571a732 100644 --- a/drivers/pwm/pwm-pca9685.c +++ b/drivers/pwm/pwm-pca9685.c | |||
@@ -20,8 +20,10 @@ | |||
20 | */ | 20 | */ |
21 | 21 | ||
22 | #include <linux/acpi.h> | 22 | #include <linux/acpi.h> |
23 | #include <linux/gpio/driver.h> | ||
23 | #include <linux/i2c.h> | 24 | #include <linux/i2c.h> |
24 | #include <linux/module.h> | 25 | #include <linux/module.h> |
26 | #include <linux/mutex.h> | ||
25 | #include <linux/platform_device.h> | 27 | #include <linux/platform_device.h> |
26 | #include <linux/property.h> | 28 | #include <linux/property.h> |
27 | #include <linux/pwm.h> | 29 | #include <linux/pwm.h> |
@@ -65,7 +67,6 @@ | |||
65 | #define PCA9685_MAXCHAN 0x10 | 67 | #define PCA9685_MAXCHAN 0x10 |
66 | 68 | ||
67 | #define LED_FULL (1 << 4) | 69 | #define LED_FULL (1 << 4) |
68 | #define MODE1_RESTART (1 << 7) | ||
69 | #define MODE1_SLEEP (1 << 4) | 70 | #define MODE1_SLEEP (1 << 4) |
70 | #define MODE2_INVRT (1 << 4) | 71 | #define MODE2_INVRT (1 << 4) |
71 | #define MODE2_OUTDRV (1 << 2) | 72 | #define MODE2_OUTDRV (1 << 2) |
@@ -81,6 +82,10 @@ struct pca9685 { | |||
81 | int active_cnt; | 82 | int active_cnt; |
82 | int duty_ns; | 83 | int duty_ns; |
83 | int period_ns; | 84 | int period_ns; |
85 | #if IS_ENABLED(CONFIG_GPIOLIB) | ||
86 | struct mutex lock; | ||
87 | struct gpio_chip gpio; | ||
88 | #endif | ||
84 | }; | 89 | }; |
85 | 90 | ||
86 | static inline struct pca9685 *to_pca(struct pwm_chip *chip) | 91 | static inline struct pca9685 *to_pca(struct pwm_chip *chip) |
@@ -88,6 +93,151 @@ static inline struct pca9685 *to_pca(struct pwm_chip *chip) | |||
88 | return container_of(chip, struct pca9685, chip); | 93 | return container_of(chip, struct pca9685, chip); |
89 | } | 94 | } |
90 | 95 | ||
96 | #if IS_ENABLED(CONFIG_GPIOLIB) | ||
97 | static int pca9685_pwm_gpio_request(struct gpio_chip *gpio, unsigned int offset) | ||
98 | { | ||
99 | struct pca9685 *pca = gpiochip_get_data(gpio); | ||
100 | struct pwm_device *pwm; | ||
101 | |||
102 | mutex_lock(&pca->lock); | ||
103 | |||
104 | pwm = &pca->chip.pwms[offset]; | ||
105 | |||
106 | if (pwm->flags & (PWMF_REQUESTED | PWMF_EXPORTED)) { | ||
107 | mutex_unlock(&pca->lock); | ||
108 | return -EBUSY; | ||
109 | } | ||
110 | |||
111 | pwm_set_chip_data(pwm, (void *)1); | ||
112 | |||
113 | mutex_unlock(&pca->lock); | ||
114 | return 0; | ||
115 | } | ||
116 | |||
117 | static void pca9685_pwm_gpio_free(struct gpio_chip *gpio, unsigned int offset) | ||
118 | { | ||
119 | struct pca9685 *pca = gpiochip_get_data(gpio); | ||
120 | struct pwm_device *pwm; | ||
121 | |||
122 | mutex_lock(&pca->lock); | ||
123 | pwm = &pca->chip.pwms[offset]; | ||
124 | pwm_set_chip_data(pwm, NULL); | ||
125 | mutex_unlock(&pca->lock); | ||
126 | } | ||
127 | |||
128 | static bool pca9685_pwm_is_gpio(struct pca9685 *pca, struct pwm_device *pwm) | ||
129 | { | ||
130 | bool is_gpio = false; | ||
131 | |||
132 | mutex_lock(&pca->lock); | ||
133 | |||
134 | if (pwm->hwpwm >= PCA9685_MAXCHAN) { | ||
135 | unsigned int i; | ||
136 | |||
137 | /* | ||
138 | * Check if any of the GPIOs are requested and in that case | ||
139 | * prevent using the "all LEDs" channel. | ||
140 | */ | ||
141 | for (i = 0; i < pca->gpio.ngpio; i++) | ||
142 | if (gpiochip_is_requested(&pca->gpio, i)) { | ||
143 | is_gpio = true; | ||
144 | break; | ||
145 | } | ||
146 | } else if (pwm_get_chip_data(pwm)) { | ||
147 | is_gpio = true; | ||
148 | } | ||
149 | |||
150 | mutex_unlock(&pca->lock); | ||
151 | return is_gpio; | ||
152 | } | ||
153 | |||
154 | static int pca9685_pwm_gpio_get(struct gpio_chip *gpio, unsigned int offset) | ||
155 | { | ||
156 | struct pca9685 *pca = gpiochip_get_data(gpio); | ||
157 | struct pwm_device *pwm = &pca->chip.pwms[offset]; | ||
158 | unsigned int value; | ||
159 | |||
160 | regmap_read(pca->regmap, LED_N_ON_H(pwm->hwpwm), &value); | ||
161 | |||
162 | return value & LED_FULL; | ||
163 | } | ||
164 | |||
165 | static void pca9685_pwm_gpio_set(struct gpio_chip *gpio, unsigned int offset, | ||
166 | int value) | ||
167 | { | ||
168 | struct pca9685 *pca = gpiochip_get_data(gpio); | ||
169 | struct pwm_device *pwm = &pca->chip.pwms[offset]; | ||
170 | unsigned int on = value ? LED_FULL : 0; | ||
171 | |||
172 | /* Clear both OFF registers */ | ||
173 | regmap_write(pca->regmap, LED_N_OFF_L(pwm->hwpwm), 0); | ||
174 | regmap_write(pca->regmap, LED_N_OFF_H(pwm->hwpwm), 0); | ||
175 | |||
176 | /* Set the full ON bit */ | ||
177 | regmap_write(pca->regmap, LED_N_ON_H(pwm->hwpwm), on); | ||
178 | } | ||
179 | |||
180 | static int pca9685_pwm_gpio_get_direction(struct gpio_chip *chip, | ||
181 | unsigned int offset) | ||
182 | { | ||
183 | /* Always out */ | ||
184 | return 0; | ||
185 | } | ||
186 | |||
187 | static int pca9685_pwm_gpio_direction_input(struct gpio_chip *gpio, | ||
188 | unsigned int offset) | ||
189 | { | ||
190 | return -EINVAL; | ||
191 | } | ||
192 | |||
193 | static int pca9685_pwm_gpio_direction_output(struct gpio_chip *gpio, | ||
194 | unsigned int offset, int value) | ||
195 | { | ||
196 | pca9685_pwm_gpio_set(gpio, offset, value); | ||
197 | |||
198 | return 0; | ||
199 | } | ||
200 | |||
201 | /* | ||
202 | * The PCA9685 has a bit for turning the PWM output full off or on. Some | ||
203 | * boards like Intel Galileo actually uses these as normal GPIOs so we | ||
204 | * expose a GPIO chip here which can exclusively take over the underlying | ||
205 | * PWM channel. | ||
206 | */ | ||
207 | static int pca9685_pwm_gpio_probe(struct pca9685 *pca) | ||
208 | { | ||
209 | struct device *dev = pca->chip.dev; | ||
210 | |||
211 | mutex_init(&pca->lock); | ||
212 | |||
213 | pca->gpio.label = dev_name(dev); | ||
214 | pca->gpio.parent = dev; | ||
215 | pca->gpio.request = pca9685_pwm_gpio_request; | ||
216 | pca->gpio.free = pca9685_pwm_gpio_free; | ||
217 | pca->gpio.get_direction = pca9685_pwm_gpio_get_direction; | ||
218 | pca->gpio.direction_input = pca9685_pwm_gpio_direction_input; | ||
219 | pca->gpio.direction_output = pca9685_pwm_gpio_direction_output; | ||
220 | pca->gpio.get = pca9685_pwm_gpio_get; | ||
221 | pca->gpio.set = pca9685_pwm_gpio_set; | ||
222 | pca->gpio.base = -1; | ||
223 | pca->gpio.ngpio = PCA9685_MAXCHAN; | ||
224 | pca->gpio.can_sleep = true; | ||
225 | |||
226 | return devm_gpiochip_add_data(dev, &pca->gpio, pca); | ||
227 | } | ||
228 | #else | ||
229 | static inline bool pca9685_pwm_is_gpio(struct pca9685 *pca, | ||
230 | struct pwm_device *pwm) | ||
231 | { | ||
232 | return false; | ||
233 | } | ||
234 | |||
235 | static inline int pca9685_pwm_gpio_probe(struct pca9685 *pca) | ||
236 | { | ||
237 | return 0; | ||
238 | } | ||
239 | #endif | ||
240 | |||
91 | static int pca9685_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm, | 241 | static int pca9685_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm, |
92 | int duty_ns, int period_ns) | 242 | int duty_ns, int period_ns) |
93 | { | 243 | { |
@@ -117,16 +267,6 @@ static int pca9685_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm, | |||
117 | udelay(500); | 267 | udelay(500); |
118 | 268 | ||
119 | pca->period_ns = period_ns; | 269 | pca->period_ns = period_ns; |
120 | |||
121 | /* | ||
122 | * If the duty cycle did not change, restart PWM with | ||
123 | * the same duty cycle to period ratio and return. | ||
124 | */ | ||
125 | if (duty_ns == pca->duty_ns) { | ||
126 | regmap_update_bits(pca->regmap, PCA9685_MODE1, | ||
127 | MODE1_RESTART, 0x1); | ||
128 | return 0; | ||
129 | } | ||
130 | } else { | 270 | } else { |
131 | dev_err(chip->dev, | 271 | dev_err(chip->dev, |
132 | "prescaler not set: period out of bounds!\n"); | 272 | "prescaler not set: period out of bounds!\n"); |
@@ -264,6 +404,9 @@ static int pca9685_pwm_request(struct pwm_chip *chip, struct pwm_device *pwm) | |||
264 | { | 404 | { |
265 | struct pca9685 *pca = to_pca(chip); | 405 | struct pca9685 *pca = to_pca(chip); |
266 | 406 | ||
407 | if (pca9685_pwm_is_gpio(pca, pwm)) | ||
408 | return -EBUSY; | ||
409 | |||
267 | if (pca->active_cnt++ == 0) | 410 | if (pca->active_cnt++ == 0) |
268 | return regmap_update_bits(pca->regmap, PCA9685_MODE1, | 411 | return regmap_update_bits(pca->regmap, PCA9685_MODE1, |
269 | MODE1_SLEEP, 0x0); | 412 | MODE1_SLEEP, 0x0); |
@@ -343,9 +486,16 @@ static int pca9685_pwm_probe(struct i2c_client *client, | |||
343 | 486 | ||
344 | pca->chip.dev = &client->dev; | 487 | pca->chip.dev = &client->dev; |
345 | pca->chip.base = -1; | 488 | pca->chip.base = -1; |
346 | pca->chip.can_sleep = true; | ||
347 | 489 | ||
348 | return pwmchip_add(&pca->chip); | 490 | ret = pwmchip_add(&pca->chip); |
491 | if (ret < 0) | ||
492 | return ret; | ||
493 | |||
494 | ret = pca9685_pwm_gpio_probe(pca); | ||
495 | if (ret < 0) | ||
496 | pwmchip_remove(&pca->chip); | ||
497 | |||
498 | return ret; | ||
349 | } | 499 | } |
350 | 500 | ||
351 | static int pca9685_pwm_remove(struct i2c_client *client) | 501 | static int pca9685_pwm_remove(struct i2c_client *client) |
diff --git a/drivers/pwm/pwm-pxa.c b/drivers/pwm/pwm-pxa.c index 58b709f29130..4143a46684d2 100644 --- a/drivers/pwm/pwm-pxa.c +++ b/drivers/pwm/pwm-pxa.c | |||
@@ -118,7 +118,7 @@ static void pxa_pwm_disable(struct pwm_chip *chip, struct pwm_device *pwm) | |||
118 | clk_disable_unprepare(pc->clk); | 118 | clk_disable_unprepare(pc->clk); |
119 | } | 119 | } |
120 | 120 | ||
121 | static struct pwm_ops pxa_pwm_ops = { | 121 | static const struct pwm_ops pxa_pwm_ops = { |
122 | .config = pxa_pwm_config, | 122 | .config = pxa_pwm_config, |
123 | .enable = pxa_pwm_enable, | 123 | .enable = pxa_pwm_enable, |
124 | .disable = pxa_pwm_disable, | 124 | .disable = pxa_pwm_disable, |
diff --git a/drivers/pwm/pwm-sti.c b/drivers/pwm/pwm-sti.c index dd82dc840af9..2b7c31c9d1ab 100644 --- a/drivers/pwm/pwm-sti.c +++ b/drivers/pwm/pwm-sti.c | |||
@@ -635,7 +635,6 @@ skip_cpt: | |||
635 | pc->chip.ops = &sti_pwm_ops; | 635 | pc->chip.ops = &sti_pwm_ops; |
636 | pc->chip.base = -1; | 636 | pc->chip.base = -1; |
637 | pc->chip.npwm = pc->cdata->pwm_num_devs; | 637 | pc->chip.npwm = pc->cdata->pwm_num_devs; |
638 | pc->chip.can_sleep = true; | ||
639 | 638 | ||
640 | ret = pwmchip_add(&pc->chip); | 639 | ret = pwmchip_add(&pc->chip); |
641 | if (ret < 0) { | 640 | if (ret < 0) { |
diff --git a/drivers/pwm/pwm-sun4i.c b/drivers/pwm/pwm-sun4i.c index b0803f6c64d9..1284ffa05921 100644 --- a/drivers/pwm/pwm-sun4i.c +++ b/drivers/pwm/pwm-sun4i.c | |||
@@ -340,7 +340,6 @@ static int sun4i_pwm_probe(struct platform_device *pdev) | |||
340 | pwm->chip.ops = &sun4i_pwm_ops; | 340 | pwm->chip.ops = &sun4i_pwm_ops; |
341 | pwm->chip.base = -1; | 341 | pwm->chip.base = -1; |
342 | pwm->chip.npwm = pwm->data->npwm; | 342 | pwm->chip.npwm = pwm->data->npwm; |
343 | pwm->chip.can_sleep = true; | ||
344 | pwm->chip.of_xlate = of_pwm_xlate_with_flags; | 343 | pwm->chip.of_xlate = of_pwm_xlate_with_flags; |
345 | pwm->chip.of_pwm_n_cells = 3; | 344 | pwm->chip.of_pwm_n_cells = 3; |
346 | 345 | ||
diff --git a/drivers/pwm/pwm-twl-led.c b/drivers/pwm/pwm-twl-led.c index b964470025c5..21eff991d0e3 100644 --- a/drivers/pwm/pwm-twl-led.c +++ b/drivers/pwm/pwm-twl-led.c | |||
@@ -303,7 +303,6 @@ static int twl_pwmled_probe(struct platform_device *pdev) | |||
303 | 303 | ||
304 | twl->chip.dev = &pdev->dev; | 304 | twl->chip.dev = &pdev->dev; |
305 | twl->chip.base = -1; | 305 | twl->chip.base = -1; |
306 | twl->chip.can_sleep = true; | ||
307 | 306 | ||
308 | mutex_init(&twl->mutex); | 307 | mutex_init(&twl->mutex); |
309 | 308 | ||
diff --git a/drivers/pwm/pwm-twl.c b/drivers/pwm/pwm-twl.c index 7a993b056638..9de617b76680 100644 --- a/drivers/pwm/pwm-twl.c +++ b/drivers/pwm/pwm-twl.c | |||
@@ -323,7 +323,6 @@ static int twl_pwm_probe(struct platform_device *pdev) | |||
323 | twl->chip.dev = &pdev->dev; | 323 | twl->chip.dev = &pdev->dev; |
324 | twl->chip.base = -1; | 324 | twl->chip.base = -1; |
325 | twl->chip.npwm = 2; | 325 | twl->chip.npwm = 2; |
326 | twl->chip.can_sleep = true; | ||
327 | 326 | ||
328 | mutex_init(&twl->mutex); | 327 | mutex_init(&twl->mutex); |
329 | 328 | ||
diff --git a/drivers/pwm/pwm-vt8500.c b/drivers/pwm/pwm-vt8500.c index cdb58fd4619d..8141a4984126 100644 --- a/drivers/pwm/pwm-vt8500.c +++ b/drivers/pwm/pwm-vt8500.c | |||
@@ -184,7 +184,7 @@ static int vt8500_pwm_set_polarity(struct pwm_chip *chip, | |||
184 | return 0; | 184 | return 0; |
185 | } | 185 | } |
186 | 186 | ||
187 | static struct pwm_ops vt8500_pwm_ops = { | 187 | static const struct pwm_ops vt8500_pwm_ops = { |
188 | .enable = vt8500_pwm_enable, | 188 | .enable = vt8500_pwm_enable, |
189 | .disable = vt8500_pwm_disable, | 189 | .disable = vt8500_pwm_disable, |
190 | .config = vt8500_pwm_config, | 190 | .config = vt8500_pwm_config, |
diff --git a/drivers/staging/greybus/pwm.c b/drivers/staging/greybus/pwm.c index c4bf3298ba07..f0404bc37123 100644 --- a/drivers/staging/greybus/pwm.c +++ b/drivers/staging/greybus/pwm.c | |||
@@ -284,7 +284,6 @@ static int gb_pwm_probe(struct gbphy_device *gbphy_dev, | |||
284 | pwm->ops = &gb_pwm_ops; | 284 | pwm->ops = &gb_pwm_ops; |
285 | pwm->base = -1; /* Allocate base dynamically */ | 285 | pwm->base = -1; /* Allocate base dynamically */ |
286 | pwm->npwm = pwmc->pwm_max + 1; | 286 | pwm->npwm = pwmc->pwm_max + 1; |
287 | pwm->can_sleep = true; /* FIXME */ | ||
288 | 287 | ||
289 | ret = pwmchip_add(pwm); | 288 | ret = pwmchip_add(pwm); |
290 | if (ret) { | 289 | if (ret) { |
diff --git a/drivers/thermal/Kconfig b/drivers/thermal/Kconfig index c2c056cc7ea5..776b34396144 100644 --- a/drivers/thermal/Kconfig +++ b/drivers/thermal/Kconfig | |||
@@ -245,6 +245,15 @@ config RCAR_THERMAL | |||
245 | Enable this to plug the R-Car thermal sensor driver into the Linux | 245 | Enable this to plug the R-Car thermal sensor driver into the Linux |
246 | thermal framework. | 246 | thermal framework. |
247 | 247 | ||
248 | config RCAR_GEN3_THERMAL | ||
249 | tristate "Renesas R-Car Gen3 thermal driver" | ||
250 | depends on ARCH_RENESAS || COMPILE_TEST | ||
251 | depends on HAS_IOMEM | ||
252 | depends on OF | ||
253 | help | ||
254 | Enable this to plug the R-Car Gen3 thermal sensor driver into the Linux | ||
255 | thermal framework. | ||
256 | |||
248 | config KIRKWOOD_THERMAL | 257 | config KIRKWOOD_THERMAL |
249 | tristate "Temperature sensor on Marvell Kirkwood SoCs" | 258 | tristate "Temperature sensor on Marvell Kirkwood SoCs" |
250 | depends on MACH_KIRKWOOD || COMPILE_TEST | 259 | depends on MACH_KIRKWOOD || COMPILE_TEST |
@@ -436,4 +445,12 @@ depends on (ARCH_QCOM && OF) || COMPILE_TEST | |||
436 | source "drivers/thermal/qcom/Kconfig" | 445 | source "drivers/thermal/qcom/Kconfig" |
437 | endmenu | 446 | endmenu |
438 | 447 | ||
448 | config ZX2967_THERMAL | ||
449 | tristate "Thermal sensors on zx2967 SoC" | ||
450 | depends on ARCH_ZX || COMPILE_TEST | ||
451 | help | ||
452 | Enable the zx2967 thermal sensors driver, which supports | ||
453 | the primitive temperature sensor embedded in zx2967 SoCs. | ||
454 | This sensor generates the real time die temperature. | ||
455 | |||
439 | endif | 456 | endif |
diff --git a/drivers/thermal/Makefile b/drivers/thermal/Makefile index 6a3d7b573036..7adae2029355 100644 --- a/drivers/thermal/Makefile +++ b/drivers/thermal/Makefile | |||
@@ -31,6 +31,7 @@ obj-$(CONFIG_QCOM_SPMI_TEMP_ALARM) += qcom-spmi-temp-alarm.o | |||
31 | obj-$(CONFIG_SPEAR_THERMAL) += spear_thermal.o | 31 | obj-$(CONFIG_SPEAR_THERMAL) += spear_thermal.o |
32 | obj-$(CONFIG_ROCKCHIP_THERMAL) += rockchip_thermal.o | 32 | obj-$(CONFIG_ROCKCHIP_THERMAL) += rockchip_thermal.o |
33 | obj-$(CONFIG_RCAR_THERMAL) += rcar_thermal.o | 33 | obj-$(CONFIG_RCAR_THERMAL) += rcar_thermal.o |
34 | obj-$(CONFIG_RCAR_GEN3_THERMAL) += rcar_gen3_thermal.o | ||
34 | obj-$(CONFIG_KIRKWOOD_THERMAL) += kirkwood_thermal.o | 35 | obj-$(CONFIG_KIRKWOOD_THERMAL) += kirkwood_thermal.o |
35 | obj-y += samsung/ | 36 | obj-y += samsung/ |
36 | obj-$(CONFIG_DOVE_THERMAL) += dove_thermal.o | 37 | obj-$(CONFIG_DOVE_THERMAL) += dove_thermal.o |
@@ -56,3 +57,4 @@ obj-$(CONFIG_TEGRA_SOCTHERM) += tegra/ | |||
56 | obj-$(CONFIG_HISI_THERMAL) += hisi_thermal.o | 57 | obj-$(CONFIG_HISI_THERMAL) += hisi_thermal.o |
57 | obj-$(CONFIG_MTK_THERMAL) += mtk_thermal.o | 58 | obj-$(CONFIG_MTK_THERMAL) += mtk_thermal.o |
58 | obj-$(CONFIG_GENERIC_ADC_THERMAL) += thermal-generic-adc.o | 59 | obj-$(CONFIG_GENERIC_ADC_THERMAL) += thermal-generic-adc.o |
60 | obj-$(CONFIG_ZX2967_THERMAL) += zx2967_thermal.o | ||
diff --git a/drivers/thermal/clock_cooling.c b/drivers/thermal/clock_cooling.c index ed5dd0e88657..56711c25584d 100644 --- a/drivers/thermal/clock_cooling.c +++ b/drivers/thermal/clock_cooling.c | |||
@@ -65,42 +65,7 @@ struct clock_cooling_device { | |||
65 | }; | 65 | }; |
66 | #define to_clock_cooling_device(x) \ | 66 | #define to_clock_cooling_device(x) \ |
67 | container_of(x, struct clock_cooling_device, clk_rate_change_nb) | 67 | container_of(x, struct clock_cooling_device, clk_rate_change_nb) |
68 | static DEFINE_IDR(clock_idr); | 68 | static DEFINE_IDA(clock_ida); |
69 | static DEFINE_MUTEX(cooling_clock_lock); | ||
70 | |||
71 | /** | ||
72 | * clock_cooling_get_idr - function to get an unique id. | ||
73 | * @id: int * value generated by this function. | ||
74 | * | ||
75 | * This function will populate @id with an unique | ||
76 | * id, using the idr API. | ||
77 | * | ||
78 | * Return: 0 on success, an error code on failure. | ||
79 | */ | ||
80 | static int clock_cooling_get_idr(int *id) | ||
81 | { | ||
82 | int ret; | ||
83 | |||
84 | mutex_lock(&cooling_clock_lock); | ||
85 | ret = idr_alloc(&clock_idr, NULL, 0, 0, GFP_KERNEL); | ||
86 | mutex_unlock(&cooling_clock_lock); | ||
87 | if (unlikely(ret < 0)) | ||
88 | return ret; | ||
89 | *id = ret; | ||
90 | |||
91 | return 0; | ||
92 | } | ||
93 | |||
94 | /** | ||
95 | * release_idr - function to free the unique id. | ||
96 | * @id: int value representing the unique id. | ||
97 | */ | ||
98 | static void release_idr(int id) | ||
99 | { | ||
100 | mutex_lock(&cooling_clock_lock); | ||
101 | idr_remove(&clock_idr, id); | ||
102 | mutex_unlock(&cooling_clock_lock); | ||
103 | } | ||
104 | 69 | ||
105 | /* Below code defines functions to be used for clock as cooling device */ | 70 | /* Below code defines functions to be used for clock as cooling device */ |
106 | 71 | ||
@@ -432,16 +397,17 @@ clock_cooling_register(struct device *dev, const char *clock_name) | |||
432 | if (IS_ERR(ccdev->clk)) | 397 | if (IS_ERR(ccdev->clk)) |
433 | return ERR_CAST(ccdev->clk); | 398 | return ERR_CAST(ccdev->clk); |
434 | 399 | ||
435 | ret = clock_cooling_get_idr(&ccdev->id); | 400 | ret = ida_simple_get(&clock_ida, 0, 0, GFP_KERNEL); |
436 | if (ret) | 401 | if (ret < 0) |
437 | return ERR_PTR(-EINVAL); | 402 | return ERR_PTR(ret); |
403 | ccdev->id = ret; | ||
438 | 404 | ||
439 | snprintf(dev_name, sizeof(dev_name), "thermal-clock-%d", ccdev->id); | 405 | snprintf(dev_name, sizeof(dev_name), "thermal-clock-%d", ccdev->id); |
440 | 406 | ||
441 | cdev = thermal_cooling_device_register(dev_name, ccdev, | 407 | cdev = thermal_cooling_device_register(dev_name, ccdev, |
442 | &clock_cooling_ops); | 408 | &clock_cooling_ops); |
443 | if (IS_ERR(cdev)) { | 409 | if (IS_ERR(cdev)) { |
444 | release_idr(ccdev->id); | 410 | ida_simple_remove(&clock_ida, ccdev->id); |
445 | return ERR_PTR(-EINVAL); | 411 | return ERR_PTR(-EINVAL); |
446 | } | 412 | } |
447 | ccdev->cdev = cdev; | 413 | ccdev->cdev = cdev; |
@@ -450,7 +416,7 @@ clock_cooling_register(struct device *dev, const char *clock_name) | |||
450 | /* Assuming someone has already filled the opp table for this device */ | 416 | /* Assuming someone has already filled the opp table for this device */ |
451 | ret = dev_pm_opp_init_cpufreq_table(dev, &ccdev->freq_table); | 417 | ret = dev_pm_opp_init_cpufreq_table(dev, &ccdev->freq_table); |
452 | if (ret) { | 418 | if (ret) { |
453 | release_idr(ccdev->id); | 419 | ida_simple_remove(&clock_ida, ccdev->id); |
454 | return ERR_PTR(ret); | 420 | return ERR_PTR(ret); |
455 | } | 421 | } |
456 | ccdev->clock_state = 0; | 422 | ccdev->clock_state = 0; |
@@ -481,6 +447,6 @@ void clock_cooling_unregister(struct thermal_cooling_device *cdev) | |||
481 | dev_pm_opp_free_cpufreq_table(ccdev->dev, &ccdev->freq_table); | 447 | dev_pm_opp_free_cpufreq_table(ccdev->dev, &ccdev->freq_table); |
482 | 448 | ||
483 | thermal_cooling_device_unregister(ccdev->cdev); | 449 | thermal_cooling_device_unregister(ccdev->cdev); |
484 | release_idr(ccdev->id); | 450 | ida_simple_remove(&clock_ida, ccdev->id); |
485 | } | 451 | } |
486 | EXPORT_SYMBOL_GPL(clock_cooling_unregister); | 452 | EXPORT_SYMBOL_GPL(clock_cooling_unregister); |
diff --git a/drivers/thermal/cpu_cooling.c b/drivers/thermal/cpu_cooling.c index 85fdbf762fa0..91048eeca28b 100644 --- a/drivers/thermal/cpu_cooling.c +++ b/drivers/thermal/cpu_cooling.c | |||
@@ -26,6 +26,7 @@ | |||
26 | #include <linux/thermal.h> | 26 | #include <linux/thermal.h> |
27 | #include <linux/cpufreq.h> | 27 | #include <linux/cpufreq.h> |
28 | #include <linux/err.h> | 28 | #include <linux/err.h> |
29 | #include <linux/idr.h> | ||
29 | #include <linux/pm_opp.h> | 30 | #include <linux/pm_opp.h> |
30 | #include <linux/slab.h> | 31 | #include <linux/slab.h> |
31 | #include <linux/cpu.h> | 32 | #include <linux/cpu.h> |
@@ -104,50 +105,13 @@ struct cpufreq_cooling_device { | |||
104 | struct device *cpu_dev; | 105 | struct device *cpu_dev; |
105 | get_static_t plat_get_static_power; | 106 | get_static_t plat_get_static_power; |
106 | }; | 107 | }; |
107 | static DEFINE_IDR(cpufreq_idr); | 108 | static DEFINE_IDA(cpufreq_ida); |
108 | static DEFINE_MUTEX(cooling_cpufreq_lock); | ||
109 | 109 | ||
110 | static unsigned int cpufreq_dev_count; | 110 | static unsigned int cpufreq_dev_count; |
111 | 111 | ||
112 | static DEFINE_MUTEX(cooling_list_lock); | 112 | static DEFINE_MUTEX(cooling_list_lock); |
113 | static LIST_HEAD(cpufreq_dev_list); | 113 | static LIST_HEAD(cpufreq_dev_list); |
114 | 114 | ||
115 | /** | ||
116 | * get_idr - function to get a unique id. | ||
117 | * @idr: struct idr * handle used to create a id. | ||
118 | * @id: int * value generated by this function. | ||
119 | * | ||
120 | * This function will populate @id with an unique | ||
121 | * id, using the idr API. | ||
122 | * | ||
123 | * Return: 0 on success, an error code on failure. | ||
124 | */ | ||
125 | static int get_idr(struct idr *idr, int *id) | ||
126 | { | ||
127 | int ret; | ||
128 | |||
129 | mutex_lock(&cooling_cpufreq_lock); | ||
130 | ret = idr_alloc(idr, NULL, 0, 0, GFP_KERNEL); | ||
131 | mutex_unlock(&cooling_cpufreq_lock); | ||
132 | if (unlikely(ret < 0)) | ||
133 | return ret; | ||
134 | *id = ret; | ||
135 | |||
136 | return 0; | ||
137 | } | ||
138 | |||
139 | /** | ||
140 | * release_idr - function to free the unique id. | ||
141 | * @idr: struct idr * handle used for creating the id. | ||
142 | * @id: int value representing the unique id. | ||
143 | */ | ||
144 | static void release_idr(struct idr *idr, int id) | ||
145 | { | ||
146 | mutex_lock(&cooling_cpufreq_lock); | ||
147 | idr_remove(idr, id); | ||
148 | mutex_unlock(&cooling_cpufreq_lock); | ||
149 | } | ||
150 | |||
151 | /* Below code defines functions to be used for cpufreq as cooling device */ | 115 | /* Below code defines functions to be used for cpufreq as cooling device */ |
152 | 116 | ||
153 | /** | 117 | /** |
@@ -645,31 +609,39 @@ static int cpufreq_state2power(struct thermal_cooling_device *cdev, | |||
645 | unsigned long state, u32 *power) | 609 | unsigned long state, u32 *power) |
646 | { | 610 | { |
647 | unsigned int freq, num_cpus; | 611 | unsigned int freq, num_cpus; |
648 | cpumask_t cpumask; | 612 | cpumask_var_t cpumask; |
649 | u32 static_power, dynamic_power; | 613 | u32 static_power, dynamic_power; |
650 | int ret; | 614 | int ret; |
651 | struct cpufreq_cooling_device *cpufreq_device = cdev->devdata; | 615 | struct cpufreq_cooling_device *cpufreq_device = cdev->devdata; |
652 | 616 | ||
653 | cpumask_and(&cpumask, &cpufreq_device->allowed_cpus, cpu_online_mask); | 617 | if (!alloc_cpumask_var(&cpumask, GFP_KERNEL)) |
654 | num_cpus = cpumask_weight(&cpumask); | 618 | return -ENOMEM; |
619 | |||
620 | cpumask_and(cpumask, &cpufreq_device->allowed_cpus, cpu_online_mask); | ||
621 | num_cpus = cpumask_weight(cpumask); | ||
655 | 622 | ||
656 | /* None of our cpus are online, so no power */ | 623 | /* None of our cpus are online, so no power */ |
657 | if (num_cpus == 0) { | 624 | if (num_cpus == 0) { |
658 | *power = 0; | 625 | *power = 0; |
659 | return 0; | 626 | ret = 0; |
627 | goto out; | ||
660 | } | 628 | } |
661 | 629 | ||
662 | freq = cpufreq_device->freq_table[state]; | 630 | freq = cpufreq_device->freq_table[state]; |
663 | if (!freq) | 631 | if (!freq) { |
664 | return -EINVAL; | 632 | ret = -EINVAL; |
633 | goto out; | ||
634 | } | ||
665 | 635 | ||
666 | dynamic_power = cpu_freq_to_power(cpufreq_device, freq) * num_cpus; | 636 | dynamic_power = cpu_freq_to_power(cpufreq_device, freq) * num_cpus; |
667 | ret = get_static_power(cpufreq_device, tz, freq, &static_power); | 637 | ret = get_static_power(cpufreq_device, tz, freq, &static_power); |
668 | if (ret) | 638 | if (ret) |
669 | return ret; | 639 | goto out; |
670 | 640 | ||
671 | *power = static_power + dynamic_power; | 641 | *power = static_power + dynamic_power; |
672 | return 0; | 642 | out: |
643 | free_cpumask_var(cpumask); | ||
644 | return ret; | ||
673 | } | 645 | } |
674 | 646 | ||
675 | /** | 647 | /** |
@@ -795,16 +767,20 @@ __cpufreq_cooling_register(struct device_node *np, | |||
795 | struct cpufreq_cooling_device *cpufreq_dev; | 767 | struct cpufreq_cooling_device *cpufreq_dev; |
796 | char dev_name[THERMAL_NAME_LENGTH]; | 768 | char dev_name[THERMAL_NAME_LENGTH]; |
797 | struct cpufreq_frequency_table *pos, *table; | 769 | struct cpufreq_frequency_table *pos, *table; |
798 | struct cpumask temp_mask; | 770 | cpumask_var_t temp_mask; |
799 | unsigned int freq, i, num_cpus; | 771 | unsigned int freq, i, num_cpus; |
800 | int ret; | 772 | int ret; |
801 | struct thermal_cooling_device_ops *cooling_ops; | 773 | struct thermal_cooling_device_ops *cooling_ops; |
802 | 774 | ||
803 | cpumask_and(&temp_mask, clip_cpus, cpu_online_mask); | 775 | if (!alloc_cpumask_var(&temp_mask, GFP_KERNEL)) |
804 | policy = cpufreq_cpu_get(cpumask_first(&temp_mask)); | 776 | return ERR_PTR(-ENOMEM); |
777 | |||
778 | cpumask_and(temp_mask, clip_cpus, cpu_online_mask); | ||
779 | policy = cpufreq_cpu_get(cpumask_first(temp_mask)); | ||
805 | if (!policy) { | 780 | if (!policy) { |
806 | pr_debug("%s: CPUFreq policy not found\n", __func__); | 781 | pr_debug("%s: CPUFreq policy not found\n", __func__); |
807 | return ERR_PTR(-EPROBE_DEFER); | 782 | cool_dev = ERR_PTR(-EPROBE_DEFER); |
783 | goto free_cpumask; | ||
808 | } | 784 | } |
809 | 785 | ||
810 | table = policy->freq_table; | 786 | table = policy->freq_table; |
@@ -867,11 +843,12 @@ __cpufreq_cooling_register(struct device_node *np, | |||
867 | cooling_ops = &cpufreq_cooling_ops; | 843 | cooling_ops = &cpufreq_cooling_ops; |
868 | } | 844 | } |
869 | 845 | ||
870 | ret = get_idr(&cpufreq_idr, &cpufreq_dev->id); | 846 | ret = ida_simple_get(&cpufreq_ida, 0, 0, GFP_KERNEL); |
871 | if (ret) { | 847 | if (ret < 0) { |
872 | cool_dev = ERR_PTR(ret); | 848 | cool_dev = ERR_PTR(ret); |
873 | goto free_power_table; | 849 | goto free_power_table; |
874 | } | 850 | } |
851 | cpufreq_dev->id = ret; | ||
875 | 852 | ||
876 | /* Fill freq-table in descending order of frequencies */ | 853 | /* Fill freq-table in descending order of frequencies */ |
877 | for (i = 0, freq = -1; i <= cpufreq_dev->max_level; i++) { | 854 | for (i = 0, freq = -1; i <= cpufreq_dev->max_level; i++) { |
@@ -891,27 +868,24 @@ __cpufreq_cooling_register(struct device_node *np, | |||
891 | cool_dev = thermal_of_cooling_device_register(np, dev_name, cpufreq_dev, | 868 | cool_dev = thermal_of_cooling_device_register(np, dev_name, cpufreq_dev, |
892 | cooling_ops); | 869 | cooling_ops); |
893 | if (IS_ERR(cool_dev)) | 870 | if (IS_ERR(cool_dev)) |
894 | goto remove_idr; | 871 | goto remove_ida; |
895 | 872 | ||
896 | cpufreq_dev->clipped_freq = cpufreq_dev->freq_table[0]; | 873 | cpufreq_dev->clipped_freq = cpufreq_dev->freq_table[0]; |
897 | cpufreq_dev->cool_dev = cool_dev; | 874 | cpufreq_dev->cool_dev = cool_dev; |
898 | 875 | ||
899 | mutex_lock(&cooling_cpufreq_lock); | ||
900 | |||
901 | mutex_lock(&cooling_list_lock); | 876 | mutex_lock(&cooling_list_lock); |
902 | list_add(&cpufreq_dev->node, &cpufreq_dev_list); | 877 | list_add(&cpufreq_dev->node, &cpufreq_dev_list); |
903 | mutex_unlock(&cooling_list_lock); | ||
904 | 878 | ||
905 | /* Register the notifier for first cpufreq cooling device */ | 879 | /* Register the notifier for first cpufreq cooling device */ |
906 | if (!cpufreq_dev_count++) | 880 | if (!cpufreq_dev_count++) |
907 | cpufreq_register_notifier(&thermal_cpufreq_notifier_block, | 881 | cpufreq_register_notifier(&thermal_cpufreq_notifier_block, |
908 | CPUFREQ_POLICY_NOTIFIER); | 882 | CPUFREQ_POLICY_NOTIFIER); |
909 | mutex_unlock(&cooling_cpufreq_lock); | 883 | mutex_unlock(&cooling_list_lock); |
910 | 884 | ||
911 | goto put_policy; | 885 | goto put_policy; |
912 | 886 | ||
913 | remove_idr: | 887 | remove_ida: |
914 | release_idr(&cpufreq_idr, cpufreq_dev->id); | 888 | ida_simple_remove(&cpufreq_ida, cpufreq_dev->id); |
915 | free_power_table: | 889 | free_power_table: |
916 | kfree(cpufreq_dev->dyn_power_table); | 890 | kfree(cpufreq_dev->dyn_power_table); |
917 | free_table: | 891 | free_table: |
@@ -924,7 +898,8 @@ free_cdev: | |||
924 | kfree(cpufreq_dev); | 898 | kfree(cpufreq_dev); |
925 | put_policy: | 899 | put_policy: |
926 | cpufreq_cpu_put(policy); | 900 | cpufreq_cpu_put(policy); |
927 | 901 | free_cpumask: | |
902 | free_cpumask_var(temp_mask); | ||
928 | return cool_dev; | 903 | return cool_dev; |
929 | } | 904 | } |
930 | 905 | ||
@@ -1052,20 +1027,17 @@ void cpufreq_cooling_unregister(struct thermal_cooling_device *cdev) | |||
1052 | 1027 | ||
1053 | cpufreq_dev = cdev->devdata; | 1028 | cpufreq_dev = cdev->devdata; |
1054 | 1029 | ||
1030 | mutex_lock(&cooling_list_lock); | ||
1055 | /* Unregister the notifier for the last cpufreq cooling device */ | 1031 | /* Unregister the notifier for the last cpufreq cooling device */ |
1056 | mutex_lock(&cooling_cpufreq_lock); | ||
1057 | if (!--cpufreq_dev_count) | 1032 | if (!--cpufreq_dev_count) |
1058 | cpufreq_unregister_notifier(&thermal_cpufreq_notifier_block, | 1033 | cpufreq_unregister_notifier(&thermal_cpufreq_notifier_block, |
1059 | CPUFREQ_POLICY_NOTIFIER); | 1034 | CPUFREQ_POLICY_NOTIFIER); |
1060 | 1035 | ||
1061 | mutex_lock(&cooling_list_lock); | ||
1062 | list_del(&cpufreq_dev->node); | 1036 | list_del(&cpufreq_dev->node); |
1063 | mutex_unlock(&cooling_list_lock); | 1037 | mutex_unlock(&cooling_list_lock); |
1064 | 1038 | ||
1065 | mutex_unlock(&cooling_cpufreq_lock); | ||
1066 | |||
1067 | thermal_cooling_device_unregister(cpufreq_dev->cool_dev); | 1039 | thermal_cooling_device_unregister(cpufreq_dev->cool_dev); |
1068 | release_idr(&cpufreq_idr, cpufreq_dev->id); | 1040 | ida_simple_remove(&cpufreq_ida, cpufreq_dev->id); |
1069 | kfree(cpufreq_dev->dyn_power_table); | 1041 | kfree(cpufreq_dev->dyn_power_table); |
1070 | kfree(cpufreq_dev->time_in_idle_timestamp); | 1042 | kfree(cpufreq_dev->time_in_idle_timestamp); |
1071 | kfree(cpufreq_dev->time_in_idle); | 1043 | kfree(cpufreq_dev->time_in_idle); |
diff --git a/drivers/thermal/devfreq_cooling.c b/drivers/thermal/devfreq_cooling.c index ba7a5cd994dc..7743a78d4723 100644 --- a/drivers/thermal/devfreq_cooling.c +++ b/drivers/thermal/devfreq_cooling.c | |||
@@ -21,14 +21,14 @@ | |||
21 | #include <linux/devfreq.h> | 21 | #include <linux/devfreq.h> |
22 | #include <linux/devfreq_cooling.h> | 22 | #include <linux/devfreq_cooling.h> |
23 | #include <linux/export.h> | 23 | #include <linux/export.h> |
24 | #include <linux/idr.h> | ||
24 | #include <linux/slab.h> | 25 | #include <linux/slab.h> |
25 | #include <linux/pm_opp.h> | 26 | #include <linux/pm_opp.h> |
26 | #include <linux/thermal.h> | 27 | #include <linux/thermal.h> |
27 | 28 | ||
28 | #include <trace/events/thermal.h> | 29 | #include <trace/events/thermal.h> |
29 | 30 | ||
30 | static DEFINE_MUTEX(devfreq_lock); | 31 | static DEFINE_IDA(devfreq_ida); |
31 | static DEFINE_IDR(devfreq_idr); | ||
32 | 32 | ||
33 | /** | 33 | /** |
34 | * struct devfreq_cooling_device - Devfreq cooling device | 34 | * struct devfreq_cooling_device - Devfreq cooling device |
@@ -58,42 +58,6 @@ struct devfreq_cooling_device { | |||
58 | }; | 58 | }; |
59 | 59 | ||
60 | /** | 60 | /** |
61 | * get_idr - function to get a unique id. | ||
62 | * @idr: struct idr * handle used to create a id. | ||
63 | * @id: int * value generated by this function. | ||
64 | * | ||
65 | * This function will populate @id with an unique | ||
66 | * id, using the idr API. | ||
67 | * | ||
68 | * Return: 0 on success, an error code on failure. | ||
69 | */ | ||
70 | static int get_idr(struct idr *idr, int *id) | ||
71 | { | ||
72 | int ret; | ||
73 | |||
74 | mutex_lock(&devfreq_lock); | ||
75 | ret = idr_alloc(idr, NULL, 0, 0, GFP_KERNEL); | ||
76 | mutex_unlock(&devfreq_lock); | ||
77 | if (unlikely(ret < 0)) | ||
78 | return ret; | ||
79 | *id = ret; | ||
80 | |||
81 | return 0; | ||
82 | } | ||
83 | |||
84 | /** | ||
85 | * release_idr - function to free the unique id. | ||
86 | * @idr: struct idr * handle used for creating the id. | ||
87 | * @id: int value representing the unique id. | ||
88 | */ | ||
89 | static void release_idr(struct idr *idr, int id) | ||
90 | { | ||
91 | mutex_lock(&devfreq_lock); | ||
92 | idr_remove(idr, id); | ||
93 | mutex_unlock(&devfreq_lock); | ||
94 | } | ||
95 | |||
96 | /** | ||
97 | * partition_enable_opps() - disable all opps above a given state | 61 | * partition_enable_opps() - disable all opps above a given state |
98 | * @dfc: Pointer to devfreq we are operating on | 62 | * @dfc: Pointer to devfreq we are operating on |
99 | * @cdev_state: cooling device state we're setting | 63 | * @cdev_state: cooling device state we're setting |
@@ -489,9 +453,10 @@ of_devfreq_cooling_register_power(struct device_node *np, struct devfreq *df, | |||
489 | if (err) | 453 | if (err) |
490 | goto free_dfc; | 454 | goto free_dfc; |
491 | 455 | ||
492 | err = get_idr(&devfreq_idr, &dfc->id); | 456 | err = ida_simple_get(&devfreq_ida, 0, 0, GFP_KERNEL); |
493 | if (err) | 457 | if (err < 0) |
494 | goto free_tables; | 458 | goto free_tables; |
459 | dfc->id = err; | ||
495 | 460 | ||
496 | snprintf(dev_name, sizeof(dev_name), "thermal-devfreq-%d", dfc->id); | 461 | snprintf(dev_name, sizeof(dev_name), "thermal-devfreq-%d", dfc->id); |
497 | 462 | ||
@@ -502,15 +467,15 @@ of_devfreq_cooling_register_power(struct device_node *np, struct devfreq *df, | |||
502 | dev_err(df->dev.parent, | 467 | dev_err(df->dev.parent, |
503 | "Failed to register devfreq cooling device (%d)\n", | 468 | "Failed to register devfreq cooling device (%d)\n", |
504 | err); | 469 | err); |
505 | goto release_idr; | 470 | goto release_ida; |
506 | } | 471 | } |
507 | 472 | ||
508 | dfc->cdev = cdev; | 473 | dfc->cdev = cdev; |
509 | 474 | ||
510 | return cdev; | 475 | return cdev; |
511 | 476 | ||
512 | release_idr: | 477 | release_ida: |
513 | release_idr(&devfreq_idr, dfc->id); | 478 | ida_simple_remove(&devfreq_ida, dfc->id); |
514 | free_tables: | 479 | free_tables: |
515 | kfree(dfc->power_table); | 480 | kfree(dfc->power_table); |
516 | kfree(dfc->freq_table); | 481 | kfree(dfc->freq_table); |
@@ -558,7 +523,7 @@ void devfreq_cooling_unregister(struct thermal_cooling_device *cdev) | |||
558 | dfc = cdev->devdata; | 523 | dfc = cdev->devdata; |
559 | 524 | ||
560 | thermal_cooling_device_unregister(dfc->cdev); | 525 | thermal_cooling_device_unregister(dfc->cdev); |
561 | release_idr(&devfreq_idr, dfc->id); | 526 | ida_simple_remove(&devfreq_ida, dfc->id); |
562 | kfree(dfc->power_table); | 527 | kfree(dfc->power_table); |
563 | kfree(dfc->freq_table); | 528 | kfree(dfc->freq_table); |
564 | 529 | ||
diff --git a/drivers/thermal/imx_thermal.c b/drivers/thermal/imx_thermal.c index 06912f0602b7..fb648a45754e 100644 --- a/drivers/thermal/imx_thermal.c +++ b/drivers/thermal/imx_thermal.c | |||
@@ -489,6 +489,10 @@ static int imx_thermal_probe(struct platform_device *pdev) | |||
489 | data->tempmon = map; | 489 | data->tempmon = map; |
490 | 490 | ||
491 | data->socdata = of_device_get_match_data(&pdev->dev); | 491 | data->socdata = of_device_get_match_data(&pdev->dev); |
492 | if (!data->socdata) { | ||
493 | dev_err(&pdev->dev, "no device match found\n"); | ||
494 | return -ENODEV; | ||
495 | } | ||
492 | 496 | ||
493 | /* make sure the IRQ flag is clear before enabling irq on i.MX6SX */ | 497 | /* make sure the IRQ flag is clear before enabling irq on i.MX6SX */ |
494 | if (data->socdata->version == TEMPMON_IMX6SX) { | 498 | if (data->socdata->version == TEMPMON_IMX6SX) { |
diff --git a/drivers/thermal/intel_powerclamp.c b/drivers/thermal/intel_powerclamp.c index df64692e9e64..a47103a659fa 100644 --- a/drivers/thermal/intel_powerclamp.c +++ b/drivers/thermal/intel_powerclamp.c | |||
@@ -461,16 +461,13 @@ static void poll_pkg_cstate(struct work_struct *dummy) | |||
461 | { | 461 | { |
462 | static u64 msr_last; | 462 | static u64 msr_last; |
463 | static u64 tsc_last; | 463 | static u64 tsc_last; |
464 | static unsigned long jiffies_last; | ||
465 | 464 | ||
466 | u64 msr_now; | 465 | u64 msr_now; |
467 | unsigned long jiffies_now; | ||
468 | u64 tsc_now; | 466 | u64 tsc_now; |
469 | u64 val64; | 467 | u64 val64; |
470 | 468 | ||
471 | msr_now = pkg_state_counter(); | 469 | msr_now = pkg_state_counter(); |
472 | tsc_now = rdtsc(); | 470 | tsc_now = rdtsc(); |
473 | jiffies_now = jiffies; | ||
474 | 471 | ||
475 | /* calculate pkg cstate vs tsc ratio */ | 472 | /* calculate pkg cstate vs tsc ratio */ |
476 | if (!msr_last || !tsc_last) | 473 | if (!msr_last || !tsc_last) |
@@ -485,7 +482,6 @@ static void poll_pkg_cstate(struct work_struct *dummy) | |||
485 | 482 | ||
486 | /* update record */ | 483 | /* update record */ |
487 | msr_last = msr_now; | 484 | msr_last = msr_now; |
488 | jiffies_last = jiffies_now; | ||
489 | tsc_last = tsc_now; | 485 | tsc_last = tsc_now; |
490 | 486 | ||
491 | if (true == clamping) | 487 | if (true == clamping) |
diff --git a/drivers/thermal/mtk_thermal.c b/drivers/thermal/mtk_thermal.c index 34169c32d495..1aff7fde54b1 100644 --- a/drivers/thermal/mtk_thermal.c +++ b/drivers/thermal/mtk_thermal.c | |||
@@ -183,37 +183,37 @@ struct mtk_thermal { | |||
183 | }; | 183 | }; |
184 | 184 | ||
185 | /* MT8173 thermal sensor data */ | 185 | /* MT8173 thermal sensor data */ |
186 | const int mt8173_bank_data[MT8173_NUM_ZONES][3] = { | 186 | static const int mt8173_bank_data[MT8173_NUM_ZONES][3] = { |
187 | { MT8173_TS2, MT8173_TS3 }, | 187 | { MT8173_TS2, MT8173_TS3 }, |
188 | { MT8173_TS2, MT8173_TS4 }, | 188 | { MT8173_TS2, MT8173_TS4 }, |
189 | { MT8173_TS1, MT8173_TS2, MT8173_TSABB }, | 189 | { MT8173_TS1, MT8173_TS2, MT8173_TSABB }, |
190 | { MT8173_TS2 }, | 190 | { MT8173_TS2 }, |
191 | }; | 191 | }; |
192 | 192 | ||
193 | const int mt8173_msr[MT8173_NUM_SENSORS_PER_ZONE] = { | 193 | static const int mt8173_msr[MT8173_NUM_SENSORS_PER_ZONE] = { |
194 | TEMP_MSR0, TEMP_MSR1, TEMP_MSR2, TEMP_MSR2 | 194 | TEMP_MSR0, TEMP_MSR1, TEMP_MSR2, TEMP_MSR2 |
195 | }; | 195 | }; |
196 | 196 | ||
197 | const int mt8173_adcpnp[MT8173_NUM_SENSORS_PER_ZONE] = { | 197 | static const int mt8173_adcpnp[MT8173_NUM_SENSORS_PER_ZONE] = { |
198 | TEMP_ADCPNP0, TEMP_ADCPNP1, TEMP_ADCPNP2, TEMP_ADCPNP3 | 198 | TEMP_ADCPNP0, TEMP_ADCPNP1, TEMP_ADCPNP2, TEMP_ADCPNP3 |
199 | }; | 199 | }; |
200 | 200 | ||
201 | const int mt8173_mux_values[MT8173_NUM_SENSORS] = { 0, 1, 2, 3, 16 }; | 201 | static const int mt8173_mux_values[MT8173_NUM_SENSORS] = { 0, 1, 2, 3, 16 }; |
202 | 202 | ||
203 | /* MT2701 thermal sensor data */ | 203 | /* MT2701 thermal sensor data */ |
204 | const int mt2701_bank_data[MT2701_NUM_SENSORS] = { | 204 | static const int mt2701_bank_data[MT2701_NUM_SENSORS] = { |
205 | MT2701_TS1, MT2701_TS2, MT2701_TSABB | 205 | MT2701_TS1, MT2701_TS2, MT2701_TSABB |
206 | }; | 206 | }; |
207 | 207 | ||
208 | const int mt2701_msr[MT2701_NUM_SENSORS_PER_ZONE] = { | 208 | static const int mt2701_msr[MT2701_NUM_SENSORS_PER_ZONE] = { |
209 | TEMP_MSR0, TEMP_MSR1, TEMP_MSR2 | 209 | TEMP_MSR0, TEMP_MSR1, TEMP_MSR2 |
210 | }; | 210 | }; |
211 | 211 | ||
212 | const int mt2701_adcpnp[MT2701_NUM_SENSORS_PER_ZONE] = { | 212 | static const int mt2701_adcpnp[MT2701_NUM_SENSORS_PER_ZONE] = { |
213 | TEMP_ADCPNP0, TEMP_ADCPNP1, TEMP_ADCPNP2 | 213 | TEMP_ADCPNP0, TEMP_ADCPNP1, TEMP_ADCPNP2 |
214 | }; | 214 | }; |
215 | 215 | ||
216 | const int mt2701_mux_values[MT2701_NUM_SENSORS] = { 0, 1, 16 }; | 216 | static const int mt2701_mux_values[MT2701_NUM_SENSORS] = { 0, 1, 16 }; |
217 | 217 | ||
218 | /** | 218 | /** |
219 | * The MT8173 thermal controller has four banks. Each bank can read up to | 219 | * The MT8173 thermal controller has four banks. Each bank can read up to |
diff --git a/drivers/thermal/rcar_gen3_thermal.c b/drivers/thermal/rcar_gen3_thermal.c new file mode 100644 index 000000000000..d33c845244b1 --- /dev/null +++ b/drivers/thermal/rcar_gen3_thermal.c | |||
@@ -0,0 +1,335 @@ | |||
1 | /* | ||
2 | * R-Car Gen3 THS thermal sensor driver | ||
3 | * Based on rcar_thermal.c and work from Hien Dang and Khiem Nguyen. | ||
4 | * | ||
5 | * Copyright (C) 2016 Renesas Electronics Corporation. | ||
6 | * Copyright (C) 2016 Sang Engineering | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License as published by | ||
10 | * the Free Software Foundation; version 2 of the License. | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, but | ||
13 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
15 | * General Public License for more details. | ||
16 | * | ||
17 | */ | ||
18 | #include <linux/delay.h> | ||
19 | #include <linux/err.h> | ||
20 | #include <linux/interrupt.h> | ||
21 | #include <linux/io.h> | ||
22 | #include <linux/module.h> | ||
23 | #include <linux/mutex.h> | ||
24 | #include <linux/of_device.h> | ||
25 | #include <linux/platform_device.h> | ||
26 | #include <linux/pm_runtime.h> | ||
27 | #include <linux/thermal.h> | ||
28 | |||
29 | /* Register offsets */ | ||
30 | #define REG_GEN3_IRQSTR 0x04 | ||
31 | #define REG_GEN3_IRQMSK 0x08 | ||
32 | #define REG_GEN3_IRQCTL 0x0C | ||
33 | #define REG_GEN3_IRQEN 0x10 | ||
34 | #define REG_GEN3_IRQTEMP1 0x14 | ||
35 | #define REG_GEN3_IRQTEMP2 0x18 | ||
36 | #define REG_GEN3_IRQTEMP3 0x1C | ||
37 | #define REG_GEN3_CTSR 0x20 | ||
38 | #define REG_GEN3_THCTR 0x20 | ||
39 | #define REG_GEN3_TEMP 0x28 | ||
40 | #define REG_GEN3_THCODE1 0x50 | ||
41 | #define REG_GEN3_THCODE2 0x54 | ||
42 | #define REG_GEN3_THCODE3 0x58 | ||
43 | |||
44 | /* CTSR bits */ | ||
45 | #define CTSR_PONM BIT(8) | ||
46 | #define CTSR_AOUT BIT(7) | ||
47 | #define CTSR_THBGR BIT(5) | ||
48 | #define CTSR_VMEN BIT(4) | ||
49 | #define CTSR_VMST BIT(1) | ||
50 | #define CTSR_THSST BIT(0) | ||
51 | |||
52 | /* THCTR bits */ | ||
53 | #define THCTR_PONM BIT(6) | ||
54 | #define THCTR_THSST BIT(0) | ||
55 | |||
56 | #define CTEMP_MASK 0xFFF | ||
57 | |||
58 | #define MCELSIUS(temp) ((temp) * 1000) | ||
59 | #define GEN3_FUSE_MASK 0xFFF | ||
60 | |||
61 | #define TSC_MAX_NUM 3 | ||
62 | |||
63 | /* Structure for thermal temperature calculation */ | ||
64 | struct equation_coefs { | ||
65 | int a1; | ||
66 | int b1; | ||
67 | int a2; | ||
68 | int b2; | ||
69 | }; | ||
70 | |||
71 | struct rcar_gen3_thermal_tsc { | ||
72 | void __iomem *base; | ||
73 | struct thermal_zone_device *zone; | ||
74 | struct equation_coefs coef; | ||
75 | struct mutex lock; | ||
76 | }; | ||
77 | |||
78 | struct rcar_gen3_thermal_priv { | ||
79 | struct rcar_gen3_thermal_tsc *tscs[TSC_MAX_NUM]; | ||
80 | }; | ||
81 | |||
82 | struct rcar_gen3_thermal_data { | ||
83 | void (*thermal_init)(struct rcar_gen3_thermal_tsc *tsc); | ||
84 | }; | ||
85 | |||
86 | static inline u32 rcar_gen3_thermal_read(struct rcar_gen3_thermal_tsc *tsc, | ||
87 | u32 reg) | ||
88 | { | ||
89 | return ioread32(tsc->base + reg); | ||
90 | } | ||
91 | |||
92 | static inline void rcar_gen3_thermal_write(struct rcar_gen3_thermal_tsc *tsc, | ||
93 | u32 reg, u32 data) | ||
94 | { | ||
95 | iowrite32(data, tsc->base + reg); | ||
96 | } | ||
97 | |||
98 | /* | ||
99 | * Linear approximation for temperature | ||
100 | * | ||
101 | * [reg] = [temp] * a + b => [temp] = ([reg] - b) / a | ||
102 | * | ||
103 | * The constants a and b are calculated using two triplets of int values PTAT | ||
104 | * and THCODE. PTAT and THCODE can either be read from hardware or use hard | ||
105 | * coded values from driver. The formula to calculate a and b are taken from | ||
106 | * BSP and sparsely documented and understood. | ||
107 | * | ||
108 | * Examining the linear formula and the formula used to calculate constants a | ||
109 | * and b while knowing that the span for PTAT and THCODE values are between | ||
110 | * 0x000 and 0xfff the largest integer possible is 0xfff * 0xfff == 0xffe001. | ||
111 | * Integer also needs to be signed so that leaves 7 bits for binary | ||
112 | * fixed point scaling. | ||
113 | */ | ||
114 | |||
115 | #define FIXPT_SHIFT 7 | ||
116 | #define FIXPT_INT(_x) ((_x) << FIXPT_SHIFT) | ||
117 | #define FIXPT_DIV(_a, _b) DIV_ROUND_CLOSEST(((_a) << FIXPT_SHIFT), (_b)) | ||
118 | #define FIXPT_TO_MCELSIUS(_x) ((_x) * 1000 >> FIXPT_SHIFT) | ||
119 | |||
120 | #define RCAR3_THERMAL_GRAN 500 /* mili Celsius */ | ||
121 | |||
122 | /* no idea where these constants come from */ | ||
123 | #define TJ_1 96 | ||
124 | #define TJ_3 -41 | ||
125 | |||
126 | static void rcar_gen3_thermal_calc_coefs(struct equation_coefs *coef, | ||
127 | int *ptat, int *thcode) | ||
128 | { | ||
129 | int tj_2; | ||
130 | |||
131 | /* TODO: Find documentation and document constant calculation formula */ | ||
132 | |||
133 | /* | ||
134 | * Division is not scaled in BSP and if scaled it might overflow | ||
135 | * the dividend (4095 * 4095 << 14 > INT_MAX) so keep it unscaled | ||
136 | */ | ||
137 | tj_2 = (FIXPT_INT((ptat[1] - ptat[2]) * 137) | ||
138 | / (ptat[0] - ptat[2])) - FIXPT_INT(41); | ||
139 | |||
140 | coef->a1 = FIXPT_DIV(FIXPT_INT(thcode[1] - thcode[2]), | ||
141 | tj_2 - FIXPT_INT(TJ_3)); | ||
142 | coef->b1 = FIXPT_INT(thcode[2]) - coef->a1 * TJ_3; | ||
143 | |||
144 | coef->a2 = FIXPT_DIV(FIXPT_INT(thcode[1] - thcode[0]), | ||
145 | tj_2 - FIXPT_INT(TJ_1)); | ||
146 | coef->b2 = FIXPT_INT(thcode[0]) - coef->a2 * TJ_1; | ||
147 | } | ||
148 | |||
149 | static int rcar_gen3_thermal_round(int temp) | ||
150 | { | ||
151 | int result, round_offs; | ||
152 | |||
153 | round_offs = temp >= 0 ? RCAR3_THERMAL_GRAN / 2 : | ||
154 | -RCAR3_THERMAL_GRAN / 2; | ||
155 | result = (temp + round_offs) / RCAR3_THERMAL_GRAN; | ||
156 | return result * RCAR3_THERMAL_GRAN; | ||
157 | } | ||
158 | |||
159 | static int rcar_gen3_thermal_get_temp(void *devdata, int *temp) | ||
160 | { | ||
161 | struct rcar_gen3_thermal_tsc *tsc = devdata; | ||
162 | int mcelsius, val1, val2; | ||
163 | u32 reg; | ||
164 | |||
165 | /* Read register and convert to mili Celsius */ | ||
166 | mutex_lock(&tsc->lock); | ||
167 | |||
168 | reg = rcar_gen3_thermal_read(tsc, REG_GEN3_TEMP) & CTEMP_MASK; | ||
169 | |||
170 | val1 = FIXPT_DIV(FIXPT_INT(reg) - tsc->coef.b1, tsc->coef.a1); | ||
171 | val2 = FIXPT_DIV(FIXPT_INT(reg) - tsc->coef.b2, tsc->coef.a2); | ||
172 | mcelsius = FIXPT_TO_MCELSIUS((val1 + val2) / 2); | ||
173 | |||
174 | mutex_unlock(&tsc->lock); | ||
175 | |||
176 | /* Make sure we are inside specifications */ | ||
177 | if ((mcelsius < MCELSIUS(-40)) || (mcelsius > MCELSIUS(125))) | ||
178 | return -EIO; | ||
179 | |||
180 | /* Round value to device granularity setting */ | ||
181 | *temp = rcar_gen3_thermal_round(mcelsius); | ||
182 | |||
183 | return 0; | ||
184 | } | ||
185 | |||
186 | static struct thermal_zone_of_device_ops rcar_gen3_tz_of_ops = { | ||
187 | .get_temp = rcar_gen3_thermal_get_temp, | ||
188 | }; | ||
189 | |||
190 | static void r8a7795_thermal_init(struct rcar_gen3_thermal_tsc *tsc) | ||
191 | { | ||
192 | rcar_gen3_thermal_write(tsc, REG_GEN3_CTSR, CTSR_THBGR); | ||
193 | rcar_gen3_thermal_write(tsc, REG_GEN3_CTSR, 0x0); | ||
194 | |||
195 | usleep_range(1000, 2000); | ||
196 | |||
197 | rcar_gen3_thermal_write(tsc, REG_GEN3_CTSR, CTSR_PONM); | ||
198 | rcar_gen3_thermal_write(tsc, REG_GEN3_IRQCTL, 0x3F); | ||
199 | rcar_gen3_thermal_write(tsc, REG_GEN3_CTSR, | ||
200 | CTSR_PONM | CTSR_AOUT | CTSR_THBGR | CTSR_VMEN); | ||
201 | |||
202 | usleep_range(100, 200); | ||
203 | |||
204 | rcar_gen3_thermal_write(tsc, REG_GEN3_CTSR, | ||
205 | CTSR_PONM | CTSR_AOUT | CTSR_THBGR | CTSR_VMEN | | ||
206 | CTSR_VMST | CTSR_THSST); | ||
207 | |||
208 | usleep_range(1000, 2000); | ||
209 | } | ||
210 | |||
211 | static void r8a7796_thermal_init(struct rcar_gen3_thermal_tsc *tsc) | ||
212 | { | ||
213 | u32 reg_val; | ||
214 | |||
215 | reg_val = rcar_gen3_thermal_read(tsc, REG_GEN3_THCTR); | ||
216 | reg_val &= ~THCTR_PONM; | ||
217 | rcar_gen3_thermal_write(tsc, REG_GEN3_THCTR, reg_val); | ||
218 | |||
219 | usleep_range(1000, 2000); | ||
220 | |||
221 | rcar_gen3_thermal_write(tsc, REG_GEN3_IRQCTL, 0x3F); | ||
222 | reg_val = rcar_gen3_thermal_read(tsc, REG_GEN3_THCTR); | ||
223 | reg_val |= THCTR_THSST; | ||
224 | rcar_gen3_thermal_write(tsc, REG_GEN3_THCTR, reg_val); | ||
225 | } | ||
226 | |||
227 | static const struct rcar_gen3_thermal_data r8a7795_data = { | ||
228 | .thermal_init = r8a7795_thermal_init, | ||
229 | }; | ||
230 | |||
231 | static const struct rcar_gen3_thermal_data r8a7796_data = { | ||
232 | .thermal_init = r8a7796_thermal_init, | ||
233 | }; | ||
234 | |||
235 | static const struct of_device_id rcar_gen3_thermal_dt_ids[] = { | ||
236 | { .compatible = "renesas,r8a7795-thermal", .data = &r8a7795_data}, | ||
237 | { .compatible = "renesas,r8a7796-thermal", .data = &r8a7796_data}, | ||
238 | {}, | ||
239 | }; | ||
240 | MODULE_DEVICE_TABLE(of, rcar_gen3_thermal_dt_ids); | ||
241 | |||
242 | static int rcar_gen3_thermal_remove(struct platform_device *pdev) | ||
243 | { | ||
244 | struct device *dev = &pdev->dev; | ||
245 | |||
246 | pm_runtime_put(dev); | ||
247 | pm_runtime_disable(dev); | ||
248 | |||
249 | return 0; | ||
250 | } | ||
251 | |||
252 | static int rcar_gen3_thermal_probe(struct platform_device *pdev) | ||
253 | { | ||
254 | struct rcar_gen3_thermal_priv *priv; | ||
255 | struct device *dev = &pdev->dev; | ||
256 | struct resource *res; | ||
257 | struct thermal_zone_device *zone; | ||
258 | int ret, i; | ||
259 | const struct rcar_gen3_thermal_data *match_data = | ||
260 | of_device_get_match_data(dev); | ||
261 | |||
262 | /* default values if FUSEs are missing */ | ||
263 | /* TODO: Read values from hardware on supported platforms */ | ||
264 | int ptat[3] = { 2351, 1509, 435 }; | ||
265 | int thcode[TSC_MAX_NUM][3] = { | ||
266 | { 3248, 2800, 2221 }, | ||
267 | { 3245, 2795, 2216 }, | ||
268 | { 3250, 2805, 2237 }, | ||
269 | }; | ||
270 | |||
271 | priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); | ||
272 | if (!priv) | ||
273 | return -ENOMEM; | ||
274 | |||
275 | platform_set_drvdata(pdev, priv); | ||
276 | |||
277 | pm_runtime_enable(dev); | ||
278 | pm_runtime_get_sync(dev); | ||
279 | |||
280 | for (i = 0; i < TSC_MAX_NUM; i++) { | ||
281 | struct rcar_gen3_thermal_tsc *tsc; | ||
282 | |||
283 | tsc = devm_kzalloc(dev, sizeof(*tsc), GFP_KERNEL); | ||
284 | if (!tsc) { | ||
285 | ret = -ENOMEM; | ||
286 | goto error_unregister; | ||
287 | } | ||
288 | |||
289 | res = platform_get_resource(pdev, IORESOURCE_MEM, i); | ||
290 | if (!res) | ||
291 | break; | ||
292 | |||
293 | tsc->base = devm_ioremap_resource(dev, res); | ||
294 | if (IS_ERR(tsc->base)) { | ||
295 | ret = PTR_ERR(tsc->base); | ||
296 | goto error_unregister; | ||
297 | } | ||
298 | |||
299 | priv->tscs[i] = tsc; | ||
300 | mutex_init(&tsc->lock); | ||
301 | |||
302 | match_data->thermal_init(tsc); | ||
303 | rcar_gen3_thermal_calc_coefs(&tsc->coef, ptat, thcode[i]); | ||
304 | |||
305 | zone = devm_thermal_zone_of_sensor_register(dev, i, tsc, | ||
306 | &rcar_gen3_tz_of_ops); | ||
307 | if (IS_ERR(zone)) { | ||
308 | dev_err(dev, "Can't register thermal zone\n"); | ||
309 | ret = PTR_ERR(zone); | ||
310 | goto error_unregister; | ||
311 | } | ||
312 | tsc->zone = zone; | ||
313 | } | ||
314 | |||
315 | return 0; | ||
316 | |||
317 | error_unregister: | ||
318 | rcar_gen3_thermal_remove(pdev); | ||
319 | |||
320 | return ret; | ||
321 | } | ||
322 | |||
323 | static struct platform_driver rcar_gen3_thermal_driver = { | ||
324 | .driver = { | ||
325 | .name = "rcar_gen3_thermal", | ||
326 | .of_match_table = rcar_gen3_thermal_dt_ids, | ||
327 | }, | ||
328 | .probe = rcar_gen3_thermal_probe, | ||
329 | .remove = rcar_gen3_thermal_remove, | ||
330 | }; | ||
331 | module_platform_driver(rcar_gen3_thermal_driver); | ||
332 | |||
333 | MODULE_LICENSE("GPL v2"); | ||
334 | MODULE_DESCRIPTION("R-Car Gen3 THS thermal sensor driver"); | ||
335 | MODULE_AUTHOR("Wolfram Sang <wsa+renesas@sang-engineering.com>"); | ||
diff --git a/drivers/thermal/samsung/exynos_tmu.c b/drivers/thermal/samsung/exynos_tmu.c index ad1186dd6132..7b8ef09d2b3c 100644 --- a/drivers/thermal/samsung/exynos_tmu.c +++ b/drivers/thermal/samsung/exynos_tmu.c | |||
@@ -1168,7 +1168,6 @@ static int exynos_of_sensor_conf(struct device_node *np, | |||
1168 | pdata->default_temp_offset = (u8)value; | 1168 | pdata->default_temp_offset = (u8)value; |
1169 | 1169 | ||
1170 | of_property_read_u32(np, "samsung,tmu_cal_type", &pdata->cal_type); | 1170 | of_property_read_u32(np, "samsung,tmu_cal_type", &pdata->cal_type); |
1171 | of_property_read_u32(np, "samsung,tmu_cal_mode", &pdata->cal_mode); | ||
1172 | 1171 | ||
1173 | of_node_put(np); | 1172 | of_node_put(np); |
1174 | return 0; | 1173 | return 0; |
diff --git a/drivers/thermal/samsung/exynos_tmu.h b/drivers/thermal/samsung/exynos_tmu.h index 440c7140b660..5149c2a3030c 100644 --- a/drivers/thermal/samsung/exynos_tmu.h +++ b/drivers/thermal/samsung/exynos_tmu.h | |||
@@ -70,7 +70,6 @@ struct exynos_tmu_platform_data { | |||
70 | 70 | ||
71 | enum soc_type type; | 71 | enum soc_type type; |
72 | u32 cal_type; | 72 | u32 cal_type; |
73 | u32 cal_mode; | ||
74 | }; | 73 | }; |
75 | 74 | ||
76 | #endif /* _EXYNOS_TMU_H */ | 75 | #endif /* _EXYNOS_TMU_H */ |
diff --git a/drivers/thermal/thermal_core.c b/drivers/thermal/thermal_core.c index 655591316a88..11f0675cb7e5 100644 --- a/drivers/thermal/thermal_core.c +++ b/drivers/thermal/thermal_core.c | |||
@@ -36,9 +36,8 @@ MODULE_AUTHOR("Zhang Rui"); | |||
36 | MODULE_DESCRIPTION("Generic thermal management sysfs support"); | 36 | MODULE_DESCRIPTION("Generic thermal management sysfs support"); |
37 | MODULE_LICENSE("GPL v2"); | 37 | MODULE_LICENSE("GPL v2"); |
38 | 38 | ||
39 | static DEFINE_IDR(thermal_tz_idr); | 39 | static DEFINE_IDA(thermal_tz_ida); |
40 | static DEFINE_IDR(thermal_cdev_idr); | 40 | static DEFINE_IDA(thermal_cdev_ida); |
41 | static DEFINE_MUTEX(thermal_idr_lock); | ||
42 | 41 | ||
43 | static LIST_HEAD(thermal_tz_list); | 42 | static LIST_HEAD(thermal_tz_list); |
44 | static LIST_HEAD(thermal_cdev_list); | 43 | static LIST_HEAD(thermal_cdev_list); |
@@ -589,29 +588,6 @@ void thermal_zone_device_unbind_exception(struct thermal_zone_device *tz, | |||
589 | * - thermal zone devices lifecycle: registration, unregistration, | 588 | * - thermal zone devices lifecycle: registration, unregistration, |
590 | * binding, and unbinding. | 589 | * binding, and unbinding. |
591 | */ | 590 | */ |
592 | static int get_idr(struct idr *idr, struct mutex *lock, int *id) | ||
593 | { | ||
594 | int ret; | ||
595 | |||
596 | if (lock) | ||
597 | mutex_lock(lock); | ||
598 | ret = idr_alloc(idr, NULL, 0, 0, GFP_KERNEL); | ||
599 | if (lock) | ||
600 | mutex_unlock(lock); | ||
601 | if (unlikely(ret < 0)) | ||
602 | return ret; | ||
603 | *id = ret; | ||
604 | return 0; | ||
605 | } | ||
606 | |||
607 | static void release_idr(struct idr *idr, struct mutex *lock, int id) | ||
608 | { | ||
609 | if (lock) | ||
610 | mutex_lock(lock); | ||
611 | idr_remove(idr, id); | ||
612 | if (lock) | ||
613 | mutex_unlock(lock); | ||
614 | } | ||
615 | 591 | ||
616 | /** | 592 | /** |
617 | * thermal_zone_bind_cooling_device() - bind a cooling device to a thermal zone | 593 | * thermal_zone_bind_cooling_device() - bind a cooling device to a thermal zone |
@@ -685,15 +661,16 @@ int thermal_zone_bind_cooling_device(struct thermal_zone_device *tz, | |||
685 | dev->target = THERMAL_NO_TARGET; | 661 | dev->target = THERMAL_NO_TARGET; |
686 | dev->weight = weight; | 662 | dev->weight = weight; |
687 | 663 | ||
688 | result = get_idr(&tz->idr, &tz->lock, &dev->id); | 664 | result = ida_simple_get(&tz->ida, 0, 0, GFP_KERNEL); |
689 | if (result) | 665 | if (result < 0) |
690 | goto free_mem; | 666 | goto free_mem; |
691 | 667 | ||
668 | dev->id = result; | ||
692 | sprintf(dev->name, "cdev%d", dev->id); | 669 | sprintf(dev->name, "cdev%d", dev->id); |
693 | result = | 670 | result = |
694 | sysfs_create_link(&tz->device.kobj, &cdev->device.kobj, dev->name); | 671 | sysfs_create_link(&tz->device.kobj, &cdev->device.kobj, dev->name); |
695 | if (result) | 672 | if (result) |
696 | goto release_idr; | 673 | goto release_ida; |
697 | 674 | ||
698 | sprintf(dev->attr_name, "cdev%d_trip_point", dev->id); | 675 | sprintf(dev->attr_name, "cdev%d_trip_point", dev->id); |
699 | sysfs_attr_init(&dev->attr.attr); | 676 | sysfs_attr_init(&dev->attr.attr); |
@@ -737,8 +714,8 @@ remove_trip_file: | |||
737 | device_remove_file(&tz->device, &dev->attr); | 714 | device_remove_file(&tz->device, &dev->attr); |
738 | remove_symbol_link: | 715 | remove_symbol_link: |
739 | sysfs_remove_link(&tz->device.kobj, dev->name); | 716 | sysfs_remove_link(&tz->device.kobj, dev->name); |
740 | release_idr: | 717 | release_ida: |
741 | release_idr(&tz->idr, &tz->lock, dev->id); | 718 | ida_simple_remove(&tz->ida, dev->id); |
742 | free_mem: | 719 | free_mem: |
743 | kfree(dev); | 720 | kfree(dev); |
744 | return result; | 721 | return result; |
@@ -785,7 +762,7 @@ unbind: | |||
785 | device_remove_file(&tz->device, &pos->weight_attr); | 762 | device_remove_file(&tz->device, &pos->weight_attr); |
786 | device_remove_file(&tz->device, &pos->attr); | 763 | device_remove_file(&tz->device, &pos->attr); |
787 | sysfs_remove_link(&tz->device.kobj, pos->name); | 764 | sysfs_remove_link(&tz->device.kobj, pos->name); |
788 | release_idr(&tz->idr, &tz->lock, pos->id); | 765 | ida_simple_remove(&tz->ida, pos->id); |
789 | kfree(pos); | 766 | kfree(pos); |
790 | return 0; | 767 | return 0; |
791 | } | 768 | } |
@@ -925,12 +902,13 @@ __thermal_cooling_device_register(struct device_node *np, | |||
925 | if (!cdev) | 902 | if (!cdev) |
926 | return ERR_PTR(-ENOMEM); | 903 | return ERR_PTR(-ENOMEM); |
927 | 904 | ||
928 | result = get_idr(&thermal_cdev_idr, &thermal_idr_lock, &cdev->id); | 905 | result = ida_simple_get(&thermal_cdev_ida, 0, 0, GFP_KERNEL); |
929 | if (result) { | 906 | if (result < 0) { |
930 | kfree(cdev); | 907 | kfree(cdev); |
931 | return ERR_PTR(result); | 908 | return ERR_PTR(result); |
932 | } | 909 | } |
933 | 910 | ||
911 | cdev->id = result; | ||
934 | strlcpy(cdev->type, type ? : "", sizeof(cdev->type)); | 912 | strlcpy(cdev->type, type ? : "", sizeof(cdev->type)); |
935 | mutex_init(&cdev->lock); | 913 | mutex_init(&cdev->lock); |
936 | INIT_LIST_HEAD(&cdev->thermal_instances); | 914 | INIT_LIST_HEAD(&cdev->thermal_instances); |
@@ -943,7 +921,7 @@ __thermal_cooling_device_register(struct device_node *np, | |||
943 | dev_set_name(&cdev->device, "cooling_device%d", cdev->id); | 921 | dev_set_name(&cdev->device, "cooling_device%d", cdev->id); |
944 | result = device_register(&cdev->device); | 922 | result = device_register(&cdev->device); |
945 | if (result) { | 923 | if (result) { |
946 | release_idr(&thermal_cdev_idr, &thermal_idr_lock, cdev->id); | 924 | ida_simple_remove(&thermal_cdev_ida, cdev->id); |
947 | kfree(cdev); | 925 | kfree(cdev); |
948 | return ERR_PTR(result); | 926 | return ERR_PTR(result); |
949 | } | 927 | } |
@@ -1070,7 +1048,7 @@ void thermal_cooling_device_unregister(struct thermal_cooling_device *cdev) | |||
1070 | 1048 | ||
1071 | mutex_unlock(&thermal_list_lock); | 1049 | mutex_unlock(&thermal_list_lock); |
1072 | 1050 | ||
1073 | release_idr(&thermal_cdev_idr, &thermal_idr_lock, cdev->id); | 1051 | ida_simple_remove(&thermal_cdev_ida, cdev->id); |
1074 | device_unregister(&cdev->device); | 1052 | device_unregister(&cdev->device); |
1075 | } | 1053 | } |
1076 | EXPORT_SYMBOL_GPL(thermal_cooling_device_unregister); | 1054 | EXPORT_SYMBOL_GPL(thermal_cooling_device_unregister); |
@@ -1172,14 +1150,15 @@ thermal_zone_device_register(const char *type, int trips, int mask, | |||
1172 | return ERR_PTR(-ENOMEM); | 1150 | return ERR_PTR(-ENOMEM); |
1173 | 1151 | ||
1174 | INIT_LIST_HEAD(&tz->thermal_instances); | 1152 | INIT_LIST_HEAD(&tz->thermal_instances); |
1175 | idr_init(&tz->idr); | 1153 | ida_init(&tz->ida); |
1176 | mutex_init(&tz->lock); | 1154 | mutex_init(&tz->lock); |
1177 | result = get_idr(&thermal_tz_idr, &thermal_idr_lock, &tz->id); | 1155 | result = ida_simple_get(&thermal_tz_ida, 0, 0, GFP_KERNEL); |
1178 | if (result) { | 1156 | if (result < 0) { |
1179 | kfree(tz); | 1157 | kfree(tz); |
1180 | return ERR_PTR(result); | 1158 | return ERR_PTR(result); |
1181 | } | 1159 | } |
1182 | 1160 | ||
1161 | tz->id = result; | ||
1183 | strlcpy(tz->type, type, sizeof(tz->type)); | 1162 | strlcpy(tz->type, type, sizeof(tz->type)); |
1184 | tz->ops = ops; | 1163 | tz->ops = ops; |
1185 | tz->tzp = tzp; | 1164 | tz->tzp = tzp; |
@@ -1201,7 +1180,7 @@ thermal_zone_device_register(const char *type, int trips, int mask, | |||
1201 | dev_set_name(&tz->device, "thermal_zone%d", tz->id); | 1180 | dev_set_name(&tz->device, "thermal_zone%d", tz->id); |
1202 | result = device_register(&tz->device); | 1181 | result = device_register(&tz->device); |
1203 | if (result) { | 1182 | if (result) { |
1204 | release_idr(&thermal_tz_idr, &thermal_idr_lock, tz->id); | 1183 | ida_simple_remove(&thermal_tz_ida, tz->id); |
1205 | kfree(tz); | 1184 | kfree(tz); |
1206 | return ERR_PTR(result); | 1185 | return ERR_PTR(result); |
1207 | } | 1186 | } |
@@ -1255,7 +1234,7 @@ thermal_zone_device_register(const char *type, int trips, int mask, | |||
1255 | return tz; | 1234 | return tz; |
1256 | 1235 | ||
1257 | unregister: | 1236 | unregister: |
1258 | release_idr(&thermal_tz_idr, &thermal_idr_lock, tz->id); | 1237 | ida_simple_remove(&thermal_tz_ida, tz->id); |
1259 | device_unregister(&tz->device); | 1238 | device_unregister(&tz->device); |
1260 | return ERR_PTR(result); | 1239 | return ERR_PTR(result); |
1261 | } | 1240 | } |
@@ -1313,8 +1292,8 @@ void thermal_zone_device_unregister(struct thermal_zone_device *tz) | |||
1313 | thermal_set_governor(tz, NULL); | 1292 | thermal_set_governor(tz, NULL); |
1314 | 1293 | ||
1315 | thermal_remove_hwmon_sysfs(tz); | 1294 | thermal_remove_hwmon_sysfs(tz); |
1316 | release_idr(&thermal_tz_idr, &thermal_idr_lock, tz->id); | 1295 | ida_simple_remove(&thermal_tz_ida, tz->id); |
1317 | idr_destroy(&tz->idr); | 1296 | ida_destroy(&tz->ida); |
1318 | mutex_destroy(&tz->lock); | 1297 | mutex_destroy(&tz->lock); |
1319 | device_unregister(&tz->device); | 1298 | device_unregister(&tz->device); |
1320 | } | 1299 | } |
@@ -1514,9 +1493,8 @@ unregister_class: | |||
1514 | unregister_governors: | 1493 | unregister_governors: |
1515 | thermal_unregister_governors(); | 1494 | thermal_unregister_governors(); |
1516 | error: | 1495 | error: |
1517 | idr_destroy(&thermal_tz_idr); | 1496 | ida_destroy(&thermal_tz_ida); |
1518 | idr_destroy(&thermal_cdev_idr); | 1497 | ida_destroy(&thermal_cdev_ida); |
1519 | mutex_destroy(&thermal_idr_lock); | ||
1520 | mutex_destroy(&thermal_list_lock); | 1498 | mutex_destroy(&thermal_list_lock); |
1521 | mutex_destroy(&thermal_governor_lock); | 1499 | mutex_destroy(&thermal_governor_lock); |
1522 | return result; | 1500 | return result; |
@@ -1529,9 +1507,8 @@ static void __exit thermal_exit(void) | |||
1529 | genetlink_exit(); | 1507 | genetlink_exit(); |
1530 | class_unregister(&thermal_class); | 1508 | class_unregister(&thermal_class); |
1531 | thermal_unregister_governors(); | 1509 | thermal_unregister_governors(); |
1532 | idr_destroy(&thermal_tz_idr); | 1510 | ida_destroy(&thermal_tz_ida); |
1533 | idr_destroy(&thermal_cdev_idr); | 1511 | ida_destroy(&thermal_cdev_ida); |
1534 | mutex_destroy(&thermal_idr_lock); | ||
1535 | mutex_destroy(&thermal_list_lock); | 1512 | mutex_destroy(&thermal_list_lock); |
1536 | mutex_destroy(&thermal_governor_lock); | 1513 | mutex_destroy(&thermal_governor_lock); |
1537 | } | 1514 | } |
diff --git a/drivers/thermal/ti-soc-thermal/Kconfig b/drivers/thermal/ti-soc-thermal/Kconfig index ea8283f08aa6..fe0e877f84d0 100644 --- a/drivers/thermal/ti-soc-thermal/Kconfig +++ b/drivers/thermal/ti-soc-thermal/Kconfig | |||
@@ -11,7 +11,6 @@ config TI_SOC_THERMAL | |||
11 | config TI_THERMAL | 11 | config TI_THERMAL |
12 | bool "Texas Instruments SoCs thermal framework support" | 12 | bool "Texas Instruments SoCs thermal framework support" |
13 | depends on TI_SOC_THERMAL | 13 | depends on TI_SOC_THERMAL |
14 | depends on CPU_THERMAL | ||
15 | help | 14 | help |
16 | If you say yes here you want to get support for generic thermal | 15 | If you say yes here you want to get support for generic thermal |
17 | framework for the Texas Instruments on die bandgap temperature sensor. | 16 | framework for the Texas Instruments on die bandgap temperature sensor. |
diff --git a/drivers/thermal/ti-soc-thermal/dra752-bandgap.h b/drivers/thermal/ti-soc-thermal/dra752-bandgap.h index 6b0f2b1160f7..a31e4b5e82cd 100644 --- a/drivers/thermal/ti-soc-thermal/dra752-bandgap.h +++ b/drivers/thermal/ti-soc-thermal/dra752-bandgap.h | |||
@@ -54,7 +54,6 @@ | |||
54 | #define DRA752_STD_FUSE_OPP_BGAP_CORE_OFFSET 0x8 | 54 | #define DRA752_STD_FUSE_OPP_BGAP_CORE_OFFSET 0x8 |
55 | #define DRA752_TEMP_SENSOR_CORE_OFFSET 0x154 | 55 | #define DRA752_TEMP_SENSOR_CORE_OFFSET 0x154 |
56 | #define DRA752_BANDGAP_THRESHOLD_CORE_OFFSET 0x1ac | 56 | #define DRA752_BANDGAP_THRESHOLD_CORE_OFFSET 0x1ac |
57 | #define DRA752_BANDGAP_TSHUT_CORE_OFFSET 0x1b8 | ||
58 | #define DRA752_BANDGAP_CUMUL_DTEMP_CORE_OFFSET 0x1c4 | 57 | #define DRA752_BANDGAP_CUMUL_DTEMP_CORE_OFFSET 0x1c4 |
59 | #define DRA752_DTEMP_CORE_0_OFFSET 0x208 | 58 | #define DRA752_DTEMP_CORE_0_OFFSET 0x208 |
60 | #define DRA752_DTEMP_CORE_1_OFFSET 0x20c | 59 | #define DRA752_DTEMP_CORE_1_OFFSET 0x20c |
@@ -66,7 +65,6 @@ | |||
66 | #define DRA752_STD_FUSE_OPP_BGAP_IVA_OFFSET 0x388 | 65 | #define DRA752_STD_FUSE_OPP_BGAP_IVA_OFFSET 0x388 |
67 | #define DRA752_TEMP_SENSOR_IVA_OFFSET 0x398 | 66 | #define DRA752_TEMP_SENSOR_IVA_OFFSET 0x398 |
68 | #define DRA752_BANDGAP_THRESHOLD_IVA_OFFSET 0x3a4 | 67 | #define DRA752_BANDGAP_THRESHOLD_IVA_OFFSET 0x3a4 |
69 | #define DRA752_BANDGAP_TSHUT_IVA_OFFSET 0x3ac | ||
70 | #define DRA752_BANDGAP_CUMUL_DTEMP_IVA_OFFSET 0x3b4 | 68 | #define DRA752_BANDGAP_CUMUL_DTEMP_IVA_OFFSET 0x3b4 |
71 | #define DRA752_DTEMP_IVA_0_OFFSET 0x3d0 | 69 | #define DRA752_DTEMP_IVA_0_OFFSET 0x3d0 |
72 | #define DRA752_DTEMP_IVA_1_OFFSET 0x3d4 | 70 | #define DRA752_DTEMP_IVA_1_OFFSET 0x3d4 |
@@ -78,7 +76,6 @@ | |||
78 | #define DRA752_STD_FUSE_OPP_BGAP_MPU_OFFSET 0x4 | 76 | #define DRA752_STD_FUSE_OPP_BGAP_MPU_OFFSET 0x4 |
79 | #define DRA752_TEMP_SENSOR_MPU_OFFSET 0x14c | 77 | #define DRA752_TEMP_SENSOR_MPU_OFFSET 0x14c |
80 | #define DRA752_BANDGAP_THRESHOLD_MPU_OFFSET 0x1a4 | 78 | #define DRA752_BANDGAP_THRESHOLD_MPU_OFFSET 0x1a4 |
81 | #define DRA752_BANDGAP_TSHUT_MPU_OFFSET 0x1b0 | ||
82 | #define DRA752_BANDGAP_CUMUL_DTEMP_MPU_OFFSET 0x1bc | 79 | #define DRA752_BANDGAP_CUMUL_DTEMP_MPU_OFFSET 0x1bc |
83 | #define DRA752_DTEMP_MPU_0_OFFSET 0x1e0 | 80 | #define DRA752_DTEMP_MPU_0_OFFSET 0x1e0 |
84 | #define DRA752_DTEMP_MPU_1_OFFSET 0x1e4 | 81 | #define DRA752_DTEMP_MPU_1_OFFSET 0x1e4 |
@@ -90,7 +87,6 @@ | |||
90 | #define DRA752_STD_FUSE_OPP_BGAP_DSPEVE_OFFSET 0x384 | 87 | #define DRA752_STD_FUSE_OPP_BGAP_DSPEVE_OFFSET 0x384 |
91 | #define DRA752_TEMP_SENSOR_DSPEVE_OFFSET 0x394 | 88 | #define DRA752_TEMP_SENSOR_DSPEVE_OFFSET 0x394 |
92 | #define DRA752_BANDGAP_THRESHOLD_DSPEVE_OFFSET 0x3a0 | 89 | #define DRA752_BANDGAP_THRESHOLD_DSPEVE_OFFSET 0x3a0 |
93 | #define DRA752_BANDGAP_TSHUT_DSPEVE_OFFSET 0x3a8 | ||
94 | #define DRA752_BANDGAP_CUMUL_DTEMP_DSPEVE_OFFSET 0x3b0 | 90 | #define DRA752_BANDGAP_CUMUL_DTEMP_DSPEVE_OFFSET 0x3b0 |
95 | #define DRA752_DTEMP_DSPEVE_0_OFFSET 0x3bc | 91 | #define DRA752_DTEMP_DSPEVE_0_OFFSET 0x3bc |
96 | #define DRA752_DTEMP_DSPEVE_1_OFFSET 0x3c0 | 92 | #define DRA752_DTEMP_DSPEVE_1_OFFSET 0x3c0 |
@@ -102,7 +98,6 @@ | |||
102 | #define DRA752_STD_FUSE_OPP_BGAP_GPU_OFFSET 0x0 | 98 | #define DRA752_STD_FUSE_OPP_BGAP_GPU_OFFSET 0x0 |
103 | #define DRA752_TEMP_SENSOR_GPU_OFFSET 0x150 | 99 | #define DRA752_TEMP_SENSOR_GPU_OFFSET 0x150 |
104 | #define DRA752_BANDGAP_THRESHOLD_GPU_OFFSET 0x1a8 | 100 | #define DRA752_BANDGAP_THRESHOLD_GPU_OFFSET 0x1a8 |
105 | #define DRA752_BANDGAP_TSHUT_GPU_OFFSET 0x1b4 | ||
106 | #define DRA752_BANDGAP_CUMUL_DTEMP_GPU_OFFSET 0x1c0 | 101 | #define DRA752_BANDGAP_CUMUL_DTEMP_GPU_OFFSET 0x1c0 |
107 | #define DRA752_DTEMP_GPU_0_OFFSET 0x1f4 | 102 | #define DRA752_DTEMP_GPU_0_OFFSET 0x1f4 |
108 | #define DRA752_DTEMP_GPU_1_OFFSET 0x1f8 | 103 | #define DRA752_DTEMP_GPU_1_OFFSET 0x1f8 |
@@ -173,10 +168,6 @@ | |||
173 | #define DRA752_BANDGAP_THRESHOLD_HOT_MASK (0x3ff << 16) | 168 | #define DRA752_BANDGAP_THRESHOLD_HOT_MASK (0x3ff << 16) |
174 | #define DRA752_BANDGAP_THRESHOLD_COLD_MASK (0x3ff << 0) | 169 | #define DRA752_BANDGAP_THRESHOLD_COLD_MASK (0x3ff << 0) |
175 | 170 | ||
176 | /* DRA752.TSHUT_THRESHOLD */ | ||
177 | #define DRA752_TSHUT_THRESHOLD_MUXCTRL_MASK BIT(31) | ||
178 | #define DRA752_TSHUT_THRESHOLD_HOT_MASK (0x3ff << 16) | ||
179 | #define DRA752_TSHUT_THRESHOLD_COLD_MASK (0x3ff << 0) | ||
180 | 171 | ||
181 | /* DRA752.BANDGAP_CUMUL_DTEMP_CORE */ | 172 | /* DRA752.BANDGAP_CUMUL_DTEMP_CORE */ |
182 | #define DRA752_BANDGAP_CUMUL_DTEMP_CORE_MASK (0xffffffff << 0) | 173 | #define DRA752_BANDGAP_CUMUL_DTEMP_CORE_MASK (0xffffffff << 0) |
@@ -216,8 +207,6 @@ | |||
216 | #define DRA752_GPU_MAX_TEMP 125000 | 207 | #define DRA752_GPU_MAX_TEMP 125000 |
217 | #define DRA752_GPU_HYST_VAL 5000 | 208 | #define DRA752_GPU_HYST_VAL 5000 |
218 | /* interrupts thresholds */ | 209 | /* interrupts thresholds */ |
219 | #define DRA752_GPU_TSHUT_HOT 915 | ||
220 | #define DRA752_GPU_TSHUT_COLD 900 | ||
221 | #define DRA752_GPU_T_HOT 800 | 210 | #define DRA752_GPU_T_HOT 800 |
222 | #define DRA752_GPU_T_COLD 795 | 211 | #define DRA752_GPU_T_COLD 795 |
223 | 212 | ||
@@ -230,8 +219,6 @@ | |||
230 | #define DRA752_MPU_MAX_TEMP 125000 | 219 | #define DRA752_MPU_MAX_TEMP 125000 |
231 | #define DRA752_MPU_HYST_VAL 5000 | 220 | #define DRA752_MPU_HYST_VAL 5000 |
232 | /* interrupts thresholds */ | 221 | /* interrupts thresholds */ |
233 | #define DRA752_MPU_TSHUT_HOT 915 | ||
234 | #define DRA752_MPU_TSHUT_COLD 900 | ||
235 | #define DRA752_MPU_T_HOT 800 | 222 | #define DRA752_MPU_T_HOT 800 |
236 | #define DRA752_MPU_T_COLD 795 | 223 | #define DRA752_MPU_T_COLD 795 |
237 | 224 | ||
@@ -244,8 +231,6 @@ | |||
244 | #define DRA752_CORE_MAX_TEMP 125000 | 231 | #define DRA752_CORE_MAX_TEMP 125000 |
245 | #define DRA752_CORE_HYST_VAL 5000 | 232 | #define DRA752_CORE_HYST_VAL 5000 |
246 | /* interrupts thresholds */ | 233 | /* interrupts thresholds */ |
247 | #define DRA752_CORE_TSHUT_HOT 915 | ||
248 | #define DRA752_CORE_TSHUT_COLD 900 | ||
249 | #define DRA752_CORE_T_HOT 800 | 234 | #define DRA752_CORE_T_HOT 800 |
250 | #define DRA752_CORE_T_COLD 795 | 235 | #define DRA752_CORE_T_COLD 795 |
251 | 236 | ||
@@ -258,8 +243,6 @@ | |||
258 | #define DRA752_DSPEVE_MAX_TEMP 125000 | 243 | #define DRA752_DSPEVE_MAX_TEMP 125000 |
259 | #define DRA752_DSPEVE_HYST_VAL 5000 | 244 | #define DRA752_DSPEVE_HYST_VAL 5000 |
260 | /* interrupts thresholds */ | 245 | /* interrupts thresholds */ |
261 | #define DRA752_DSPEVE_TSHUT_HOT 915 | ||
262 | #define DRA752_DSPEVE_TSHUT_COLD 900 | ||
263 | #define DRA752_DSPEVE_T_HOT 800 | 246 | #define DRA752_DSPEVE_T_HOT 800 |
264 | #define DRA752_DSPEVE_T_COLD 795 | 247 | #define DRA752_DSPEVE_T_COLD 795 |
265 | 248 | ||
@@ -272,8 +255,6 @@ | |||
272 | #define DRA752_IVA_MAX_TEMP 125000 | 255 | #define DRA752_IVA_MAX_TEMP 125000 |
273 | #define DRA752_IVA_HYST_VAL 5000 | 256 | #define DRA752_IVA_HYST_VAL 5000 |
274 | /* interrupts thresholds */ | 257 | /* interrupts thresholds */ |
275 | #define DRA752_IVA_TSHUT_HOT 915 | ||
276 | #define DRA752_IVA_TSHUT_COLD 900 | ||
277 | #define DRA752_IVA_T_HOT 800 | 258 | #define DRA752_IVA_T_HOT 800 |
278 | #define DRA752_IVA_T_COLD 795 | 259 | #define DRA752_IVA_T_COLD 795 |
279 | 260 | ||
diff --git a/drivers/thermal/ti-soc-thermal/dra752-thermal-data.c b/drivers/thermal/ti-soc-thermal/dra752-thermal-data.c index 58b5c6694cd4..118d7d847715 100644 --- a/drivers/thermal/ti-soc-thermal/dra752-thermal-data.c +++ b/drivers/thermal/ti-soc-thermal/dra752-thermal-data.c | |||
@@ -49,9 +49,6 @@ dra752_core_temp_sensor_registers = { | |||
49 | .bgap_threshold = DRA752_BANDGAP_THRESHOLD_CORE_OFFSET, | 49 | .bgap_threshold = DRA752_BANDGAP_THRESHOLD_CORE_OFFSET, |
50 | .threshold_thot_mask = DRA752_BANDGAP_THRESHOLD_HOT_MASK, | 50 | .threshold_thot_mask = DRA752_BANDGAP_THRESHOLD_HOT_MASK, |
51 | .threshold_tcold_mask = DRA752_BANDGAP_THRESHOLD_COLD_MASK, | 51 | .threshold_tcold_mask = DRA752_BANDGAP_THRESHOLD_COLD_MASK, |
52 | .tshut_threshold = DRA752_BANDGAP_TSHUT_CORE_OFFSET, | ||
53 | .tshut_hot_mask = DRA752_TSHUT_THRESHOLD_HOT_MASK, | ||
54 | .tshut_cold_mask = DRA752_TSHUT_THRESHOLD_COLD_MASK, | ||
55 | .bgap_status = DRA752_BANDGAP_STATUS_1_OFFSET, | 52 | .bgap_status = DRA752_BANDGAP_STATUS_1_OFFSET, |
56 | .status_bgap_alert_mask = DRA752_BANDGAP_STATUS_1_ALERT_MASK, | 53 | .status_bgap_alert_mask = DRA752_BANDGAP_STATUS_1_ALERT_MASK, |
57 | .status_hot_mask = DRA752_BANDGAP_STATUS_1_HOT_CORE_MASK, | 54 | .status_hot_mask = DRA752_BANDGAP_STATUS_1_HOT_CORE_MASK, |
@@ -85,9 +82,6 @@ dra752_iva_temp_sensor_registers = { | |||
85 | .bgap_threshold = DRA752_BANDGAP_THRESHOLD_IVA_OFFSET, | 82 | .bgap_threshold = DRA752_BANDGAP_THRESHOLD_IVA_OFFSET, |
86 | .threshold_thot_mask = DRA752_BANDGAP_THRESHOLD_HOT_MASK, | 83 | .threshold_thot_mask = DRA752_BANDGAP_THRESHOLD_HOT_MASK, |
87 | .threshold_tcold_mask = DRA752_BANDGAP_THRESHOLD_COLD_MASK, | 84 | .threshold_tcold_mask = DRA752_BANDGAP_THRESHOLD_COLD_MASK, |
88 | .tshut_threshold = DRA752_BANDGAP_TSHUT_IVA_OFFSET, | ||
89 | .tshut_hot_mask = DRA752_TSHUT_THRESHOLD_HOT_MASK, | ||
90 | .tshut_cold_mask = DRA752_TSHUT_THRESHOLD_COLD_MASK, | ||
91 | .bgap_status = DRA752_BANDGAP_STATUS_2_OFFSET, | 85 | .bgap_status = DRA752_BANDGAP_STATUS_2_OFFSET, |
92 | .status_bgap_alert_mask = DRA752_BANDGAP_STATUS_1_ALERT_MASK, | 86 | .status_bgap_alert_mask = DRA752_BANDGAP_STATUS_1_ALERT_MASK, |
93 | .status_hot_mask = DRA752_BANDGAP_STATUS_2_HOT_IVA_MASK, | 87 | .status_hot_mask = DRA752_BANDGAP_STATUS_2_HOT_IVA_MASK, |
@@ -121,9 +115,6 @@ dra752_mpu_temp_sensor_registers = { | |||
121 | .bgap_threshold = DRA752_BANDGAP_THRESHOLD_MPU_OFFSET, | 115 | .bgap_threshold = DRA752_BANDGAP_THRESHOLD_MPU_OFFSET, |
122 | .threshold_thot_mask = DRA752_BANDGAP_THRESHOLD_HOT_MASK, | 116 | .threshold_thot_mask = DRA752_BANDGAP_THRESHOLD_HOT_MASK, |
123 | .threshold_tcold_mask = DRA752_BANDGAP_THRESHOLD_COLD_MASK, | 117 | .threshold_tcold_mask = DRA752_BANDGAP_THRESHOLD_COLD_MASK, |
124 | .tshut_threshold = DRA752_BANDGAP_TSHUT_MPU_OFFSET, | ||
125 | .tshut_hot_mask = DRA752_TSHUT_THRESHOLD_HOT_MASK, | ||
126 | .tshut_cold_mask = DRA752_TSHUT_THRESHOLD_COLD_MASK, | ||
127 | .bgap_status = DRA752_BANDGAP_STATUS_1_OFFSET, | 118 | .bgap_status = DRA752_BANDGAP_STATUS_1_OFFSET, |
128 | .status_bgap_alert_mask = DRA752_BANDGAP_STATUS_1_ALERT_MASK, | 119 | .status_bgap_alert_mask = DRA752_BANDGAP_STATUS_1_ALERT_MASK, |
129 | .status_hot_mask = DRA752_BANDGAP_STATUS_1_HOT_MPU_MASK, | 120 | .status_hot_mask = DRA752_BANDGAP_STATUS_1_HOT_MPU_MASK, |
@@ -157,9 +148,6 @@ dra752_dspeve_temp_sensor_registers = { | |||
157 | .bgap_threshold = DRA752_BANDGAP_THRESHOLD_DSPEVE_OFFSET, | 148 | .bgap_threshold = DRA752_BANDGAP_THRESHOLD_DSPEVE_OFFSET, |
158 | .threshold_thot_mask = DRA752_BANDGAP_THRESHOLD_HOT_MASK, | 149 | .threshold_thot_mask = DRA752_BANDGAP_THRESHOLD_HOT_MASK, |
159 | .threshold_tcold_mask = DRA752_BANDGAP_THRESHOLD_COLD_MASK, | 150 | .threshold_tcold_mask = DRA752_BANDGAP_THRESHOLD_COLD_MASK, |
160 | .tshut_threshold = DRA752_BANDGAP_TSHUT_DSPEVE_OFFSET, | ||
161 | .tshut_hot_mask = DRA752_TSHUT_THRESHOLD_HOT_MASK, | ||
162 | .tshut_cold_mask = DRA752_TSHUT_THRESHOLD_COLD_MASK, | ||
163 | .bgap_status = DRA752_BANDGAP_STATUS_2_OFFSET, | 151 | .bgap_status = DRA752_BANDGAP_STATUS_2_OFFSET, |
164 | .status_bgap_alert_mask = DRA752_BANDGAP_STATUS_1_ALERT_MASK, | 152 | .status_bgap_alert_mask = DRA752_BANDGAP_STATUS_1_ALERT_MASK, |
165 | .status_hot_mask = DRA752_BANDGAP_STATUS_2_HOT_DSPEVE_MASK, | 153 | .status_hot_mask = DRA752_BANDGAP_STATUS_2_HOT_DSPEVE_MASK, |
@@ -193,9 +181,6 @@ dra752_gpu_temp_sensor_registers = { | |||
193 | .bgap_threshold = DRA752_BANDGAP_THRESHOLD_GPU_OFFSET, | 181 | .bgap_threshold = DRA752_BANDGAP_THRESHOLD_GPU_OFFSET, |
194 | .threshold_thot_mask = DRA752_BANDGAP_THRESHOLD_HOT_MASK, | 182 | .threshold_thot_mask = DRA752_BANDGAP_THRESHOLD_HOT_MASK, |
195 | .threshold_tcold_mask = DRA752_BANDGAP_THRESHOLD_COLD_MASK, | 183 | .threshold_tcold_mask = DRA752_BANDGAP_THRESHOLD_COLD_MASK, |
196 | .tshut_threshold = DRA752_BANDGAP_TSHUT_GPU_OFFSET, | ||
197 | .tshut_hot_mask = DRA752_TSHUT_THRESHOLD_HOT_MASK, | ||
198 | .tshut_cold_mask = DRA752_TSHUT_THRESHOLD_COLD_MASK, | ||
199 | .bgap_status = DRA752_BANDGAP_STATUS_1_OFFSET, | 184 | .bgap_status = DRA752_BANDGAP_STATUS_1_OFFSET, |
200 | .status_bgap_alert_mask = DRA752_BANDGAP_STATUS_1_ALERT_MASK, | 185 | .status_bgap_alert_mask = DRA752_BANDGAP_STATUS_1_ALERT_MASK, |
201 | .status_hot_mask = DRA752_BANDGAP_STATUS_1_HOT_GPU_MASK, | 186 | .status_hot_mask = DRA752_BANDGAP_STATUS_1_HOT_GPU_MASK, |
@@ -211,8 +196,6 @@ dra752_gpu_temp_sensor_registers = { | |||
211 | 196 | ||
212 | /* Thresholds and limits for DRA752 MPU temperature sensor */ | 197 | /* Thresholds and limits for DRA752 MPU temperature sensor */ |
213 | static struct temp_sensor_data dra752_mpu_temp_sensor_data = { | 198 | static struct temp_sensor_data dra752_mpu_temp_sensor_data = { |
214 | .tshut_hot = DRA752_MPU_TSHUT_HOT, | ||
215 | .tshut_cold = DRA752_MPU_TSHUT_COLD, | ||
216 | .t_hot = DRA752_MPU_T_HOT, | 199 | .t_hot = DRA752_MPU_T_HOT, |
217 | .t_cold = DRA752_MPU_T_COLD, | 200 | .t_cold = DRA752_MPU_T_COLD, |
218 | .min_freq = DRA752_MPU_MIN_FREQ, | 201 | .min_freq = DRA752_MPU_MIN_FREQ, |
@@ -226,8 +209,6 @@ static struct temp_sensor_data dra752_mpu_temp_sensor_data = { | |||
226 | 209 | ||
227 | /* Thresholds and limits for DRA752 GPU temperature sensor */ | 210 | /* Thresholds and limits for DRA752 GPU temperature sensor */ |
228 | static struct temp_sensor_data dra752_gpu_temp_sensor_data = { | 211 | static struct temp_sensor_data dra752_gpu_temp_sensor_data = { |
229 | .tshut_hot = DRA752_GPU_TSHUT_HOT, | ||
230 | .tshut_cold = DRA752_GPU_TSHUT_COLD, | ||
231 | .t_hot = DRA752_GPU_T_HOT, | 212 | .t_hot = DRA752_GPU_T_HOT, |
232 | .t_cold = DRA752_GPU_T_COLD, | 213 | .t_cold = DRA752_GPU_T_COLD, |
233 | .min_freq = DRA752_GPU_MIN_FREQ, | 214 | .min_freq = DRA752_GPU_MIN_FREQ, |
@@ -241,8 +222,6 @@ static struct temp_sensor_data dra752_gpu_temp_sensor_data = { | |||
241 | 222 | ||
242 | /* Thresholds and limits for DRA752 CORE temperature sensor */ | 223 | /* Thresholds and limits for DRA752 CORE temperature sensor */ |
243 | static struct temp_sensor_data dra752_core_temp_sensor_data = { | 224 | static struct temp_sensor_data dra752_core_temp_sensor_data = { |
244 | .tshut_hot = DRA752_CORE_TSHUT_HOT, | ||
245 | .tshut_cold = DRA752_CORE_TSHUT_COLD, | ||
246 | .t_hot = DRA752_CORE_T_HOT, | 225 | .t_hot = DRA752_CORE_T_HOT, |
247 | .t_cold = DRA752_CORE_T_COLD, | 226 | .t_cold = DRA752_CORE_T_COLD, |
248 | .min_freq = DRA752_CORE_MIN_FREQ, | 227 | .min_freq = DRA752_CORE_MIN_FREQ, |
@@ -256,8 +235,6 @@ static struct temp_sensor_data dra752_core_temp_sensor_data = { | |||
256 | 235 | ||
257 | /* Thresholds and limits for DRA752 DSPEVE temperature sensor */ | 236 | /* Thresholds and limits for DRA752 DSPEVE temperature sensor */ |
258 | static struct temp_sensor_data dra752_dspeve_temp_sensor_data = { | 237 | static struct temp_sensor_data dra752_dspeve_temp_sensor_data = { |
259 | .tshut_hot = DRA752_DSPEVE_TSHUT_HOT, | ||
260 | .tshut_cold = DRA752_DSPEVE_TSHUT_COLD, | ||
261 | .t_hot = DRA752_DSPEVE_T_HOT, | 238 | .t_hot = DRA752_DSPEVE_T_HOT, |
262 | .t_cold = DRA752_DSPEVE_T_COLD, | 239 | .t_cold = DRA752_DSPEVE_T_COLD, |
263 | .min_freq = DRA752_DSPEVE_MIN_FREQ, | 240 | .min_freq = DRA752_DSPEVE_MIN_FREQ, |
@@ -271,8 +248,6 @@ static struct temp_sensor_data dra752_dspeve_temp_sensor_data = { | |||
271 | 248 | ||
272 | /* Thresholds and limits for DRA752 IVA temperature sensor */ | 249 | /* Thresholds and limits for DRA752 IVA temperature sensor */ |
273 | static struct temp_sensor_data dra752_iva_temp_sensor_data = { | 250 | static struct temp_sensor_data dra752_iva_temp_sensor_data = { |
274 | .tshut_hot = DRA752_IVA_TSHUT_HOT, | ||
275 | .tshut_cold = DRA752_IVA_TSHUT_COLD, | ||
276 | .t_hot = DRA752_IVA_T_HOT, | 251 | .t_hot = DRA752_IVA_T_HOT, |
277 | .t_cold = DRA752_IVA_T_COLD, | 252 | .t_cold = DRA752_IVA_T_COLD, |
278 | .min_freq = DRA752_IVA_MIN_FREQ, | 253 | .min_freq = DRA752_IVA_MIN_FREQ, |
@@ -416,8 +391,7 @@ int dra752_adc_to_temp[DRA752_ADC_END_VALUE - DRA752_ADC_START_VALUE + 1] = { | |||
416 | 391 | ||
417 | /* DRA752 data */ | 392 | /* DRA752 data */ |
418 | const struct ti_bandgap_data dra752_data = { | 393 | const struct ti_bandgap_data dra752_data = { |
419 | .features = TI_BANDGAP_FEATURE_TSHUT_CONFIG | | 394 | .features = TI_BANDGAP_FEATURE_FREEZE_BIT | |
420 | TI_BANDGAP_FEATURE_FREEZE_BIT | | ||
421 | TI_BANDGAP_FEATURE_TALERT | | 395 | TI_BANDGAP_FEATURE_TALERT | |
422 | TI_BANDGAP_FEATURE_COUNTER_DELAY | | 396 | TI_BANDGAP_FEATURE_COUNTER_DELAY | |
423 | TI_BANDGAP_FEATURE_HISTORY_BUFFER | | 397 | TI_BANDGAP_FEATURE_HISTORY_BUFFER | |
diff --git a/drivers/thermal/zx2967_thermal.c b/drivers/thermal/zx2967_thermal.c new file mode 100644 index 000000000000..a5670ad2cfc8 --- /dev/null +++ b/drivers/thermal/zx2967_thermal.c | |||
@@ -0,0 +1,258 @@ | |||
1 | /* | ||
2 | * ZTE's zx2967 family thermal sensor driver | ||
3 | * | ||
4 | * Copyright (C) 2017 ZTE Ltd. | ||
5 | * | ||
6 | * Author: Baoyou Xie <baoyou.xie@linaro.org> | ||
7 | * | ||
8 | * License terms: GNU General Public License (GPL) version 2 | ||
9 | */ | ||
10 | |||
11 | #include <linux/clk.h> | ||
12 | #include <linux/device.h> | ||
13 | #include <linux/err.h> | ||
14 | #include <linux/iopoll.h> | ||
15 | #include <linux/module.h> | ||
16 | #include <linux/platform_device.h> | ||
17 | #include <linux/thermal.h> | ||
18 | |||
19 | /* Power Mode: 0->low 1->high */ | ||
20 | #define ZX2967_THERMAL_POWER_MODE 0 | ||
21 | #define ZX2967_POWER_MODE_LOW 0 | ||
22 | #define ZX2967_POWER_MODE_HIGH 1 | ||
23 | |||
24 | /* DCF Control Register */ | ||
25 | #define ZX2967_THERMAL_DCF 0x4 | ||
26 | #define ZX2967_DCF_EN BIT(1) | ||
27 | #define ZX2967_DCF_FREEZE BIT(0) | ||
28 | |||
29 | /* Selection Register */ | ||
30 | #define ZX2967_THERMAL_SEL 0x8 | ||
31 | |||
32 | /* Control Register */ | ||
33 | #define ZX2967_THERMAL_CTRL 0x10 | ||
34 | |||
35 | #define ZX2967_THERMAL_READY BIT(12) | ||
36 | #define ZX2967_THERMAL_TEMP_MASK GENMASK(11, 0) | ||
37 | #define ZX2967_THERMAL_ID_MASK 0x18 | ||
38 | #define ZX2967_THERMAL_ID 0x10 | ||
39 | |||
40 | #define ZX2967_GET_TEMP_TIMEOUT_US (100 * 1024) | ||
41 | |||
42 | /** | ||
43 | * struct zx2967_thermal_priv - zx2967 thermal sensor private structure | ||
44 | * @tzd: struct thermal_zone_device where the sensor is registered | ||
45 | * @lock: prevents read sensor in parallel | ||
46 | * @clk_topcrm: topcrm clk structure | ||
47 | * @clk_apb: apb clk structure | ||
48 | * @regs: pointer to base address of the thermal sensor | ||
49 | */ | ||
50 | |||
51 | struct zx2967_thermal_priv { | ||
52 | struct thermal_zone_device *tzd; | ||
53 | struct mutex lock; | ||
54 | struct clk *clk_topcrm; | ||
55 | struct clk *clk_apb; | ||
56 | void __iomem *regs; | ||
57 | struct device *dev; | ||
58 | }; | ||
59 | |||
60 | static int zx2967_thermal_get_temp(void *data, int *temp) | ||
61 | { | ||
62 | void __iomem *regs; | ||
63 | struct zx2967_thermal_priv *priv = data; | ||
64 | u32 val; | ||
65 | int ret; | ||
66 | |||
67 | if (!priv->tzd) | ||
68 | return -EAGAIN; | ||
69 | |||
70 | regs = priv->regs; | ||
71 | mutex_lock(&priv->lock); | ||
72 | writel_relaxed(ZX2967_POWER_MODE_LOW, | ||
73 | regs + ZX2967_THERMAL_POWER_MODE); | ||
74 | writel_relaxed(ZX2967_DCF_EN, regs + ZX2967_THERMAL_DCF); | ||
75 | |||
76 | val = readl_relaxed(regs + ZX2967_THERMAL_SEL); | ||
77 | val &= ~ZX2967_THERMAL_ID_MASK; | ||
78 | val |= ZX2967_THERMAL_ID; | ||
79 | writel_relaxed(val, regs + ZX2967_THERMAL_SEL); | ||
80 | |||
81 | /* | ||
82 | * Must wait for a while, surely it's a bit odd. | ||
83 | * otherwise temperature value we got has a few deviation, even if | ||
84 | * the THERMAL_READY bit is set. | ||
85 | */ | ||
86 | usleep_range(100, 300); | ||
87 | ret = readx_poll_timeout(readl, regs + ZX2967_THERMAL_CTRL, | ||
88 | val, val & ZX2967_THERMAL_READY, 300, | ||
89 | ZX2967_GET_TEMP_TIMEOUT_US); | ||
90 | if (ret) { | ||
91 | dev_err(priv->dev, "Thermal sensor data timeout\n"); | ||
92 | goto unlock; | ||
93 | } | ||
94 | |||
95 | writel_relaxed(ZX2967_DCF_FREEZE | ZX2967_DCF_EN, | ||
96 | regs + ZX2967_THERMAL_DCF); | ||
97 | val = readl_relaxed(regs + ZX2967_THERMAL_CTRL) | ||
98 | & ZX2967_THERMAL_TEMP_MASK; | ||
99 | writel_relaxed(ZX2967_POWER_MODE_HIGH, | ||
100 | regs + ZX2967_THERMAL_POWER_MODE); | ||
101 | |||
102 | /* | ||
103 | * Calculate temperature | ||
104 | * In dts, slope is multiplied by 1000. | ||
105 | */ | ||
106 | *temp = DIV_ROUND_CLOSEST(((s32)val + priv->tzd->tzp->offset) * 1000, | ||
107 | priv->tzd->tzp->slope); | ||
108 | |||
109 | unlock: | ||
110 | mutex_unlock(&priv->lock); | ||
111 | return ret; | ||
112 | } | ||
113 | |||
114 | static struct thermal_zone_of_device_ops zx2967_of_thermal_ops = { | ||
115 | .get_temp = zx2967_thermal_get_temp, | ||
116 | }; | ||
117 | |||
118 | static int zx2967_thermal_probe(struct platform_device *pdev) | ||
119 | { | ||
120 | struct zx2967_thermal_priv *priv; | ||
121 | struct resource *res; | ||
122 | int ret; | ||
123 | |||
124 | priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); | ||
125 | if (!priv) | ||
126 | return -ENOMEM; | ||
127 | |||
128 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
129 | priv->regs = devm_ioremap_resource(&pdev->dev, res); | ||
130 | if (IS_ERR(priv->regs)) | ||
131 | return PTR_ERR(priv->regs); | ||
132 | |||
133 | priv->clk_topcrm = devm_clk_get(&pdev->dev, "topcrm"); | ||
134 | if (IS_ERR(priv->clk_topcrm)) { | ||
135 | ret = PTR_ERR(priv->clk_topcrm); | ||
136 | dev_err(&pdev->dev, "failed to get topcrm clock: %d\n", ret); | ||
137 | return ret; | ||
138 | } | ||
139 | |||
140 | ret = clk_prepare_enable(priv->clk_topcrm); | ||
141 | if (ret) { | ||
142 | dev_err(&pdev->dev, "failed to enable topcrm clock: %d\n", | ||
143 | ret); | ||
144 | return ret; | ||
145 | } | ||
146 | |||
147 | priv->clk_apb = devm_clk_get(&pdev->dev, "apb"); | ||
148 | if (IS_ERR(priv->clk_apb)) { | ||
149 | ret = PTR_ERR(priv->clk_apb); | ||
150 | dev_err(&pdev->dev, "failed to get apb clock: %d\n", ret); | ||
151 | goto disable_clk_topcrm; | ||
152 | } | ||
153 | |||
154 | ret = clk_prepare_enable(priv->clk_apb); | ||
155 | if (ret) { | ||
156 | dev_err(&pdev->dev, "failed to enable apb clock: %d\n", | ||
157 | ret); | ||
158 | goto disable_clk_topcrm; | ||
159 | } | ||
160 | |||
161 | mutex_init(&priv->lock); | ||
162 | priv->tzd = thermal_zone_of_sensor_register(&pdev->dev, | ||
163 | 0, priv, &zx2967_of_thermal_ops); | ||
164 | |||
165 | if (IS_ERR(priv->tzd)) { | ||
166 | ret = PTR_ERR(priv->tzd); | ||
167 | dev_err(&pdev->dev, "failed to register sensor: %d\n", ret); | ||
168 | goto disable_clk_all; | ||
169 | } | ||
170 | |||
171 | if (priv->tzd->tzp->slope == 0) { | ||
172 | thermal_zone_of_sensor_unregister(&pdev->dev, priv->tzd); | ||
173 | dev_err(&pdev->dev, "coefficients of sensor is invalid\n"); | ||
174 | ret = -EINVAL; | ||
175 | goto disable_clk_all; | ||
176 | } | ||
177 | |||
178 | priv->dev = &pdev->dev; | ||
179 | platform_set_drvdata(pdev, priv); | ||
180 | |||
181 | return 0; | ||
182 | |||
183 | disable_clk_all: | ||
184 | clk_disable_unprepare(priv->clk_apb); | ||
185 | disable_clk_topcrm: | ||
186 | clk_disable_unprepare(priv->clk_topcrm); | ||
187 | return ret; | ||
188 | } | ||
189 | |||
190 | static int zx2967_thermal_exit(struct platform_device *pdev) | ||
191 | { | ||
192 | struct zx2967_thermal_priv *priv = platform_get_drvdata(pdev); | ||
193 | |||
194 | thermal_zone_of_sensor_unregister(&pdev->dev, priv->tzd); | ||
195 | clk_disable_unprepare(priv->clk_topcrm); | ||
196 | clk_disable_unprepare(priv->clk_apb); | ||
197 | |||
198 | return 0; | ||
199 | } | ||
200 | |||
201 | static const struct of_device_id zx2967_thermal_id_table[] = { | ||
202 | { .compatible = "zte,zx296718-thermal" }, | ||
203 | {} | ||
204 | }; | ||
205 | MODULE_DEVICE_TABLE(of, zx2967_thermal_id_table); | ||
206 | |||
207 | #ifdef CONFIG_PM_SLEEP | ||
208 | static int zx2967_thermal_suspend(struct device *dev) | ||
209 | { | ||
210 | struct platform_device *pdev = to_platform_device(dev); | ||
211 | struct zx2967_thermal_priv *priv = platform_get_drvdata(pdev); | ||
212 | |||
213 | if (priv && priv->clk_topcrm) | ||
214 | clk_disable_unprepare(priv->clk_topcrm); | ||
215 | |||
216 | if (priv && priv->clk_apb) | ||
217 | clk_disable_unprepare(priv->clk_apb); | ||
218 | |||
219 | return 0; | ||
220 | } | ||
221 | |||
222 | static int zx2967_thermal_resume(struct device *dev) | ||
223 | { | ||
224 | struct platform_device *pdev = to_platform_device(dev); | ||
225 | struct zx2967_thermal_priv *priv = platform_get_drvdata(pdev); | ||
226 | int error; | ||
227 | |||
228 | error = clk_prepare_enable(priv->clk_topcrm); | ||
229 | if (error) | ||
230 | return error; | ||
231 | |||
232 | error = clk_prepare_enable(priv->clk_apb); | ||
233 | if (error) { | ||
234 | clk_disable_unprepare(priv->clk_topcrm); | ||
235 | return error; | ||
236 | } | ||
237 | |||
238 | return 0; | ||
239 | } | ||
240 | #endif | ||
241 | |||
242 | static SIMPLE_DEV_PM_OPS(zx2967_thermal_pm_ops, | ||
243 | zx2967_thermal_suspend, zx2967_thermal_resume); | ||
244 | |||
245 | static struct platform_driver zx2967_thermal_driver = { | ||
246 | .probe = zx2967_thermal_probe, | ||
247 | .remove = zx2967_thermal_exit, | ||
248 | .driver = { | ||
249 | .name = "zx2967_thermal", | ||
250 | .of_match_table = zx2967_thermal_id_table, | ||
251 | .pm = &zx2967_thermal_pm_ops, | ||
252 | }, | ||
253 | }; | ||
254 | module_platform_driver(zx2967_thermal_driver); | ||
255 | |||
256 | MODULE_AUTHOR("Baoyou Xie <baoyou.xie@linaro.org>"); | ||
257 | MODULE_DESCRIPTION("ZTE zx2967 thermal driver"); | ||
258 | MODULE_LICENSE("GPL v2"); | ||
diff --git a/fs/f2fs/checkpoint.c b/fs/f2fs/checkpoint.c index f73ee9534d83..0339daf4ca02 100644 --- a/fs/f2fs/checkpoint.c +++ b/fs/f2fs/checkpoint.c | |||
@@ -249,7 +249,8 @@ static int f2fs_write_meta_page(struct page *page, | |||
249 | dec_page_count(sbi, F2FS_DIRTY_META); | 249 | dec_page_count(sbi, F2FS_DIRTY_META); |
250 | 250 | ||
251 | if (wbc->for_reclaim) | 251 | if (wbc->for_reclaim) |
252 | f2fs_submit_merged_bio_cond(sbi, NULL, page, 0, META, WRITE); | 252 | f2fs_submit_merged_bio_cond(sbi, page->mapping->host, |
253 | 0, page->index, META, WRITE); | ||
253 | 254 | ||
254 | unlock_page(page); | 255 | unlock_page(page); |
255 | 256 | ||
@@ -493,6 +494,7 @@ int acquire_orphan_inode(struct f2fs_sb_info *sbi) | |||
493 | #ifdef CONFIG_F2FS_FAULT_INJECTION | 494 | #ifdef CONFIG_F2FS_FAULT_INJECTION |
494 | if (time_to_inject(sbi, FAULT_ORPHAN)) { | 495 | if (time_to_inject(sbi, FAULT_ORPHAN)) { |
495 | spin_unlock(&im->ino_lock); | 496 | spin_unlock(&im->ino_lock); |
497 | f2fs_show_injection_info(FAULT_ORPHAN); | ||
496 | return -ENOSPC; | 498 | return -ENOSPC; |
497 | } | 499 | } |
498 | #endif | 500 | #endif |
@@ -681,8 +683,7 @@ static int get_checkpoint_version(struct f2fs_sb_info *sbi, block_t cp_addr, | |||
681 | return -EINVAL; | 683 | return -EINVAL; |
682 | } | 684 | } |
683 | 685 | ||
684 | crc = le32_to_cpu(*((__le32 *)((unsigned char *)*cp_block | 686 | crc = cur_cp_crc(*cp_block); |
685 | + crc_offset))); | ||
686 | if (!f2fs_crc_valid(sbi, crc, *cp_block, crc_offset)) { | 687 | if (!f2fs_crc_valid(sbi, crc, *cp_block, crc_offset)) { |
687 | f2fs_msg(sbi->sb, KERN_WARNING, "invalid crc value"); | 688 | f2fs_msg(sbi->sb, KERN_WARNING, "invalid crc value"); |
688 | return -EINVAL; | 689 | return -EINVAL; |
@@ -891,7 +892,7 @@ retry: | |||
891 | F2FS_DIRTY_DENTS : F2FS_DIRTY_DATA)); | 892 | F2FS_DIRTY_DENTS : F2FS_DIRTY_DATA)); |
892 | return 0; | 893 | return 0; |
893 | } | 894 | } |
894 | fi = list_entry(head->next, struct f2fs_inode_info, dirty_list); | 895 | fi = list_first_entry(head, struct f2fs_inode_info, dirty_list); |
895 | inode = igrab(&fi->vfs_inode); | 896 | inode = igrab(&fi->vfs_inode); |
896 | spin_unlock(&sbi->inode_lock[type]); | 897 | spin_unlock(&sbi->inode_lock[type]); |
897 | if (inode) { | 898 | if (inode) { |
@@ -924,7 +925,7 @@ int f2fs_sync_inode_meta(struct f2fs_sb_info *sbi) | |||
924 | spin_unlock(&sbi->inode_lock[DIRTY_META]); | 925 | spin_unlock(&sbi->inode_lock[DIRTY_META]); |
925 | return 0; | 926 | return 0; |
926 | } | 927 | } |
927 | fi = list_entry(head->next, struct f2fs_inode_info, | 928 | fi = list_first_entry(head, struct f2fs_inode_info, |
928 | gdirty_list); | 929 | gdirty_list); |
929 | inode = igrab(&fi->vfs_inode); | 930 | inode = igrab(&fi->vfs_inode); |
930 | spin_unlock(&sbi->inode_lock[DIRTY_META]); | 931 | spin_unlock(&sbi->inode_lock[DIRTY_META]); |
@@ -998,8 +999,6 @@ out: | |||
998 | static void unblock_operations(struct f2fs_sb_info *sbi) | 999 | static void unblock_operations(struct f2fs_sb_info *sbi) |
999 | { | 1000 | { |
1000 | up_write(&sbi->node_write); | 1001 | up_write(&sbi->node_write); |
1001 | |||
1002 | build_free_nids(sbi, false); | ||
1003 | f2fs_unlock_all(sbi); | 1002 | f2fs_unlock_all(sbi); |
1004 | } | 1003 | } |
1005 | 1004 | ||
@@ -1025,6 +1024,10 @@ static void update_ckpt_flags(struct f2fs_sb_info *sbi, struct cp_control *cpc) | |||
1025 | 1024 | ||
1026 | spin_lock(&sbi->cp_lock); | 1025 | spin_lock(&sbi->cp_lock); |
1027 | 1026 | ||
1027 | if (cpc->reason == CP_UMOUNT && ckpt->cp_pack_total_block_count > | ||
1028 | sbi->blocks_per_seg - NM_I(sbi)->nat_bits_blocks) | ||
1029 | disable_nat_bits(sbi, false); | ||
1030 | |||
1028 | if (cpc->reason == CP_UMOUNT) | 1031 | if (cpc->reason == CP_UMOUNT) |
1029 | __set_ckpt_flags(ckpt, CP_UMOUNT_FLAG); | 1032 | __set_ckpt_flags(ckpt, CP_UMOUNT_FLAG); |
1030 | else | 1033 | else |
@@ -1137,6 +1140,28 @@ static int do_checkpoint(struct f2fs_sb_info *sbi, struct cp_control *cpc) | |||
1137 | 1140 | ||
1138 | start_blk = __start_cp_next_addr(sbi); | 1141 | start_blk = __start_cp_next_addr(sbi); |
1139 | 1142 | ||
1143 | /* write nat bits */ | ||
1144 | if (enabled_nat_bits(sbi, cpc)) { | ||
1145 | __u64 cp_ver = cur_cp_version(ckpt); | ||
1146 | unsigned int i; | ||
1147 | block_t blk; | ||
1148 | |||
1149 | cp_ver |= ((__u64)crc32 << 32); | ||
1150 | *(__le64 *)nm_i->nat_bits = cpu_to_le64(cp_ver); | ||
1151 | |||
1152 | blk = start_blk + sbi->blocks_per_seg - nm_i->nat_bits_blocks; | ||
1153 | for (i = 0; i < nm_i->nat_bits_blocks; i++) | ||
1154 | update_meta_page(sbi, nm_i->nat_bits + | ||
1155 | (i << F2FS_BLKSIZE_BITS), blk + i); | ||
1156 | |||
1157 | /* Flush all the NAT BITS pages */ | ||
1158 | while (get_pages(sbi, F2FS_DIRTY_META)) { | ||
1159 | sync_meta_pages(sbi, META, LONG_MAX); | ||
1160 | if (unlikely(f2fs_cp_error(sbi))) | ||
1161 | return -EIO; | ||
1162 | } | ||
1163 | } | ||
1164 | |||
1140 | /* need to wait for end_io results */ | 1165 | /* need to wait for end_io results */ |
1141 | wait_on_all_pages_writeback(sbi); | 1166 | wait_on_all_pages_writeback(sbi); |
1142 | if (unlikely(f2fs_cp_error(sbi))) | 1167 | if (unlikely(f2fs_cp_error(sbi))) |
@@ -1248,15 +1273,20 @@ int write_checkpoint(struct f2fs_sb_info *sbi, struct cp_control *cpc) | |||
1248 | f2fs_flush_merged_bios(sbi); | 1273 | f2fs_flush_merged_bios(sbi); |
1249 | 1274 | ||
1250 | /* this is the case of multiple fstrims without any changes */ | 1275 | /* this is the case of multiple fstrims without any changes */ |
1251 | if (cpc->reason == CP_DISCARD && !is_sbi_flag_set(sbi, SBI_IS_DIRTY)) { | 1276 | if (cpc->reason == CP_DISCARD) { |
1252 | f2fs_bug_on(sbi, NM_I(sbi)->dirty_nat_cnt); | 1277 | if (!exist_trim_candidates(sbi, cpc)) { |
1253 | f2fs_bug_on(sbi, SIT_I(sbi)->dirty_sentries); | 1278 | unblock_operations(sbi); |
1254 | f2fs_bug_on(sbi, prefree_segments(sbi)); | 1279 | goto out; |
1255 | flush_sit_entries(sbi, cpc); | 1280 | } |
1256 | clear_prefree_segments(sbi, cpc); | 1281 | |
1257 | f2fs_wait_all_discard_bio(sbi); | 1282 | if (NM_I(sbi)->dirty_nat_cnt == 0 && |
1258 | unblock_operations(sbi); | 1283 | SIT_I(sbi)->dirty_sentries == 0 && |
1259 | goto out; | 1284 | prefree_segments(sbi) == 0) { |
1285 | flush_sit_entries(sbi, cpc); | ||
1286 | clear_prefree_segments(sbi, cpc); | ||
1287 | unblock_operations(sbi); | ||
1288 | goto out; | ||
1289 | } | ||
1260 | } | 1290 | } |
1261 | 1291 | ||
1262 | /* | 1292 | /* |
@@ -1268,17 +1298,15 @@ int write_checkpoint(struct f2fs_sb_info *sbi, struct cp_control *cpc) | |||
1268 | ckpt->checkpoint_ver = cpu_to_le64(++ckpt_ver); | 1298 | ckpt->checkpoint_ver = cpu_to_le64(++ckpt_ver); |
1269 | 1299 | ||
1270 | /* write cached NAT/SIT entries to NAT/SIT area */ | 1300 | /* write cached NAT/SIT entries to NAT/SIT area */ |
1271 | flush_nat_entries(sbi); | 1301 | flush_nat_entries(sbi, cpc); |
1272 | flush_sit_entries(sbi, cpc); | 1302 | flush_sit_entries(sbi, cpc); |
1273 | 1303 | ||
1274 | /* unlock all the fs_lock[] in do_checkpoint() */ | 1304 | /* unlock all the fs_lock[] in do_checkpoint() */ |
1275 | err = do_checkpoint(sbi, cpc); | 1305 | err = do_checkpoint(sbi, cpc); |
1276 | if (err) { | 1306 | if (err) |
1277 | release_discard_addrs(sbi); | 1307 | release_discard_addrs(sbi); |
1278 | } else { | 1308 | else |
1279 | clear_prefree_segments(sbi, cpc); | 1309 | clear_prefree_segments(sbi, cpc); |
1280 | f2fs_wait_all_discard_bio(sbi); | ||
1281 | } | ||
1282 | 1310 | ||
1283 | unblock_operations(sbi); | 1311 | unblock_operations(sbi); |
1284 | stat_inc_cp_count(sbi->stat_info); | 1312 | stat_inc_cp_count(sbi->stat_info); |
diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c index 9ac262564fa6..1375fef11146 100644 --- a/fs/f2fs/data.c +++ b/fs/f2fs/data.c | |||
@@ -55,8 +55,10 @@ static void f2fs_read_end_io(struct bio *bio) | |||
55 | int i; | 55 | int i; |
56 | 56 | ||
57 | #ifdef CONFIG_F2FS_FAULT_INJECTION | 57 | #ifdef CONFIG_F2FS_FAULT_INJECTION |
58 | if (time_to_inject(F2FS_P_SB(bio->bi_io_vec->bv_page), FAULT_IO)) | 58 | if (time_to_inject(F2FS_P_SB(bio->bi_io_vec->bv_page), FAULT_IO)) { |
59 | f2fs_show_injection_info(FAULT_IO); | ||
59 | bio->bi_error = -EIO; | 60 | bio->bi_error = -EIO; |
61 | } | ||
60 | #endif | 62 | #endif |
61 | 63 | ||
62 | if (f2fs_bio_encrypted(bio)) { | 64 | if (f2fs_bio_encrypted(bio)) { |
@@ -93,6 +95,17 @@ static void f2fs_write_end_io(struct bio *bio) | |||
93 | struct page *page = bvec->bv_page; | 95 | struct page *page = bvec->bv_page; |
94 | enum count_type type = WB_DATA_TYPE(page); | 96 | enum count_type type = WB_DATA_TYPE(page); |
95 | 97 | ||
98 | if (IS_DUMMY_WRITTEN_PAGE(page)) { | ||
99 | set_page_private(page, (unsigned long)NULL); | ||
100 | ClearPagePrivate(page); | ||
101 | unlock_page(page); | ||
102 | mempool_free(page, sbi->write_io_dummy); | ||
103 | |||
104 | if (unlikely(bio->bi_error)) | ||
105 | f2fs_stop_checkpoint(sbi, true); | ||
106 | continue; | ||
107 | } | ||
108 | |||
96 | fscrypt_pullback_bio_page(&page, true); | 109 | fscrypt_pullback_bio_page(&page, true); |
97 | 110 | ||
98 | if (unlikely(bio->bi_error)) { | 111 | if (unlikely(bio->bi_error)) { |
@@ -171,10 +184,46 @@ static inline void __submit_bio(struct f2fs_sb_info *sbi, | |||
171 | struct bio *bio, enum page_type type) | 184 | struct bio *bio, enum page_type type) |
172 | { | 185 | { |
173 | if (!is_read_io(bio_op(bio))) { | 186 | if (!is_read_io(bio_op(bio))) { |
187 | unsigned int start; | ||
188 | |||
174 | if (f2fs_sb_mounted_blkzoned(sbi->sb) && | 189 | if (f2fs_sb_mounted_blkzoned(sbi->sb) && |
175 | current->plug && (type == DATA || type == NODE)) | 190 | current->plug && (type == DATA || type == NODE)) |
176 | blk_finish_plug(current->plug); | 191 | blk_finish_plug(current->plug); |
192 | |||
193 | if (type != DATA && type != NODE) | ||
194 | goto submit_io; | ||
195 | |||
196 | start = bio->bi_iter.bi_size >> F2FS_BLKSIZE_BITS; | ||
197 | start %= F2FS_IO_SIZE(sbi); | ||
198 | |||
199 | if (start == 0) | ||
200 | goto submit_io; | ||
201 | |||
202 | /* fill dummy pages */ | ||
203 | for (; start < F2FS_IO_SIZE(sbi); start++) { | ||
204 | struct page *page = | ||
205 | mempool_alloc(sbi->write_io_dummy, | ||
206 | GFP_NOIO | __GFP_ZERO | __GFP_NOFAIL); | ||
207 | f2fs_bug_on(sbi, !page); | ||
208 | |||
209 | SetPagePrivate(page); | ||
210 | set_page_private(page, (unsigned long)DUMMY_WRITTEN_PAGE); | ||
211 | lock_page(page); | ||
212 | if (bio_add_page(bio, page, PAGE_SIZE, 0) < PAGE_SIZE) | ||
213 | f2fs_bug_on(sbi, 1); | ||
214 | } | ||
215 | /* | ||
216 | * In the NODE case, we lose next block address chain. So, we | ||
217 | * need to do checkpoint in f2fs_sync_file. | ||
218 | */ | ||
219 | if (type == NODE) | ||
220 | set_sbi_flag(sbi, SBI_NEED_CP); | ||
177 | } | 221 | } |
222 | submit_io: | ||
223 | if (is_read_io(bio_op(bio))) | ||
224 | trace_f2fs_submit_read_bio(sbi->sb, type, bio); | ||
225 | else | ||
226 | trace_f2fs_submit_write_bio(sbi->sb, type, bio); | ||
178 | submit_bio(bio); | 227 | submit_bio(bio); |
179 | } | 228 | } |
180 | 229 | ||
@@ -185,19 +234,19 @@ static void __submit_merged_bio(struct f2fs_bio_info *io) | |||
185 | if (!io->bio) | 234 | if (!io->bio) |
186 | return; | 235 | return; |
187 | 236 | ||
237 | bio_set_op_attrs(io->bio, fio->op, fio->op_flags); | ||
238 | |||
188 | if (is_read_io(fio->op)) | 239 | if (is_read_io(fio->op)) |
189 | trace_f2fs_submit_read_bio(io->sbi->sb, fio, io->bio); | 240 | trace_f2fs_prepare_read_bio(io->sbi->sb, fio->type, io->bio); |
190 | else | 241 | else |
191 | trace_f2fs_submit_write_bio(io->sbi->sb, fio, io->bio); | 242 | trace_f2fs_prepare_write_bio(io->sbi->sb, fio->type, io->bio); |
192 | |||
193 | bio_set_op_attrs(io->bio, fio->op, fio->op_flags); | ||
194 | 243 | ||
195 | __submit_bio(io->sbi, io->bio, fio->type); | 244 | __submit_bio(io->sbi, io->bio, fio->type); |
196 | io->bio = NULL; | 245 | io->bio = NULL; |
197 | } | 246 | } |
198 | 247 | ||
199 | static bool __has_merged_page(struct f2fs_bio_info *io, struct inode *inode, | 248 | static bool __has_merged_page(struct f2fs_bio_info *io, |
200 | struct page *page, nid_t ino) | 249 | struct inode *inode, nid_t ino, pgoff_t idx) |
201 | { | 250 | { |
202 | struct bio_vec *bvec; | 251 | struct bio_vec *bvec; |
203 | struct page *target; | 252 | struct page *target; |
@@ -206,7 +255,7 @@ static bool __has_merged_page(struct f2fs_bio_info *io, struct inode *inode, | |||
206 | if (!io->bio) | 255 | if (!io->bio) |
207 | return false; | 256 | return false; |
208 | 257 | ||
209 | if (!inode && !page && !ino) | 258 | if (!inode && !ino) |
210 | return true; | 259 | return true; |
211 | 260 | ||
212 | bio_for_each_segment_all(bvec, io->bio, i) { | 261 | bio_for_each_segment_all(bvec, io->bio, i) { |
@@ -216,10 +265,11 @@ static bool __has_merged_page(struct f2fs_bio_info *io, struct inode *inode, | |||
216 | else | 265 | else |
217 | target = fscrypt_control_page(bvec->bv_page); | 266 | target = fscrypt_control_page(bvec->bv_page); |
218 | 267 | ||
268 | if (idx != target->index) | ||
269 | continue; | ||
270 | |||
219 | if (inode && inode == target->mapping->host) | 271 | if (inode && inode == target->mapping->host) |
220 | return true; | 272 | return true; |
221 | if (page && page == target) | ||
222 | return true; | ||
223 | if (ino && ino == ino_of_node(target)) | 273 | if (ino && ino == ino_of_node(target)) |
224 | return true; | 274 | return true; |
225 | } | 275 | } |
@@ -228,22 +278,21 @@ static bool __has_merged_page(struct f2fs_bio_info *io, struct inode *inode, | |||
228 | } | 278 | } |
229 | 279 | ||
230 | static bool has_merged_page(struct f2fs_sb_info *sbi, struct inode *inode, | 280 | static bool has_merged_page(struct f2fs_sb_info *sbi, struct inode *inode, |
231 | struct page *page, nid_t ino, | 281 | nid_t ino, pgoff_t idx, enum page_type type) |
232 | enum page_type type) | ||
233 | { | 282 | { |
234 | enum page_type btype = PAGE_TYPE_OF_BIO(type); | 283 | enum page_type btype = PAGE_TYPE_OF_BIO(type); |
235 | struct f2fs_bio_info *io = &sbi->write_io[btype]; | 284 | struct f2fs_bio_info *io = &sbi->write_io[btype]; |
236 | bool ret; | 285 | bool ret; |
237 | 286 | ||
238 | down_read(&io->io_rwsem); | 287 | down_read(&io->io_rwsem); |
239 | ret = __has_merged_page(io, inode, page, ino); | 288 | ret = __has_merged_page(io, inode, ino, idx); |
240 | up_read(&io->io_rwsem); | 289 | up_read(&io->io_rwsem); |
241 | return ret; | 290 | return ret; |
242 | } | 291 | } |
243 | 292 | ||
244 | static void __f2fs_submit_merged_bio(struct f2fs_sb_info *sbi, | 293 | static void __f2fs_submit_merged_bio(struct f2fs_sb_info *sbi, |
245 | struct inode *inode, struct page *page, | 294 | struct inode *inode, nid_t ino, pgoff_t idx, |
246 | nid_t ino, enum page_type type, int rw) | 295 | enum page_type type, int rw) |
247 | { | 296 | { |
248 | enum page_type btype = PAGE_TYPE_OF_BIO(type); | 297 | enum page_type btype = PAGE_TYPE_OF_BIO(type); |
249 | struct f2fs_bio_info *io; | 298 | struct f2fs_bio_info *io; |
@@ -252,16 +301,16 @@ static void __f2fs_submit_merged_bio(struct f2fs_sb_info *sbi, | |||
252 | 301 | ||
253 | down_write(&io->io_rwsem); | 302 | down_write(&io->io_rwsem); |
254 | 303 | ||
255 | if (!__has_merged_page(io, inode, page, ino)) | 304 | if (!__has_merged_page(io, inode, ino, idx)) |
256 | goto out; | 305 | goto out; |
257 | 306 | ||
258 | /* change META to META_FLUSH in the checkpoint procedure */ | 307 | /* change META to META_FLUSH in the checkpoint procedure */ |
259 | if (type >= META_FLUSH) { | 308 | if (type >= META_FLUSH) { |
260 | io->fio.type = META_FLUSH; | 309 | io->fio.type = META_FLUSH; |
261 | io->fio.op = REQ_OP_WRITE; | 310 | io->fio.op = REQ_OP_WRITE; |
262 | io->fio.op_flags = REQ_PREFLUSH | REQ_META | REQ_PRIO; | 311 | io->fio.op_flags = REQ_META | REQ_PRIO; |
263 | if (!test_opt(sbi, NOBARRIER)) | 312 | if (!test_opt(sbi, NOBARRIER)) |
264 | io->fio.op_flags |= REQ_FUA; | 313 | io->fio.op_flags |= REQ_PREFLUSH | REQ_FUA; |
265 | } | 314 | } |
266 | __submit_merged_bio(io); | 315 | __submit_merged_bio(io); |
267 | out: | 316 | out: |
@@ -271,15 +320,15 @@ out: | |||
271 | void f2fs_submit_merged_bio(struct f2fs_sb_info *sbi, enum page_type type, | 320 | void f2fs_submit_merged_bio(struct f2fs_sb_info *sbi, enum page_type type, |
272 | int rw) | 321 | int rw) |
273 | { | 322 | { |
274 | __f2fs_submit_merged_bio(sbi, NULL, NULL, 0, type, rw); | 323 | __f2fs_submit_merged_bio(sbi, NULL, 0, 0, type, rw); |
275 | } | 324 | } |
276 | 325 | ||
277 | void f2fs_submit_merged_bio_cond(struct f2fs_sb_info *sbi, | 326 | void f2fs_submit_merged_bio_cond(struct f2fs_sb_info *sbi, |
278 | struct inode *inode, struct page *page, | 327 | struct inode *inode, nid_t ino, pgoff_t idx, |
279 | nid_t ino, enum page_type type, int rw) | 328 | enum page_type type, int rw) |
280 | { | 329 | { |
281 | if (has_merged_page(sbi, inode, page, ino, type)) | 330 | if (has_merged_page(sbi, inode, ino, idx, type)) |
282 | __f2fs_submit_merged_bio(sbi, inode, page, ino, type, rw); | 331 | __f2fs_submit_merged_bio(sbi, inode, ino, idx, type, rw); |
283 | } | 332 | } |
284 | 333 | ||
285 | void f2fs_flush_merged_bios(struct f2fs_sb_info *sbi) | 334 | void f2fs_flush_merged_bios(struct f2fs_sb_info *sbi) |
@@ -315,13 +364,14 @@ int f2fs_submit_page_bio(struct f2fs_io_info *fio) | |||
315 | return 0; | 364 | return 0; |
316 | } | 365 | } |
317 | 366 | ||
318 | void f2fs_submit_page_mbio(struct f2fs_io_info *fio) | 367 | int f2fs_submit_page_mbio(struct f2fs_io_info *fio) |
319 | { | 368 | { |
320 | struct f2fs_sb_info *sbi = fio->sbi; | 369 | struct f2fs_sb_info *sbi = fio->sbi; |
321 | enum page_type btype = PAGE_TYPE_OF_BIO(fio->type); | 370 | enum page_type btype = PAGE_TYPE_OF_BIO(fio->type); |
322 | struct f2fs_bio_info *io; | 371 | struct f2fs_bio_info *io; |
323 | bool is_read = is_read_io(fio->op); | 372 | bool is_read = is_read_io(fio->op); |
324 | struct page *bio_page; | 373 | struct page *bio_page; |
374 | int err = 0; | ||
325 | 375 | ||
326 | io = is_read ? &sbi->read_io : &sbi->write_io[btype]; | 376 | io = is_read ? &sbi->read_io : &sbi->write_io[btype]; |
327 | 377 | ||
@@ -331,6 +381,9 @@ void f2fs_submit_page_mbio(struct f2fs_io_info *fio) | |||
331 | 381 | ||
332 | bio_page = fio->encrypted_page ? fio->encrypted_page : fio->page; | 382 | bio_page = fio->encrypted_page ? fio->encrypted_page : fio->page; |
333 | 383 | ||
384 | /* set submitted = 1 as a return value */ | ||
385 | fio->submitted = 1; | ||
386 | |||
334 | if (!is_read) | 387 | if (!is_read) |
335 | inc_page_count(sbi, WB_DATA_TYPE(bio_page)); | 388 | inc_page_count(sbi, WB_DATA_TYPE(bio_page)); |
336 | 389 | ||
@@ -342,6 +395,13 @@ void f2fs_submit_page_mbio(struct f2fs_io_info *fio) | |||
342 | __submit_merged_bio(io); | 395 | __submit_merged_bio(io); |
343 | alloc_new: | 396 | alloc_new: |
344 | if (io->bio == NULL) { | 397 | if (io->bio == NULL) { |
398 | if ((fio->type == DATA || fio->type == NODE) && | ||
399 | fio->new_blkaddr & F2FS_IO_SIZE_MASK(sbi)) { | ||
400 | err = -EAGAIN; | ||
401 | if (!is_read) | ||
402 | dec_page_count(sbi, WB_DATA_TYPE(bio_page)); | ||
403 | goto out_fail; | ||
404 | } | ||
345 | io->bio = __bio_alloc(sbi, fio->new_blkaddr, | 405 | io->bio = __bio_alloc(sbi, fio->new_blkaddr, |
346 | BIO_MAX_PAGES, is_read); | 406 | BIO_MAX_PAGES, is_read); |
347 | io->fio = *fio; | 407 | io->fio = *fio; |
@@ -355,9 +415,10 @@ alloc_new: | |||
355 | 415 | ||
356 | io->last_block_in_bio = fio->new_blkaddr; | 416 | io->last_block_in_bio = fio->new_blkaddr; |
357 | f2fs_trace_ios(fio, 0); | 417 | f2fs_trace_ios(fio, 0); |
358 | 418 | out_fail: | |
359 | up_write(&io->io_rwsem); | 419 | up_write(&io->io_rwsem); |
360 | trace_f2fs_submit_page_mbio(fio->page, fio); | 420 | trace_f2fs_submit_page_mbio(fio->page, fio); |
421 | return err; | ||
361 | } | 422 | } |
362 | 423 | ||
363 | static void __set_data_blkaddr(struct dnode_of_data *dn) | 424 | static void __set_data_blkaddr(struct dnode_of_data *dn) |
@@ -453,7 +514,7 @@ int f2fs_reserve_block(struct dnode_of_data *dn, pgoff_t index) | |||
453 | 514 | ||
454 | int f2fs_get_block(struct dnode_of_data *dn, pgoff_t index) | 515 | int f2fs_get_block(struct dnode_of_data *dn, pgoff_t index) |
455 | { | 516 | { |
456 | struct extent_info ei; | 517 | struct extent_info ei = {0,0,0}; |
457 | struct inode *inode = dn->inode; | 518 | struct inode *inode = dn->inode; |
458 | 519 | ||
459 | if (f2fs_lookup_extent_cache(inode, index, &ei)) { | 520 | if (f2fs_lookup_extent_cache(inode, index, &ei)) { |
@@ -470,7 +531,7 @@ struct page *get_read_data_page(struct inode *inode, pgoff_t index, | |||
470 | struct address_space *mapping = inode->i_mapping; | 531 | struct address_space *mapping = inode->i_mapping; |
471 | struct dnode_of_data dn; | 532 | struct dnode_of_data dn; |
472 | struct page *page; | 533 | struct page *page; |
473 | struct extent_info ei; | 534 | struct extent_info ei = {0,0,0}; |
474 | int err; | 535 | int err; |
475 | struct f2fs_io_info fio = { | 536 | struct f2fs_io_info fio = { |
476 | .sbi = F2FS_I_SB(inode), | 537 | .sbi = F2FS_I_SB(inode), |
@@ -694,6 +755,9 @@ int f2fs_preallocate_blocks(struct kiocb *iocb, struct iov_iter *from) | |||
694 | struct f2fs_map_blocks map; | 755 | struct f2fs_map_blocks map; |
695 | int err = 0; | 756 | int err = 0; |
696 | 757 | ||
758 | if (is_inode_flag_set(inode, FI_NO_PREALLOC)) | ||
759 | return 0; | ||
760 | |||
697 | map.m_lblk = F2FS_BLK_ALIGN(iocb->ki_pos); | 761 | map.m_lblk = F2FS_BLK_ALIGN(iocb->ki_pos); |
698 | map.m_len = F2FS_BYTES_TO_BLK(iocb->ki_pos + iov_iter_count(from)); | 762 | map.m_len = F2FS_BYTES_TO_BLK(iocb->ki_pos + iov_iter_count(from)); |
699 | if (map.m_len > map.m_lblk) | 763 | if (map.m_len > map.m_lblk) |
@@ -742,7 +806,7 @@ int f2fs_map_blocks(struct inode *inode, struct f2fs_map_blocks *map, | |||
742 | int err = 0, ofs = 1; | 806 | int err = 0, ofs = 1; |
743 | unsigned int ofs_in_node, last_ofs_in_node; | 807 | unsigned int ofs_in_node, last_ofs_in_node; |
744 | blkcnt_t prealloc; | 808 | blkcnt_t prealloc; |
745 | struct extent_info ei; | 809 | struct extent_info ei = {0,0,0}; |
746 | block_t blkaddr; | 810 | block_t blkaddr; |
747 | 811 | ||
748 | if (!maxblocks) | 812 | if (!maxblocks) |
@@ -806,7 +870,7 @@ next_block: | |||
806 | } | 870 | } |
807 | if (err) | 871 | if (err) |
808 | goto sync_out; | 872 | goto sync_out; |
809 | map->m_flags = F2FS_MAP_NEW; | 873 | map->m_flags |= F2FS_MAP_NEW; |
810 | blkaddr = dn.data_blkaddr; | 874 | blkaddr = dn.data_blkaddr; |
811 | } else { | 875 | } else { |
812 | if (flag == F2FS_GET_BLOCK_BMAP) { | 876 | if (flag == F2FS_GET_BLOCK_BMAP) { |
@@ -906,7 +970,7 @@ static int __get_data_block(struct inode *inode, sector_t iblock, | |||
906 | if (!err) { | 970 | if (!err) { |
907 | map_bh(bh, inode->i_sb, map.m_pblk); | 971 | map_bh(bh, inode->i_sb, map.m_pblk); |
908 | bh->b_state = (bh->b_state & ~F2FS_MAP_FLAGS) | map.m_flags; | 972 | bh->b_state = (bh->b_state & ~F2FS_MAP_FLAGS) | map.m_flags; |
909 | bh->b_size = map.m_len << inode->i_blkbits; | 973 | bh->b_size = (u64)map.m_len << inode->i_blkbits; |
910 | } | 974 | } |
911 | return err; | 975 | return err; |
912 | } | 976 | } |
@@ -1088,7 +1152,7 @@ static int f2fs_mpage_readpages(struct address_space *mapping, | |||
1088 | 1152 | ||
1089 | prefetchw(&page->flags); | 1153 | prefetchw(&page->flags); |
1090 | if (pages) { | 1154 | if (pages) { |
1091 | page = list_entry(pages->prev, struct page, lru); | 1155 | page = list_last_entry(pages, struct page, lru); |
1092 | list_del(&page->lru); | 1156 | list_del(&page->lru); |
1093 | if (add_to_page_cache_lru(page, mapping, | 1157 | if (add_to_page_cache_lru(page, mapping, |
1094 | page->index, | 1158 | page->index, |
@@ -1207,7 +1271,7 @@ static int f2fs_read_data_pages(struct file *file, | |||
1207 | struct list_head *pages, unsigned nr_pages) | 1271 | struct list_head *pages, unsigned nr_pages) |
1208 | { | 1272 | { |
1209 | struct inode *inode = file->f_mapping->host; | 1273 | struct inode *inode = file->f_mapping->host; |
1210 | struct page *page = list_entry(pages->prev, struct page, lru); | 1274 | struct page *page = list_last_entry(pages, struct page, lru); |
1211 | 1275 | ||
1212 | trace_f2fs_readpages(inode, page, nr_pages); | 1276 | trace_f2fs_readpages(inode, page, nr_pages); |
1213 | 1277 | ||
@@ -1288,8 +1352,8 @@ out_writepage: | |||
1288 | return err; | 1352 | return err; |
1289 | } | 1353 | } |
1290 | 1354 | ||
1291 | static int f2fs_write_data_page(struct page *page, | 1355 | static int __write_data_page(struct page *page, bool *submitted, |
1292 | struct writeback_control *wbc) | 1356 | struct writeback_control *wbc) |
1293 | { | 1357 | { |
1294 | struct inode *inode = page->mapping->host; | 1358 | struct inode *inode = page->mapping->host; |
1295 | struct f2fs_sb_info *sbi = F2FS_I_SB(inode); | 1359 | struct f2fs_sb_info *sbi = F2FS_I_SB(inode); |
@@ -1307,6 +1371,7 @@ static int f2fs_write_data_page(struct page *page, | |||
1307 | .op_flags = wbc_to_write_flags(wbc), | 1371 | .op_flags = wbc_to_write_flags(wbc), |
1308 | .page = page, | 1372 | .page = page, |
1309 | .encrypted_page = NULL, | 1373 | .encrypted_page = NULL, |
1374 | .submitted = false, | ||
1310 | }; | 1375 | }; |
1311 | 1376 | ||
1312 | trace_f2fs_writepage(page, DATA); | 1377 | trace_f2fs_writepage(page, DATA); |
@@ -1352,9 +1417,12 @@ write: | |||
1352 | goto redirty_out; | 1417 | goto redirty_out; |
1353 | 1418 | ||
1354 | err = -EAGAIN; | 1419 | err = -EAGAIN; |
1355 | f2fs_lock_op(sbi); | 1420 | if (f2fs_has_inline_data(inode)) { |
1356 | if (f2fs_has_inline_data(inode)) | ||
1357 | err = f2fs_write_inline_data(inode, page); | 1421 | err = f2fs_write_inline_data(inode, page); |
1422 | if (!err) | ||
1423 | goto out; | ||
1424 | } | ||
1425 | f2fs_lock_op(sbi); | ||
1358 | if (err == -EAGAIN) | 1426 | if (err == -EAGAIN) |
1359 | err = do_write_data_page(&fio); | 1427 | err = do_write_data_page(&fio); |
1360 | if (F2FS_I(inode)->last_disk_size < psize) | 1428 | if (F2FS_I(inode)->last_disk_size < psize) |
@@ -1370,15 +1438,22 @@ out: | |||
1370 | ClearPageUptodate(page); | 1438 | ClearPageUptodate(page); |
1371 | 1439 | ||
1372 | if (wbc->for_reclaim) { | 1440 | if (wbc->for_reclaim) { |
1373 | f2fs_submit_merged_bio_cond(sbi, NULL, page, 0, DATA, WRITE); | 1441 | f2fs_submit_merged_bio_cond(sbi, inode, 0, page->index, |
1442 | DATA, WRITE); | ||
1374 | remove_dirty_inode(inode); | 1443 | remove_dirty_inode(inode); |
1444 | submitted = NULL; | ||
1375 | } | 1445 | } |
1376 | 1446 | ||
1377 | unlock_page(page); | 1447 | unlock_page(page); |
1378 | f2fs_balance_fs(sbi, need_balance_fs); | 1448 | f2fs_balance_fs(sbi, need_balance_fs); |
1379 | 1449 | ||
1380 | if (unlikely(f2fs_cp_error(sbi))) | 1450 | if (unlikely(f2fs_cp_error(sbi))) { |
1381 | f2fs_submit_merged_bio(sbi, DATA, WRITE); | 1451 | f2fs_submit_merged_bio(sbi, DATA, WRITE); |
1452 | submitted = NULL; | ||
1453 | } | ||
1454 | |||
1455 | if (submitted) | ||
1456 | *submitted = fio.submitted; | ||
1382 | 1457 | ||
1383 | return 0; | 1458 | return 0; |
1384 | 1459 | ||
@@ -1390,6 +1465,12 @@ redirty_out: | |||
1390 | return err; | 1465 | return err; |
1391 | } | 1466 | } |
1392 | 1467 | ||
1468 | static int f2fs_write_data_page(struct page *page, | ||
1469 | struct writeback_control *wbc) | ||
1470 | { | ||
1471 | return __write_data_page(page, NULL, wbc); | ||
1472 | } | ||
1473 | |||
1393 | /* | 1474 | /* |
1394 | * This function was copied from write_cche_pages from mm/page-writeback.c. | 1475 | * This function was copied from write_cche_pages from mm/page-writeback.c. |
1395 | * The major change is making write step of cold data page separately from | 1476 | * The major change is making write step of cold data page separately from |
@@ -1406,10 +1487,10 @@ static int f2fs_write_cache_pages(struct address_space *mapping, | |||
1406 | pgoff_t index; | 1487 | pgoff_t index; |
1407 | pgoff_t end; /* Inclusive */ | 1488 | pgoff_t end; /* Inclusive */ |
1408 | pgoff_t done_index; | 1489 | pgoff_t done_index; |
1490 | pgoff_t last_idx = ULONG_MAX; | ||
1409 | int cycled; | 1491 | int cycled; |
1410 | int range_whole = 0; | 1492 | int range_whole = 0; |
1411 | int tag; | 1493 | int tag; |
1412 | int nwritten = 0; | ||
1413 | 1494 | ||
1414 | pagevec_init(&pvec, 0); | 1495 | pagevec_init(&pvec, 0); |
1415 | 1496 | ||
@@ -1446,6 +1527,7 @@ retry: | |||
1446 | 1527 | ||
1447 | for (i = 0; i < nr_pages; i++) { | 1528 | for (i = 0; i < nr_pages; i++) { |
1448 | struct page *page = pvec.pages[i]; | 1529 | struct page *page = pvec.pages[i]; |
1530 | bool submitted = false; | ||
1449 | 1531 | ||
1450 | if (page->index > end) { | 1532 | if (page->index > end) { |
1451 | done = 1; | 1533 | done = 1; |
@@ -1479,7 +1561,7 @@ continue_unlock: | |||
1479 | if (!clear_page_dirty_for_io(page)) | 1561 | if (!clear_page_dirty_for_io(page)) |
1480 | goto continue_unlock; | 1562 | goto continue_unlock; |
1481 | 1563 | ||
1482 | ret = mapping->a_ops->writepage(page, wbc); | 1564 | ret = __write_data_page(page, &submitted, wbc); |
1483 | if (unlikely(ret)) { | 1565 | if (unlikely(ret)) { |
1484 | /* | 1566 | /* |
1485 | * keep nr_to_write, since vfs uses this to | 1567 | * keep nr_to_write, since vfs uses this to |
@@ -1493,8 +1575,8 @@ continue_unlock: | |||
1493 | done_index = page->index + 1; | 1575 | done_index = page->index + 1; |
1494 | done = 1; | 1576 | done = 1; |
1495 | break; | 1577 | break; |
1496 | } else { | 1578 | } else if (submitted) { |
1497 | nwritten++; | 1579 | last_idx = page->index; |
1498 | } | 1580 | } |
1499 | 1581 | ||
1500 | if (--wbc->nr_to_write <= 0 && | 1582 | if (--wbc->nr_to_write <= 0 && |
@@ -1516,9 +1598,9 @@ continue_unlock: | |||
1516 | if (wbc->range_cyclic || (range_whole && wbc->nr_to_write > 0)) | 1598 | if (wbc->range_cyclic || (range_whole && wbc->nr_to_write > 0)) |
1517 | mapping->writeback_index = done_index; | 1599 | mapping->writeback_index = done_index; |
1518 | 1600 | ||
1519 | if (nwritten) | 1601 | if (last_idx != ULONG_MAX) |
1520 | f2fs_submit_merged_bio_cond(F2FS_M_SB(mapping), mapping->host, | 1602 | f2fs_submit_merged_bio_cond(F2FS_M_SB(mapping), mapping->host, |
1521 | NULL, 0, DATA, WRITE); | 1603 | 0, last_idx, DATA, WRITE); |
1522 | 1604 | ||
1523 | return ret; | 1605 | return ret; |
1524 | } | 1606 | } |
@@ -1591,14 +1673,15 @@ static int prepare_write_begin(struct f2fs_sb_info *sbi, | |||
1591 | struct dnode_of_data dn; | 1673 | struct dnode_of_data dn; |
1592 | struct page *ipage; | 1674 | struct page *ipage; |
1593 | bool locked = false; | 1675 | bool locked = false; |
1594 | struct extent_info ei; | 1676 | struct extent_info ei = {0,0,0}; |
1595 | int err = 0; | 1677 | int err = 0; |
1596 | 1678 | ||
1597 | /* | 1679 | /* |
1598 | * we already allocated all the blocks, so we don't need to get | 1680 | * we already allocated all the blocks, so we don't need to get |
1599 | * the block addresses when there is no need to fill the page. | 1681 | * the block addresses when there is no need to fill the page. |
1600 | */ | 1682 | */ |
1601 | if (!f2fs_has_inline_data(inode) && len == PAGE_SIZE) | 1683 | if (!f2fs_has_inline_data(inode) && len == PAGE_SIZE && |
1684 | !is_inode_flag_set(inode, FI_NO_PREALLOC)) | ||
1602 | return 0; | 1685 | return 0; |
1603 | 1686 | ||
1604 | if (f2fs_has_inline_data(inode) || | 1687 | if (f2fs_has_inline_data(inode) || |
@@ -1682,7 +1765,12 @@ static int f2fs_write_begin(struct file *file, struct address_space *mapping, | |||
1682 | goto fail; | 1765 | goto fail; |
1683 | } | 1766 | } |
1684 | repeat: | 1767 | repeat: |
1685 | page = grab_cache_page_write_begin(mapping, index, flags); | 1768 | /* |
1769 | * Do not use grab_cache_page_write_begin() to avoid deadlock due to | ||
1770 | * wait_for_stable_page. Will wait that below with our IO control. | ||
1771 | */ | ||
1772 | page = pagecache_get_page(mapping, index, | ||
1773 | FGP_LOCK | FGP_WRITE | FGP_CREAT, GFP_NOFS); | ||
1686 | if (!page) { | 1774 | if (!page) { |
1687 | err = -ENOMEM; | 1775 | err = -ENOMEM; |
1688 | goto fail; | 1776 | goto fail; |
@@ -1715,6 +1803,11 @@ repeat: | |||
1715 | if (len == PAGE_SIZE || PageUptodate(page)) | 1803 | if (len == PAGE_SIZE || PageUptodate(page)) |
1716 | return 0; | 1804 | return 0; |
1717 | 1805 | ||
1806 | if (!(pos & (PAGE_SIZE - 1)) && (pos + len) >= i_size_read(inode)) { | ||
1807 | zero_user_segment(page, len, PAGE_SIZE); | ||
1808 | return 0; | ||
1809 | } | ||
1810 | |||
1718 | if (blkaddr == NEW_ADDR) { | 1811 | if (blkaddr == NEW_ADDR) { |
1719 | zero_user_segment(page, 0, PAGE_SIZE); | 1812 | zero_user_segment(page, 0, PAGE_SIZE); |
1720 | SetPageUptodate(page); | 1813 | SetPageUptodate(page); |
@@ -1768,7 +1861,7 @@ static int f2fs_write_end(struct file *file, | |||
1768 | * let generic_perform_write() try to copy data again through copied=0. | 1861 | * let generic_perform_write() try to copy data again through copied=0. |
1769 | */ | 1862 | */ |
1770 | if (!PageUptodate(page)) { | 1863 | if (!PageUptodate(page)) { |
1771 | if (unlikely(copied != PAGE_SIZE)) | 1864 | if (unlikely(copied != len)) |
1772 | copied = 0; | 1865 | copied = 0; |
1773 | else | 1866 | else |
1774 | SetPageUptodate(page); | 1867 | SetPageUptodate(page); |
@@ -1917,7 +2010,7 @@ static int f2fs_set_data_page_dirty(struct page *page) | |||
1917 | if (!PageUptodate(page)) | 2010 | if (!PageUptodate(page)) |
1918 | SetPageUptodate(page); | 2011 | SetPageUptodate(page); |
1919 | 2012 | ||
1920 | if (f2fs_is_atomic_file(inode)) { | 2013 | if (f2fs_is_atomic_file(inode) && !f2fs_is_commit_atomic_write(inode)) { |
1921 | if (!IS_ATOMIC_WRITTEN_PAGE(page)) { | 2014 | if (!IS_ATOMIC_WRITTEN_PAGE(page)) { |
1922 | register_inmem_page(inode, page); | 2015 | register_inmem_page(inode, page); |
1923 | return 1; | 2016 | return 1; |
diff --git a/fs/f2fs/debug.c b/fs/f2fs/debug.c index fbd5184140d0..a77df377e2e8 100644 --- a/fs/f2fs/debug.c +++ b/fs/f2fs/debug.c | |||
@@ -50,8 +50,16 @@ static void update_general_status(struct f2fs_sb_info *sbi) | |||
50 | si->ndirty_files = sbi->ndirty_inode[FILE_INODE]; | 50 | si->ndirty_files = sbi->ndirty_inode[FILE_INODE]; |
51 | si->ndirty_all = sbi->ndirty_inode[DIRTY_META]; | 51 | si->ndirty_all = sbi->ndirty_inode[DIRTY_META]; |
52 | si->inmem_pages = get_pages(sbi, F2FS_INMEM_PAGES); | 52 | si->inmem_pages = get_pages(sbi, F2FS_INMEM_PAGES); |
53 | si->aw_cnt = atomic_read(&sbi->aw_cnt); | ||
54 | si->max_aw_cnt = atomic_read(&sbi->max_aw_cnt); | ||
53 | si->nr_wb_cp_data = get_pages(sbi, F2FS_WB_CP_DATA); | 55 | si->nr_wb_cp_data = get_pages(sbi, F2FS_WB_CP_DATA); |
54 | si->nr_wb_data = get_pages(sbi, F2FS_WB_DATA); | 56 | si->nr_wb_data = get_pages(sbi, F2FS_WB_DATA); |
57 | if (SM_I(sbi) && SM_I(sbi)->fcc_info) | ||
58 | si->nr_flush = | ||
59 | atomic_read(&SM_I(sbi)->fcc_info->submit_flush); | ||
60 | if (SM_I(sbi) && SM_I(sbi)->dcc_info) | ||
61 | si->nr_discard = | ||
62 | atomic_read(&SM_I(sbi)->dcc_info->submit_discard); | ||
55 | si->total_count = (int)sbi->user_block_count / sbi->blocks_per_seg; | 63 | si->total_count = (int)sbi->user_block_count / sbi->blocks_per_seg; |
56 | si->rsvd_segs = reserved_segments(sbi); | 64 | si->rsvd_segs = reserved_segments(sbi); |
57 | si->overp_segs = overprovision_segments(sbi); | 65 | si->overp_segs = overprovision_segments(sbi); |
@@ -62,6 +70,8 @@ static void update_general_status(struct f2fs_sb_info *sbi) | |||
62 | si->inline_xattr = atomic_read(&sbi->inline_xattr); | 70 | si->inline_xattr = atomic_read(&sbi->inline_xattr); |
63 | si->inline_inode = atomic_read(&sbi->inline_inode); | 71 | si->inline_inode = atomic_read(&sbi->inline_inode); |
64 | si->inline_dir = atomic_read(&sbi->inline_dir); | 72 | si->inline_dir = atomic_read(&sbi->inline_dir); |
73 | si->append = sbi->im[APPEND_INO].ino_num; | ||
74 | si->update = sbi->im[UPDATE_INO].ino_num; | ||
65 | si->orphans = sbi->im[ORPHAN_INO].ino_num; | 75 | si->orphans = sbi->im[ORPHAN_INO].ino_num; |
66 | si->utilization = utilization(sbi); | 76 | si->utilization = utilization(sbi); |
67 | 77 | ||
@@ -183,6 +193,9 @@ static void update_mem_info(struct f2fs_sb_info *sbi) | |||
183 | /* build nm */ | 193 | /* build nm */ |
184 | si->base_mem += sizeof(struct f2fs_nm_info); | 194 | si->base_mem += sizeof(struct f2fs_nm_info); |
185 | si->base_mem += __bitmap_size(sbi, NAT_BITMAP); | 195 | si->base_mem += __bitmap_size(sbi, NAT_BITMAP); |
196 | si->base_mem += (NM_I(sbi)->nat_bits_blocks << F2FS_BLKSIZE_BITS); | ||
197 | si->base_mem += NM_I(sbi)->nat_blocks * NAT_ENTRY_BITMAP_SIZE; | ||
198 | si->base_mem += NM_I(sbi)->nat_blocks / 8; | ||
186 | 199 | ||
187 | get_cache: | 200 | get_cache: |
188 | si->cache_mem = 0; | 201 | si->cache_mem = 0; |
@@ -192,8 +205,10 @@ get_cache: | |||
192 | si->cache_mem += sizeof(struct f2fs_gc_kthread); | 205 | si->cache_mem += sizeof(struct f2fs_gc_kthread); |
193 | 206 | ||
194 | /* build merge flush thread */ | 207 | /* build merge flush thread */ |
195 | if (SM_I(sbi)->cmd_control_info) | 208 | if (SM_I(sbi)->fcc_info) |
196 | si->cache_mem += sizeof(struct flush_cmd_control); | 209 | si->cache_mem += sizeof(struct flush_cmd_control); |
210 | if (SM_I(sbi)->dcc_info) | ||
211 | si->cache_mem += sizeof(struct discard_cmd_control); | ||
197 | 212 | ||
198 | /* free nids */ | 213 | /* free nids */ |
199 | si->cache_mem += (NM_I(sbi)->nid_cnt[FREE_NID_LIST] + | 214 | si->cache_mem += (NM_I(sbi)->nid_cnt[FREE_NID_LIST] + |
@@ -254,8 +269,8 @@ static int stat_show(struct seq_file *s, void *v) | |||
254 | si->inline_inode); | 269 | si->inline_inode); |
255 | seq_printf(s, " - Inline_dentry Inode: %u\n", | 270 | seq_printf(s, " - Inline_dentry Inode: %u\n", |
256 | si->inline_dir); | 271 | si->inline_dir); |
257 | seq_printf(s, " - Orphan Inode: %u\n", | 272 | seq_printf(s, " - Orphan/Append/Update Inode: %u, %u, %u\n", |
258 | si->orphans); | 273 | si->orphans, si->append, si->update); |
259 | seq_printf(s, "\nMain area: %d segs, %d secs %d zones\n", | 274 | seq_printf(s, "\nMain area: %d segs, %d secs %d zones\n", |
260 | si->main_area_segs, si->main_area_sections, | 275 | si->main_area_segs, si->main_area_sections, |
261 | si->main_area_zones); | 276 | si->main_area_zones); |
@@ -314,8 +329,11 @@ static int stat_show(struct seq_file *s, void *v) | |||
314 | seq_printf(s, " - Inner Struct Count: tree: %d(%d), node: %d\n", | 329 | seq_printf(s, " - Inner Struct Count: tree: %d(%d), node: %d\n", |
315 | si->ext_tree, si->zombie_tree, si->ext_node); | 330 | si->ext_tree, si->zombie_tree, si->ext_node); |
316 | seq_puts(s, "\nBalancing F2FS Async:\n"); | 331 | seq_puts(s, "\nBalancing F2FS Async:\n"); |
317 | seq_printf(s, " - inmem: %4d, wb_cp_data: %4d, wb_data: %4d\n", | 332 | seq_printf(s, " - IO (CP: %4d, Data: %4d, Flush: %4d, Discard: %4d)\n", |
318 | si->inmem_pages, si->nr_wb_cp_data, si->nr_wb_data); | 333 | si->nr_wb_cp_data, si->nr_wb_data, |
334 | si->nr_flush, si->nr_discard); | ||
335 | seq_printf(s, " - inmem: %4d, atomic IO: %4d (Max. %4d)\n", | ||
336 | si->inmem_pages, si->aw_cnt, si->max_aw_cnt); | ||
319 | seq_printf(s, " - nodes: %4d in %4d\n", | 337 | seq_printf(s, " - nodes: %4d in %4d\n", |
320 | si->ndirty_node, si->node_pages); | 338 | si->ndirty_node, si->node_pages); |
321 | seq_printf(s, " - dents: %4d in dirs:%4d (%4d)\n", | 339 | seq_printf(s, " - dents: %4d in dirs:%4d (%4d)\n", |
@@ -414,6 +432,9 @@ int f2fs_build_stats(struct f2fs_sb_info *sbi) | |||
414 | atomic_set(&sbi->inline_dir, 0); | 432 | atomic_set(&sbi->inline_dir, 0); |
415 | atomic_set(&sbi->inplace_count, 0); | 433 | atomic_set(&sbi->inplace_count, 0); |
416 | 434 | ||
435 | atomic_set(&sbi->aw_cnt, 0); | ||
436 | atomic_set(&sbi->max_aw_cnt, 0); | ||
437 | |||
417 | mutex_lock(&f2fs_stat_mutex); | 438 | mutex_lock(&f2fs_stat_mutex); |
418 | list_add_tail(&si->stat_list, &f2fs_stat_list); | 439 | list_add_tail(&si->stat_list, &f2fs_stat_list); |
419 | mutex_unlock(&f2fs_stat_mutex); | 440 | mutex_unlock(&f2fs_stat_mutex); |
diff --git a/fs/f2fs/dir.c b/fs/f2fs/dir.c index 18607fc5240d..4650c9b85de7 100644 --- a/fs/f2fs/dir.c +++ b/fs/f2fs/dir.c | |||
@@ -207,9 +207,13 @@ static struct f2fs_dir_entry *find_in_level(struct inode *dir, | |||
207 | f2fs_put_page(dentry_page, 0); | 207 | f2fs_put_page(dentry_page, 0); |
208 | } | 208 | } |
209 | 209 | ||
210 | if (!de && room && F2FS_I(dir)->chash != namehash) { | 210 | /* This is to increase the speed of f2fs_create */ |
211 | F2FS_I(dir)->chash = namehash; | 211 | if (!de && room) { |
212 | F2FS_I(dir)->clevel = level; | 212 | F2FS_I(dir)->task = current; |
213 | if (F2FS_I(dir)->chash != namehash) { | ||
214 | F2FS_I(dir)->chash = namehash; | ||
215 | F2FS_I(dir)->clevel = level; | ||
216 | } | ||
213 | } | 217 | } |
214 | 218 | ||
215 | return de; | 219 | return de; |
@@ -548,8 +552,10 @@ int f2fs_add_regular_entry(struct inode *dir, const struct qstr *new_name, | |||
548 | 552 | ||
549 | start: | 553 | start: |
550 | #ifdef CONFIG_F2FS_FAULT_INJECTION | 554 | #ifdef CONFIG_F2FS_FAULT_INJECTION |
551 | if (time_to_inject(F2FS_I_SB(dir), FAULT_DIR_DEPTH)) | 555 | if (time_to_inject(F2FS_I_SB(dir), FAULT_DIR_DEPTH)) { |
556 | f2fs_show_injection_info(FAULT_DIR_DEPTH); | ||
552 | return -ENOSPC; | 557 | return -ENOSPC; |
558 | } | ||
553 | #endif | 559 | #endif |
554 | if (unlikely(current_depth == MAX_DIR_HASH_DEPTH)) | 560 | if (unlikely(current_depth == MAX_DIR_HASH_DEPTH)) |
555 | return -ENOSPC; | 561 | return -ENOSPC; |
@@ -646,14 +652,34 @@ int __f2fs_add_link(struct inode *dir, const struct qstr *name, | |||
646 | struct inode *inode, nid_t ino, umode_t mode) | 652 | struct inode *inode, nid_t ino, umode_t mode) |
647 | { | 653 | { |
648 | struct fscrypt_name fname; | 654 | struct fscrypt_name fname; |
655 | struct page *page = NULL; | ||
656 | struct f2fs_dir_entry *de = NULL; | ||
649 | int err; | 657 | int err; |
650 | 658 | ||
651 | err = fscrypt_setup_filename(dir, name, 0, &fname); | 659 | err = fscrypt_setup_filename(dir, name, 0, &fname); |
652 | if (err) | 660 | if (err) |
653 | return err; | 661 | return err; |
654 | 662 | ||
655 | err = __f2fs_do_add_link(dir, &fname, inode, ino, mode); | 663 | /* |
656 | 664 | * An immature stakable filesystem shows a race condition between lookup | |
665 | * and create. If we have same task when doing lookup and create, it's | ||
666 | * definitely fine as expected by VFS normally. Otherwise, let's just | ||
667 | * verify on-disk dentry one more time, which guarantees filesystem | ||
668 | * consistency more. | ||
669 | */ | ||
670 | if (current != F2FS_I(dir)->task) { | ||
671 | de = __f2fs_find_entry(dir, &fname, &page); | ||
672 | F2FS_I(dir)->task = NULL; | ||
673 | } | ||
674 | if (de) { | ||
675 | f2fs_dentry_kunmap(dir, page); | ||
676 | f2fs_put_page(page, 0); | ||
677 | err = -EEXIST; | ||
678 | } else if (IS_ERR(page)) { | ||
679 | err = PTR_ERR(page); | ||
680 | } else { | ||
681 | err = __f2fs_do_add_link(dir, &fname, inode, ino, mode); | ||
682 | } | ||
657 | fscrypt_free_filename(&fname); | 683 | fscrypt_free_filename(&fname); |
658 | return err; | 684 | return err; |
659 | } | 685 | } |
diff --git a/fs/f2fs/extent_cache.c b/fs/f2fs/extent_cache.c index 4db44da7ef69..c6934f014e0f 100644 --- a/fs/f2fs/extent_cache.c +++ b/fs/f2fs/extent_cache.c | |||
@@ -77,7 +77,7 @@ static struct extent_tree *__grab_extent_tree(struct inode *inode) | |||
77 | struct extent_tree *et; | 77 | struct extent_tree *et; |
78 | nid_t ino = inode->i_ino; | 78 | nid_t ino = inode->i_ino; |
79 | 79 | ||
80 | down_write(&sbi->extent_tree_lock); | 80 | mutex_lock(&sbi->extent_tree_lock); |
81 | et = radix_tree_lookup(&sbi->extent_tree_root, ino); | 81 | et = radix_tree_lookup(&sbi->extent_tree_root, ino); |
82 | if (!et) { | 82 | if (!et) { |
83 | et = f2fs_kmem_cache_alloc(extent_tree_slab, GFP_NOFS); | 83 | et = f2fs_kmem_cache_alloc(extent_tree_slab, GFP_NOFS); |
@@ -94,7 +94,7 @@ static struct extent_tree *__grab_extent_tree(struct inode *inode) | |||
94 | atomic_dec(&sbi->total_zombie_tree); | 94 | atomic_dec(&sbi->total_zombie_tree); |
95 | list_del_init(&et->list); | 95 | list_del_init(&et->list); |
96 | } | 96 | } |
97 | up_write(&sbi->extent_tree_lock); | 97 | mutex_unlock(&sbi->extent_tree_lock); |
98 | 98 | ||
99 | /* never died until evict_inode */ | 99 | /* never died until evict_inode */ |
100 | F2FS_I(inode)->extent_tree = et; | 100 | F2FS_I(inode)->extent_tree = et; |
@@ -311,28 +311,24 @@ static struct extent_node *__lookup_extent_tree_ret(struct extent_tree *et, | |||
311 | tmp_node = parent; | 311 | tmp_node = parent; |
312 | if (parent && fofs > en->ei.fofs) | 312 | if (parent && fofs > en->ei.fofs) |
313 | tmp_node = rb_next(parent); | 313 | tmp_node = rb_next(parent); |
314 | *next_ex = tmp_node ? | 314 | *next_ex = rb_entry_safe(tmp_node, struct extent_node, rb_node); |
315 | rb_entry(tmp_node, struct extent_node, rb_node) : NULL; | ||
316 | 315 | ||
317 | tmp_node = parent; | 316 | tmp_node = parent; |
318 | if (parent && fofs < en->ei.fofs) | 317 | if (parent && fofs < en->ei.fofs) |
319 | tmp_node = rb_prev(parent); | 318 | tmp_node = rb_prev(parent); |
320 | *prev_ex = tmp_node ? | 319 | *prev_ex = rb_entry_safe(tmp_node, struct extent_node, rb_node); |
321 | rb_entry(tmp_node, struct extent_node, rb_node) : NULL; | ||
322 | return NULL; | 320 | return NULL; |
323 | 321 | ||
324 | lookup_neighbors: | 322 | lookup_neighbors: |
325 | if (fofs == en->ei.fofs) { | 323 | if (fofs == en->ei.fofs) { |
326 | /* lookup prev node for merging backward later */ | 324 | /* lookup prev node for merging backward later */ |
327 | tmp_node = rb_prev(&en->rb_node); | 325 | tmp_node = rb_prev(&en->rb_node); |
328 | *prev_ex = tmp_node ? | 326 | *prev_ex = rb_entry_safe(tmp_node, struct extent_node, rb_node); |
329 | rb_entry(tmp_node, struct extent_node, rb_node) : NULL; | ||
330 | } | 327 | } |
331 | if (fofs == en->ei.fofs + en->ei.len - 1) { | 328 | if (fofs == en->ei.fofs + en->ei.len - 1) { |
332 | /* lookup next node for merging frontward later */ | 329 | /* lookup next node for merging frontward later */ |
333 | tmp_node = rb_next(&en->rb_node); | 330 | tmp_node = rb_next(&en->rb_node); |
334 | *next_ex = tmp_node ? | 331 | *next_ex = rb_entry_safe(tmp_node, struct extent_node, rb_node); |
335 | rb_entry(tmp_node, struct extent_node, rb_node) : NULL; | ||
336 | } | 332 | } |
337 | return en; | 333 | return en; |
338 | } | 334 | } |
@@ -352,11 +348,12 @@ static struct extent_node *__try_merge_extent_node(struct inode *inode, | |||
352 | } | 348 | } |
353 | 349 | ||
354 | if (next_ex && __is_front_mergeable(ei, &next_ex->ei)) { | 350 | if (next_ex && __is_front_mergeable(ei, &next_ex->ei)) { |
355 | if (en) | ||
356 | __release_extent_node(sbi, et, prev_ex); | ||
357 | next_ex->ei.fofs = ei->fofs; | 351 | next_ex->ei.fofs = ei->fofs; |
358 | next_ex->ei.blk = ei->blk; | 352 | next_ex->ei.blk = ei->blk; |
359 | next_ex->ei.len += ei->len; | 353 | next_ex->ei.len += ei->len; |
354 | if (en) | ||
355 | __release_extent_node(sbi, et, prev_ex); | ||
356 | |||
360 | en = next_ex; | 357 | en = next_ex; |
361 | } | 358 | } |
362 | 359 | ||
@@ -416,7 +413,7 @@ do_insert: | |||
416 | return en; | 413 | return en; |
417 | } | 414 | } |
418 | 415 | ||
419 | static unsigned int f2fs_update_extent_tree_range(struct inode *inode, | 416 | static void f2fs_update_extent_tree_range(struct inode *inode, |
420 | pgoff_t fofs, block_t blkaddr, unsigned int len) | 417 | pgoff_t fofs, block_t blkaddr, unsigned int len) |
421 | { | 418 | { |
422 | struct f2fs_sb_info *sbi = F2FS_I_SB(inode); | 419 | struct f2fs_sb_info *sbi = F2FS_I_SB(inode); |
@@ -429,7 +426,7 @@ static unsigned int f2fs_update_extent_tree_range(struct inode *inode, | |||
429 | unsigned int pos = (unsigned int)fofs; | 426 | unsigned int pos = (unsigned int)fofs; |
430 | 427 | ||
431 | if (!et) | 428 | if (!et) |
432 | return false; | 429 | return; |
433 | 430 | ||
434 | trace_f2fs_update_extent_tree_range(inode, fofs, blkaddr, len); | 431 | trace_f2fs_update_extent_tree_range(inode, fofs, blkaddr, len); |
435 | 432 | ||
@@ -437,7 +434,7 @@ static unsigned int f2fs_update_extent_tree_range(struct inode *inode, | |||
437 | 434 | ||
438 | if (is_inode_flag_set(inode, FI_NO_EXTENT)) { | 435 | if (is_inode_flag_set(inode, FI_NO_EXTENT)) { |
439 | write_unlock(&et->lock); | 436 | write_unlock(&et->lock); |
440 | return false; | 437 | return; |
441 | } | 438 | } |
442 | 439 | ||
443 | prev = et->largest; | 440 | prev = et->largest; |
@@ -492,9 +489,8 @@ static unsigned int f2fs_update_extent_tree_range(struct inode *inode, | |||
492 | if (!next_en) { | 489 | if (!next_en) { |
493 | struct rb_node *node = rb_next(&en->rb_node); | 490 | struct rb_node *node = rb_next(&en->rb_node); |
494 | 491 | ||
495 | next_en = node ? | 492 | next_en = rb_entry_safe(node, struct extent_node, |
496 | rb_entry(node, struct extent_node, rb_node) | 493 | rb_node); |
497 | : NULL; | ||
498 | } | 494 | } |
499 | 495 | ||
500 | if (parts) | 496 | if (parts) |
@@ -535,8 +531,6 @@ static unsigned int f2fs_update_extent_tree_range(struct inode *inode, | |||
535 | __free_extent_tree(sbi, et); | 531 | __free_extent_tree(sbi, et); |
536 | 532 | ||
537 | write_unlock(&et->lock); | 533 | write_unlock(&et->lock); |
538 | |||
539 | return !__is_extent_same(&prev, &et->largest); | ||
540 | } | 534 | } |
541 | 535 | ||
542 | unsigned int f2fs_shrink_extent_tree(struct f2fs_sb_info *sbi, int nr_shrink) | 536 | unsigned int f2fs_shrink_extent_tree(struct f2fs_sb_info *sbi, int nr_shrink) |
@@ -552,7 +546,7 @@ unsigned int f2fs_shrink_extent_tree(struct f2fs_sb_info *sbi, int nr_shrink) | |||
552 | if (!atomic_read(&sbi->total_zombie_tree)) | 546 | if (!atomic_read(&sbi->total_zombie_tree)) |
553 | goto free_node; | 547 | goto free_node; |
554 | 548 | ||
555 | if (!down_write_trylock(&sbi->extent_tree_lock)) | 549 | if (!mutex_trylock(&sbi->extent_tree_lock)) |
556 | goto out; | 550 | goto out; |
557 | 551 | ||
558 | /* 1. remove unreferenced extent tree */ | 552 | /* 1. remove unreferenced extent tree */ |
@@ -574,11 +568,11 @@ unsigned int f2fs_shrink_extent_tree(struct f2fs_sb_info *sbi, int nr_shrink) | |||
574 | goto unlock_out; | 568 | goto unlock_out; |
575 | cond_resched(); | 569 | cond_resched(); |
576 | } | 570 | } |
577 | up_write(&sbi->extent_tree_lock); | 571 | mutex_unlock(&sbi->extent_tree_lock); |
578 | 572 | ||
579 | free_node: | 573 | free_node: |
580 | /* 2. remove LRU extent entries */ | 574 | /* 2. remove LRU extent entries */ |
581 | if (!down_write_trylock(&sbi->extent_tree_lock)) | 575 | if (!mutex_trylock(&sbi->extent_tree_lock)) |
582 | goto out; | 576 | goto out; |
583 | 577 | ||
584 | remained = nr_shrink - (node_cnt + tree_cnt); | 578 | remained = nr_shrink - (node_cnt + tree_cnt); |
@@ -608,7 +602,7 @@ free_node: | |||
608 | spin_unlock(&sbi->extent_lock); | 602 | spin_unlock(&sbi->extent_lock); |
609 | 603 | ||
610 | unlock_out: | 604 | unlock_out: |
611 | up_write(&sbi->extent_tree_lock); | 605 | mutex_unlock(&sbi->extent_tree_lock); |
612 | out: | 606 | out: |
613 | trace_f2fs_shrink_extent_tree(sbi, node_cnt, tree_cnt); | 607 | trace_f2fs_shrink_extent_tree(sbi, node_cnt, tree_cnt); |
614 | 608 | ||
@@ -655,10 +649,10 @@ void f2fs_destroy_extent_tree(struct inode *inode) | |||
655 | 649 | ||
656 | if (inode->i_nlink && !is_bad_inode(inode) && | 650 | if (inode->i_nlink && !is_bad_inode(inode) && |
657 | atomic_read(&et->node_cnt)) { | 651 | atomic_read(&et->node_cnt)) { |
658 | down_write(&sbi->extent_tree_lock); | 652 | mutex_lock(&sbi->extent_tree_lock); |
659 | list_add_tail(&et->list, &sbi->zombie_list); | 653 | list_add_tail(&et->list, &sbi->zombie_list); |
660 | atomic_inc(&sbi->total_zombie_tree); | 654 | atomic_inc(&sbi->total_zombie_tree); |
661 | up_write(&sbi->extent_tree_lock); | 655 | mutex_unlock(&sbi->extent_tree_lock); |
662 | return; | 656 | return; |
663 | } | 657 | } |
664 | 658 | ||
@@ -666,12 +660,12 @@ void f2fs_destroy_extent_tree(struct inode *inode) | |||
666 | node_cnt = f2fs_destroy_extent_node(inode); | 660 | node_cnt = f2fs_destroy_extent_node(inode); |
667 | 661 | ||
668 | /* delete extent tree entry in radix tree */ | 662 | /* delete extent tree entry in radix tree */ |
669 | down_write(&sbi->extent_tree_lock); | 663 | mutex_lock(&sbi->extent_tree_lock); |
670 | f2fs_bug_on(sbi, atomic_read(&et->node_cnt)); | 664 | f2fs_bug_on(sbi, atomic_read(&et->node_cnt)); |
671 | radix_tree_delete(&sbi->extent_tree_root, inode->i_ino); | 665 | radix_tree_delete(&sbi->extent_tree_root, inode->i_ino); |
672 | kmem_cache_free(extent_tree_slab, et); | 666 | kmem_cache_free(extent_tree_slab, et); |
673 | atomic_dec(&sbi->total_ext_tree); | 667 | atomic_dec(&sbi->total_ext_tree); |
674 | up_write(&sbi->extent_tree_lock); | 668 | mutex_unlock(&sbi->extent_tree_lock); |
675 | 669 | ||
676 | F2FS_I(inode)->extent_tree = NULL; | 670 | F2FS_I(inode)->extent_tree = NULL; |
677 | 671 | ||
@@ -718,7 +712,7 @@ void f2fs_update_extent_cache_range(struct dnode_of_data *dn, | |||
718 | void init_extent_cache_info(struct f2fs_sb_info *sbi) | 712 | void init_extent_cache_info(struct f2fs_sb_info *sbi) |
719 | { | 713 | { |
720 | INIT_RADIX_TREE(&sbi->extent_tree_root, GFP_NOIO); | 714 | INIT_RADIX_TREE(&sbi->extent_tree_root, GFP_NOIO); |
721 | init_rwsem(&sbi->extent_tree_lock); | 715 | mutex_init(&sbi->extent_tree_lock); |
722 | INIT_LIST_HEAD(&sbi->extent_list); | 716 | INIT_LIST_HEAD(&sbi->extent_list); |
723 | spin_lock_init(&sbi->extent_lock); | 717 | spin_lock_init(&sbi->extent_lock); |
724 | atomic_set(&sbi->total_ext_tree, 0); | 718 | atomic_set(&sbi->total_ext_tree, 0); |
diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h index 069fc7277d8d..d1483136fed6 100644 --- a/fs/f2fs/f2fs.h +++ b/fs/f2fs/f2fs.h | |||
@@ -112,9 +112,9 @@ struct f2fs_mount_info { | |||
112 | #define F2FS_HAS_FEATURE(sb, mask) \ | 112 | #define F2FS_HAS_FEATURE(sb, mask) \ |
113 | ((F2FS_SB(sb)->raw_super->feature & cpu_to_le32(mask)) != 0) | 113 | ((F2FS_SB(sb)->raw_super->feature & cpu_to_le32(mask)) != 0) |
114 | #define F2FS_SET_FEATURE(sb, mask) \ | 114 | #define F2FS_SET_FEATURE(sb, mask) \ |
115 | F2FS_SB(sb)->raw_super->feature |= cpu_to_le32(mask) | 115 | (F2FS_SB(sb)->raw_super->feature |= cpu_to_le32(mask)) |
116 | #define F2FS_CLEAR_FEATURE(sb, mask) \ | 116 | #define F2FS_CLEAR_FEATURE(sb, mask) \ |
117 | F2FS_SB(sb)->raw_super->feature &= ~cpu_to_le32(mask) | 117 | (F2FS_SB(sb)->raw_super->feature &= ~cpu_to_le32(mask)) |
118 | 118 | ||
119 | /* | 119 | /* |
120 | * For checkpoint manager | 120 | * For checkpoint manager |
@@ -132,11 +132,14 @@ enum { | |||
132 | CP_DISCARD, | 132 | CP_DISCARD, |
133 | }; | 133 | }; |
134 | 134 | ||
135 | #define DEF_BATCHED_TRIM_SECTIONS 2 | 135 | #define DEF_BATCHED_TRIM_SECTIONS 2048 |
136 | #define BATCHED_TRIM_SEGMENTS(sbi) \ | 136 | #define BATCHED_TRIM_SEGMENTS(sbi) \ |
137 | (SM_I(sbi)->trim_sections * (sbi)->segs_per_sec) | 137 | (SM_I(sbi)->trim_sections * (sbi)->segs_per_sec) |
138 | #define BATCHED_TRIM_BLOCKS(sbi) \ | 138 | #define BATCHED_TRIM_BLOCKS(sbi) \ |
139 | (BATCHED_TRIM_SEGMENTS(sbi) << (sbi)->log_blocks_per_seg) | 139 | (BATCHED_TRIM_SEGMENTS(sbi) << (sbi)->log_blocks_per_seg) |
140 | #define MAX_DISCARD_BLOCKS(sbi) \ | ||
141 | ((1 << (sbi)->log_blocks_per_seg) * (sbi)->segs_per_sec) | ||
142 | #define DISCARD_ISSUE_RATE 8 | ||
140 | #define DEF_CP_INTERVAL 60 /* 60 secs */ | 143 | #define DEF_CP_INTERVAL 60 /* 60 secs */ |
141 | #define DEF_IDLE_INTERVAL 5 /* 5 secs */ | 144 | #define DEF_IDLE_INTERVAL 5 /* 5 secs */ |
142 | 145 | ||
@@ -185,11 +188,30 @@ struct discard_entry { | |||
185 | int len; /* # of consecutive blocks of the discard */ | 188 | int len; /* # of consecutive blocks of the discard */ |
186 | }; | 189 | }; |
187 | 190 | ||
188 | struct bio_entry { | 191 | enum { |
189 | struct list_head list; | 192 | D_PREP, |
190 | struct bio *bio; | 193 | D_SUBMIT, |
191 | struct completion event; | 194 | D_DONE, |
192 | int error; | 195 | }; |
196 | |||
197 | struct discard_cmd { | ||
198 | struct list_head list; /* command list */ | ||
199 | struct completion wait; /* compleation */ | ||
200 | block_t lstart; /* logical start address */ | ||
201 | block_t len; /* length */ | ||
202 | struct bio *bio; /* bio */ | ||
203 | int state; /* state */ | ||
204 | }; | ||
205 | |||
206 | struct discard_cmd_control { | ||
207 | struct task_struct *f2fs_issue_discard; /* discard thread */ | ||
208 | struct list_head discard_entry_list; /* 4KB discard entry list */ | ||
209 | int nr_discards; /* # of discards in the list */ | ||
210 | struct list_head discard_cmd_list; /* discard cmd list */ | ||
211 | wait_queue_head_t discard_wait_queue; /* waiting queue for wake-up */ | ||
212 | struct mutex cmd_lock; | ||
213 | int max_discards; /* max. discards to be issued */ | ||
214 | atomic_t submit_discard; /* # of issued discard */ | ||
193 | }; | 215 | }; |
194 | 216 | ||
195 | /* for the list of fsync inodes, used only during recovery */ | 217 | /* for the list of fsync inodes, used only during recovery */ |
@@ -214,6 +236,7 @@ struct fsync_inode_entry { | |||
214 | static inline int update_nats_in_cursum(struct f2fs_journal *journal, int i) | 236 | static inline int update_nats_in_cursum(struct f2fs_journal *journal, int i) |
215 | { | 237 | { |
216 | int before = nats_in_cursum(journal); | 238 | int before = nats_in_cursum(journal); |
239 | |||
217 | journal->n_nats = cpu_to_le16(before + i); | 240 | journal->n_nats = cpu_to_le16(before + i); |
218 | return before; | 241 | return before; |
219 | } | 242 | } |
@@ -221,6 +244,7 @@ static inline int update_nats_in_cursum(struct f2fs_journal *journal, int i) | |||
221 | static inline int update_sits_in_cursum(struct f2fs_journal *journal, int i) | 244 | static inline int update_sits_in_cursum(struct f2fs_journal *journal, int i) |
222 | { | 245 | { |
223 | int before = sits_in_cursum(journal); | 246 | int before = sits_in_cursum(journal); |
247 | |||
224 | journal->n_sits = cpu_to_le16(before + i); | 248 | journal->n_sits = cpu_to_le16(before + i); |
225 | return before; | 249 | return before; |
226 | } | 250 | } |
@@ -306,12 +330,14 @@ static inline void make_dentry_ptr(struct inode *inode, | |||
306 | 330 | ||
307 | if (type == 1) { | 331 | if (type == 1) { |
308 | struct f2fs_dentry_block *t = (struct f2fs_dentry_block *)src; | 332 | struct f2fs_dentry_block *t = (struct f2fs_dentry_block *)src; |
333 | |||
309 | d->max = NR_DENTRY_IN_BLOCK; | 334 | d->max = NR_DENTRY_IN_BLOCK; |
310 | d->bitmap = &t->dentry_bitmap; | 335 | d->bitmap = &t->dentry_bitmap; |
311 | d->dentry = t->dentry; | 336 | d->dentry = t->dentry; |
312 | d->filename = t->filename; | 337 | d->filename = t->filename; |
313 | } else { | 338 | } else { |
314 | struct f2fs_inline_dentry *t = (struct f2fs_inline_dentry *)src; | 339 | struct f2fs_inline_dentry *t = (struct f2fs_inline_dentry *)src; |
340 | |||
315 | d->max = NR_INLINE_DENTRY; | 341 | d->max = NR_INLINE_DENTRY; |
316 | d->bitmap = &t->dentry_bitmap; | 342 | d->bitmap = &t->dentry_bitmap; |
317 | d->dentry = t->dentry; | 343 | d->dentry = t->dentry; |
@@ -438,8 +464,8 @@ struct f2fs_inode_info { | |||
438 | atomic_t dirty_pages; /* # of dirty pages */ | 464 | atomic_t dirty_pages; /* # of dirty pages */ |
439 | f2fs_hash_t chash; /* hash value of given file name */ | 465 | f2fs_hash_t chash; /* hash value of given file name */ |
440 | unsigned int clevel; /* maximum level of given file name */ | 466 | unsigned int clevel; /* maximum level of given file name */ |
467 | struct task_struct *task; /* lookup and create consistency */ | ||
441 | nid_t i_xattr_nid; /* node id that contains xattrs */ | 468 | nid_t i_xattr_nid; /* node id that contains xattrs */ |
442 | unsigned long long xattr_ver; /* cp version of xattr modification */ | ||
443 | loff_t last_disk_size; /* lastly written file size */ | 469 | loff_t last_disk_size; /* lastly written file size */ |
444 | 470 | ||
445 | struct list_head dirty_list; /* dirty list for dirs and files */ | 471 | struct list_head dirty_list; /* dirty list for dirs and files */ |
@@ -474,13 +500,6 @@ static inline void set_extent_info(struct extent_info *ei, unsigned int fofs, | |||
474 | ei->len = len; | 500 | ei->len = len; |
475 | } | 501 | } |
476 | 502 | ||
477 | static inline bool __is_extent_same(struct extent_info *ei1, | ||
478 | struct extent_info *ei2) | ||
479 | { | ||
480 | return (ei1->fofs == ei2->fofs && ei1->blk == ei2->blk && | ||
481 | ei1->len == ei2->len); | ||
482 | } | ||
483 | |||
484 | static inline bool __is_extent_mergeable(struct extent_info *back, | 503 | static inline bool __is_extent_mergeable(struct extent_info *back, |
485 | struct extent_info *front) | 504 | struct extent_info *front) |
486 | { | 505 | { |
@@ -500,7 +519,7 @@ static inline bool __is_front_mergeable(struct extent_info *cur, | |||
500 | return __is_extent_mergeable(cur, front); | 519 | return __is_extent_mergeable(cur, front); |
501 | } | 520 | } |
502 | 521 | ||
503 | extern void f2fs_mark_inode_dirty_sync(struct inode *, bool); | 522 | extern void f2fs_mark_inode_dirty_sync(struct inode *inode, bool sync); |
504 | static inline void __try_update_largest_extent(struct inode *inode, | 523 | static inline void __try_update_largest_extent(struct inode *inode, |
505 | struct extent_tree *et, struct extent_node *en) | 524 | struct extent_tree *et, struct extent_node *en) |
506 | { | 525 | { |
@@ -532,6 +551,7 @@ struct f2fs_nm_info { | |||
532 | struct list_head nat_entries; /* cached nat entry list (clean) */ | 551 | struct list_head nat_entries; /* cached nat entry list (clean) */ |
533 | unsigned int nat_cnt; /* the # of cached nat entries */ | 552 | unsigned int nat_cnt; /* the # of cached nat entries */ |
534 | unsigned int dirty_nat_cnt; /* total num of nat entries in set */ | 553 | unsigned int dirty_nat_cnt; /* total num of nat entries in set */ |
554 | unsigned int nat_blocks; /* # of nat blocks */ | ||
535 | 555 | ||
536 | /* free node ids management */ | 556 | /* free node ids management */ |
537 | struct radix_tree_root free_nid_root;/* root of the free_nid cache */ | 557 | struct radix_tree_root free_nid_root;/* root of the free_nid cache */ |
@@ -539,9 +559,19 @@ struct f2fs_nm_info { | |||
539 | unsigned int nid_cnt[MAX_NID_LIST]; /* the number of free node id */ | 559 | unsigned int nid_cnt[MAX_NID_LIST]; /* the number of free node id */ |
540 | spinlock_t nid_list_lock; /* protect nid lists ops */ | 560 | spinlock_t nid_list_lock; /* protect nid lists ops */ |
541 | struct mutex build_lock; /* lock for build free nids */ | 561 | struct mutex build_lock; /* lock for build free nids */ |
562 | unsigned char (*free_nid_bitmap)[NAT_ENTRY_BITMAP_SIZE]; | ||
563 | unsigned char *nat_block_bitmap; | ||
542 | 564 | ||
543 | /* for checkpoint */ | 565 | /* for checkpoint */ |
544 | char *nat_bitmap; /* NAT bitmap pointer */ | 566 | char *nat_bitmap; /* NAT bitmap pointer */ |
567 | |||
568 | unsigned int nat_bits_blocks; /* # of nat bits blocks */ | ||
569 | unsigned char *nat_bits; /* NAT bits blocks */ | ||
570 | unsigned char *full_nat_bits; /* full NAT pages */ | ||
571 | unsigned char *empty_nat_bits; /* empty NAT pages */ | ||
572 | #ifdef CONFIG_F2FS_CHECK_FS | ||
573 | char *nat_bitmap_mir; /* NAT bitmap mirror */ | ||
574 | #endif | ||
545 | int bitmap_size; /* bitmap size */ | 575 | int bitmap_size; /* bitmap size */ |
546 | }; | 576 | }; |
547 | 577 | ||
@@ -632,12 +662,6 @@ struct f2fs_sm_info { | |||
632 | /* a threshold to reclaim prefree segments */ | 662 | /* a threshold to reclaim prefree segments */ |
633 | unsigned int rec_prefree_segments; | 663 | unsigned int rec_prefree_segments; |
634 | 664 | ||
635 | /* for small discard management */ | ||
636 | struct list_head discard_list; /* 4KB discard list */ | ||
637 | struct list_head wait_list; /* linked with issued discard bio */ | ||
638 | int nr_discards; /* # of discards in the list */ | ||
639 | int max_discards; /* max. discards to be issued */ | ||
640 | |||
641 | /* for batched trimming */ | 665 | /* for batched trimming */ |
642 | unsigned int trim_sections; /* # of sections to trim */ | 666 | unsigned int trim_sections; /* # of sections to trim */ |
643 | 667 | ||
@@ -648,8 +672,10 @@ struct f2fs_sm_info { | |||
648 | unsigned int min_fsync_blocks; /* threshold for fsync */ | 672 | unsigned int min_fsync_blocks; /* threshold for fsync */ |
649 | 673 | ||
650 | /* for flush command control */ | 674 | /* for flush command control */ |
651 | struct flush_cmd_control *cmd_control_info; | 675 | struct flush_cmd_control *fcc_info; |
652 | 676 | ||
677 | /* for discard command control */ | ||
678 | struct discard_cmd_control *dcc_info; | ||
653 | }; | 679 | }; |
654 | 680 | ||
655 | /* | 681 | /* |
@@ -708,6 +734,7 @@ struct f2fs_io_info { | |||
708 | block_t old_blkaddr; /* old block address before Cow */ | 734 | block_t old_blkaddr; /* old block address before Cow */ |
709 | struct page *page; /* page to be written */ | 735 | struct page *page; /* page to be written */ |
710 | struct page *encrypted_page; /* encrypted page */ | 736 | struct page *encrypted_page; /* encrypted page */ |
737 | bool submitted; /* indicate IO submission */ | ||
711 | }; | 738 | }; |
712 | 739 | ||
713 | #define is_read_io(rw) (rw == READ) | 740 | #define is_read_io(rw) (rw == READ) |
@@ -787,6 +814,8 @@ struct f2fs_sb_info { | |||
787 | struct f2fs_bio_info read_io; /* for read bios */ | 814 | struct f2fs_bio_info read_io; /* for read bios */ |
788 | struct f2fs_bio_info write_io[NR_PAGE_TYPE]; /* for write bios */ | 815 | struct f2fs_bio_info write_io[NR_PAGE_TYPE]; /* for write bios */ |
789 | struct mutex wio_mutex[NODE + 1]; /* bio ordering for NODE/DATA */ | 816 | struct mutex wio_mutex[NODE + 1]; /* bio ordering for NODE/DATA */ |
817 | int write_io_size_bits; /* Write IO size bits */ | ||
818 | mempool_t *write_io_dummy; /* Dummy pages */ | ||
790 | 819 | ||
791 | /* for checkpoint */ | 820 | /* for checkpoint */ |
792 | struct f2fs_checkpoint *ckpt; /* raw checkpoint pointer */ | 821 | struct f2fs_checkpoint *ckpt; /* raw checkpoint pointer */ |
@@ -811,7 +840,7 @@ struct f2fs_sb_info { | |||
811 | 840 | ||
812 | /* for extent tree cache */ | 841 | /* for extent tree cache */ |
813 | struct radix_tree_root extent_tree_root;/* cache extent cache entries */ | 842 | struct radix_tree_root extent_tree_root;/* cache extent cache entries */ |
814 | struct rw_semaphore extent_tree_lock; /* locking extent radix tree */ | 843 | struct mutex extent_tree_lock; /* locking extent radix tree */ |
815 | struct list_head extent_list; /* lru list for shrinker */ | 844 | struct list_head extent_list; /* lru list for shrinker */ |
816 | spinlock_t extent_lock; /* locking extent lru list */ | 845 | spinlock_t extent_lock; /* locking extent lru list */ |
817 | atomic_t total_ext_tree; /* extent tree count */ | 846 | atomic_t total_ext_tree; /* extent tree count */ |
@@ -858,6 +887,9 @@ struct f2fs_sb_info { | |||
858 | struct f2fs_gc_kthread *gc_thread; /* GC thread */ | 887 | struct f2fs_gc_kthread *gc_thread; /* GC thread */ |
859 | unsigned int cur_victim_sec; /* current victim section num */ | 888 | unsigned int cur_victim_sec; /* current victim section num */ |
860 | 889 | ||
890 | /* threshold for converting bg victims for fg */ | ||
891 | u64 fggc_threshold; | ||
892 | |||
861 | /* maximum # of trials to find a victim segment for SSR and GC */ | 893 | /* maximum # of trials to find a victim segment for SSR and GC */ |
862 | unsigned int max_victim_search; | 894 | unsigned int max_victim_search; |
863 | 895 | ||
@@ -877,6 +909,8 @@ struct f2fs_sb_info { | |||
877 | atomic_t inline_xattr; /* # of inline_xattr inodes */ | 909 | atomic_t inline_xattr; /* # of inline_xattr inodes */ |
878 | atomic_t inline_inode; /* # of inline_data inodes */ | 910 | atomic_t inline_inode; /* # of inline_data inodes */ |
879 | atomic_t inline_dir; /* # of inline_dentry inodes */ | 911 | atomic_t inline_dir; /* # of inline_dentry inodes */ |
912 | atomic_t aw_cnt; /* # of atomic writes */ | ||
913 | atomic_t max_aw_cnt; /* max # of atomic writes */ | ||
880 | int bg_gc; /* background gc calls */ | 914 | int bg_gc; /* background gc calls */ |
881 | unsigned int ndirty_inode[NR_INODE_TYPE]; /* # of dirty inodes */ | 915 | unsigned int ndirty_inode[NR_INODE_TYPE]; /* # of dirty inodes */ |
882 | #endif | 916 | #endif |
@@ -908,6 +942,10 @@ struct f2fs_sb_info { | |||
908 | }; | 942 | }; |
909 | 943 | ||
910 | #ifdef CONFIG_F2FS_FAULT_INJECTION | 944 | #ifdef CONFIG_F2FS_FAULT_INJECTION |
945 | #define f2fs_show_injection_info(type) \ | ||
946 | printk("%sF2FS-fs : inject %s in %s of %pF\n", \ | ||
947 | KERN_INFO, fault_name[type], \ | ||
948 | __func__, __builtin_return_address(0)) | ||
911 | static inline bool time_to_inject(struct f2fs_sb_info *sbi, int type) | 949 | static inline bool time_to_inject(struct f2fs_sb_info *sbi, int type) |
912 | { | 950 | { |
913 | struct f2fs_fault_info *ffi = &sbi->fault_info; | 951 | struct f2fs_fault_info *ffi = &sbi->fault_info; |
@@ -921,10 +959,6 @@ static inline bool time_to_inject(struct f2fs_sb_info *sbi, int type) | |||
921 | atomic_inc(&ffi->inject_ops); | 959 | atomic_inc(&ffi->inject_ops); |
922 | if (atomic_read(&ffi->inject_ops) >= ffi->inject_rate) { | 960 | if (atomic_read(&ffi->inject_ops) >= ffi->inject_rate) { |
923 | atomic_set(&ffi->inject_ops, 0); | 961 | atomic_set(&ffi->inject_ops, 0); |
924 | printk("%sF2FS-fs : inject %s in %pF\n", | ||
925 | KERN_INFO, | ||
926 | fault_name[type], | ||
927 | __builtin_return_address(0)); | ||
928 | return true; | 962 | return true; |
929 | } | 963 | } |
930 | return false; | 964 | return false; |
@@ -1089,6 +1123,12 @@ static inline unsigned long long cur_cp_version(struct f2fs_checkpoint *cp) | |||
1089 | return le64_to_cpu(cp->checkpoint_ver); | 1123 | return le64_to_cpu(cp->checkpoint_ver); |
1090 | } | 1124 | } |
1091 | 1125 | ||
1126 | static inline __u64 cur_cp_crc(struct f2fs_checkpoint *cp) | ||
1127 | { | ||
1128 | size_t crc_offset = le32_to_cpu(cp->checksum_offset); | ||
1129 | return le32_to_cpu(*((__le32 *)((unsigned char *)cp + crc_offset))); | ||
1130 | } | ||
1131 | |||
1092 | static inline bool __is_set_ckpt_flags(struct f2fs_checkpoint *cp, unsigned int f) | 1132 | static inline bool __is_set_ckpt_flags(struct f2fs_checkpoint *cp, unsigned int f) |
1093 | { | 1133 | { |
1094 | unsigned int ckpt_flags = le32_to_cpu(cp->ckpt_flags); | 1134 | unsigned int ckpt_flags = le32_to_cpu(cp->ckpt_flags); |
@@ -1133,6 +1173,27 @@ static inline void clear_ckpt_flags(struct f2fs_sb_info *sbi, unsigned int f) | |||
1133 | spin_unlock(&sbi->cp_lock); | 1173 | spin_unlock(&sbi->cp_lock); |
1134 | } | 1174 | } |
1135 | 1175 | ||
1176 | static inline void disable_nat_bits(struct f2fs_sb_info *sbi, bool lock) | ||
1177 | { | ||
1178 | set_sbi_flag(sbi, SBI_NEED_FSCK); | ||
1179 | |||
1180 | if (lock) | ||
1181 | spin_lock(&sbi->cp_lock); | ||
1182 | __clear_ckpt_flags(F2FS_CKPT(sbi), CP_NAT_BITS_FLAG); | ||
1183 | kfree(NM_I(sbi)->nat_bits); | ||
1184 | NM_I(sbi)->nat_bits = NULL; | ||
1185 | if (lock) | ||
1186 | spin_unlock(&sbi->cp_lock); | ||
1187 | } | ||
1188 | |||
1189 | static inline bool enabled_nat_bits(struct f2fs_sb_info *sbi, | ||
1190 | struct cp_control *cpc) | ||
1191 | { | ||
1192 | bool set = is_set_ckpt_flags(sbi, CP_NAT_BITS_FLAG); | ||
1193 | |||
1194 | return (cpc) ? (cpc->reason == CP_UMOUNT) && set : set; | ||
1195 | } | ||
1196 | |||
1136 | static inline void f2fs_lock_op(struct f2fs_sb_info *sbi) | 1197 | static inline void f2fs_lock_op(struct f2fs_sb_info *sbi) |
1137 | { | 1198 | { |
1138 | down_read(&sbi->cp_rwsem); | 1199 | down_read(&sbi->cp_rwsem); |
@@ -1212,8 +1273,10 @@ static inline bool inc_valid_block_count(struct f2fs_sb_info *sbi, | |||
1212 | blkcnt_t diff; | 1273 | blkcnt_t diff; |
1213 | 1274 | ||
1214 | #ifdef CONFIG_F2FS_FAULT_INJECTION | 1275 | #ifdef CONFIG_F2FS_FAULT_INJECTION |
1215 | if (time_to_inject(sbi, FAULT_BLOCK)) | 1276 | if (time_to_inject(sbi, FAULT_BLOCK)) { |
1277 | f2fs_show_injection_info(FAULT_BLOCK); | ||
1216 | return false; | 1278 | return false; |
1279 | } | ||
1217 | #endif | 1280 | #endif |
1218 | /* | 1281 | /* |
1219 | * let's increase this in prior to actual block count change in order | 1282 | * let's increase this in prior to actual block count change in order |
@@ -1449,11 +1512,14 @@ static inline struct page *f2fs_grab_cache_page(struct address_space *mapping, | |||
1449 | { | 1512 | { |
1450 | #ifdef CONFIG_F2FS_FAULT_INJECTION | 1513 | #ifdef CONFIG_F2FS_FAULT_INJECTION |
1451 | struct page *page = find_lock_page(mapping, index); | 1514 | struct page *page = find_lock_page(mapping, index); |
1515 | |||
1452 | if (page) | 1516 | if (page) |
1453 | return page; | 1517 | return page; |
1454 | 1518 | ||
1455 | if (time_to_inject(F2FS_M_SB(mapping), FAULT_PAGE_ALLOC)) | 1519 | if (time_to_inject(F2FS_M_SB(mapping), FAULT_PAGE_ALLOC)) { |
1520 | f2fs_show_injection_info(FAULT_PAGE_ALLOC); | ||
1456 | return NULL; | 1521 | return NULL; |
1522 | } | ||
1457 | #endif | 1523 | #endif |
1458 | if (!for_write) | 1524 | if (!for_write) |
1459 | return grab_cache_page(mapping, index); | 1525 | return grab_cache_page(mapping, index); |
@@ -1532,6 +1598,7 @@ static inline void f2fs_radix_tree_insert(struct radix_tree_root *root, | |||
1532 | static inline bool IS_INODE(struct page *page) | 1598 | static inline bool IS_INODE(struct page *page) |
1533 | { | 1599 | { |
1534 | struct f2fs_node *p = F2FS_NODE(page); | 1600 | struct f2fs_node *p = F2FS_NODE(page); |
1601 | |||
1535 | return RAW_IS_INODE(p); | 1602 | return RAW_IS_INODE(p); |
1536 | } | 1603 | } |
1537 | 1604 | ||
@@ -1545,6 +1612,7 @@ static inline block_t datablock_addr(struct page *node_page, | |||
1545 | { | 1612 | { |
1546 | struct f2fs_node *raw_node; | 1613 | struct f2fs_node *raw_node; |
1547 | __le32 *addr_array; | 1614 | __le32 *addr_array; |
1615 | |||
1548 | raw_node = F2FS_NODE(node_page); | 1616 | raw_node = F2FS_NODE(node_page); |
1549 | addr_array = blkaddr_in_node(raw_node); | 1617 | addr_array = blkaddr_in_node(raw_node); |
1550 | return le32_to_cpu(addr_array[offset]); | 1618 | return le32_to_cpu(addr_array[offset]); |
@@ -1628,6 +1696,7 @@ enum { | |||
1628 | FI_UPDATE_WRITE, /* inode has in-place-update data */ | 1696 | FI_UPDATE_WRITE, /* inode has in-place-update data */ |
1629 | FI_NEED_IPU, /* used for ipu per file */ | 1697 | FI_NEED_IPU, /* used for ipu per file */ |
1630 | FI_ATOMIC_FILE, /* indicate atomic file */ | 1698 | FI_ATOMIC_FILE, /* indicate atomic file */ |
1699 | FI_ATOMIC_COMMIT, /* indicate the state of atomical committing */ | ||
1631 | FI_VOLATILE_FILE, /* indicate volatile file */ | 1700 | FI_VOLATILE_FILE, /* indicate volatile file */ |
1632 | FI_FIRST_BLOCK_WRITTEN, /* indicate #0 data block was written */ | 1701 | FI_FIRST_BLOCK_WRITTEN, /* indicate #0 data block was written */ |
1633 | FI_DROP_CACHE, /* drop dirty page cache */ | 1702 | FI_DROP_CACHE, /* drop dirty page cache */ |
@@ -1635,6 +1704,7 @@ enum { | |||
1635 | FI_INLINE_DOTS, /* indicate inline dot dentries */ | 1704 | FI_INLINE_DOTS, /* indicate inline dot dentries */ |
1636 | FI_DO_DEFRAG, /* indicate defragment is running */ | 1705 | FI_DO_DEFRAG, /* indicate defragment is running */ |
1637 | FI_DIRTY_FILE, /* indicate regular/symlink has dirty pages */ | 1706 | FI_DIRTY_FILE, /* indicate regular/symlink has dirty pages */ |
1707 | FI_NO_PREALLOC, /* indicate skipped preallocated blocks */ | ||
1638 | }; | 1708 | }; |
1639 | 1709 | ||
1640 | static inline void __mark_inode_dirty_flag(struct inode *inode, | 1710 | static inline void __mark_inode_dirty_flag(struct inode *inode, |
@@ -1779,6 +1849,7 @@ static inline unsigned int addrs_per_inode(struct inode *inode) | |||
1779 | static inline void *inline_xattr_addr(struct page *page) | 1849 | static inline void *inline_xattr_addr(struct page *page) |
1780 | { | 1850 | { |
1781 | struct f2fs_inode *ri = F2FS_INODE(page); | 1851 | struct f2fs_inode *ri = F2FS_INODE(page); |
1852 | |||
1782 | return (void *)&(ri->i_addr[DEF_ADDRS_PER_INODE - | 1853 | return (void *)&(ri->i_addr[DEF_ADDRS_PER_INODE - |
1783 | F2FS_INLINE_XATTR_ADDRS]); | 1854 | F2FS_INLINE_XATTR_ADDRS]); |
1784 | } | 1855 | } |
@@ -1817,6 +1888,11 @@ static inline bool f2fs_is_atomic_file(struct inode *inode) | |||
1817 | return is_inode_flag_set(inode, FI_ATOMIC_FILE); | 1888 | return is_inode_flag_set(inode, FI_ATOMIC_FILE); |
1818 | } | 1889 | } |
1819 | 1890 | ||
1891 | static inline bool f2fs_is_commit_atomic_write(struct inode *inode) | ||
1892 | { | ||
1893 | return is_inode_flag_set(inode, FI_ATOMIC_COMMIT); | ||
1894 | } | ||
1895 | |||
1820 | static inline bool f2fs_is_volatile_file(struct inode *inode) | 1896 | static inline bool f2fs_is_volatile_file(struct inode *inode) |
1821 | { | 1897 | { |
1822 | return is_inode_flag_set(inode, FI_VOLATILE_FILE); | 1898 | return is_inode_flag_set(inode, FI_VOLATILE_FILE); |
@@ -1835,6 +1911,7 @@ static inline bool f2fs_is_drop_cache(struct inode *inode) | |||
1835 | static inline void *inline_data_addr(struct page *page) | 1911 | static inline void *inline_data_addr(struct page *page) |
1836 | { | 1912 | { |
1837 | struct f2fs_inode *ri = F2FS_INODE(page); | 1913 | struct f2fs_inode *ri = F2FS_INODE(page); |
1914 | |||
1838 | return (void *)&(ri->i_addr[1]); | 1915 | return (void *)&(ri->i_addr[1]); |
1839 | } | 1916 | } |
1840 | 1917 | ||
@@ -1918,8 +1995,10 @@ static inline void *f2fs_kmalloc(struct f2fs_sb_info *sbi, | |||
1918 | size_t size, gfp_t flags) | 1995 | size_t size, gfp_t flags) |
1919 | { | 1996 | { |
1920 | #ifdef CONFIG_F2FS_FAULT_INJECTION | 1997 | #ifdef CONFIG_F2FS_FAULT_INJECTION |
1921 | if (time_to_inject(sbi, FAULT_KMALLOC)) | 1998 | if (time_to_inject(sbi, FAULT_KMALLOC)) { |
1999 | f2fs_show_injection_info(FAULT_KMALLOC); | ||
1922 | return NULL; | 2000 | return NULL; |
2001 | } | ||
1923 | #endif | 2002 | #endif |
1924 | return kmalloc(size, flags); | 2003 | return kmalloc(size, flags); |
1925 | } | 2004 | } |
@@ -1957,29 +2036,30 @@ static inline void *f2fs_kvzalloc(size_t size, gfp_t flags) | |||
1957 | /* | 2036 | /* |
1958 | * file.c | 2037 | * file.c |
1959 | */ | 2038 | */ |
1960 | int f2fs_sync_file(struct file *, loff_t, loff_t, int); | 2039 | int f2fs_sync_file(struct file *file, loff_t start, loff_t end, int datasync); |
1961 | void truncate_data_blocks(struct dnode_of_data *); | 2040 | void truncate_data_blocks(struct dnode_of_data *dn); |
1962 | int truncate_blocks(struct inode *, u64, bool); | 2041 | int truncate_blocks(struct inode *inode, u64 from, bool lock); |
1963 | int f2fs_truncate(struct inode *); | 2042 | int f2fs_truncate(struct inode *inode); |
1964 | int f2fs_getattr(struct vfsmount *, struct dentry *, struct kstat *); | 2043 | int f2fs_getattr(struct vfsmount *mnt, struct dentry *dentry, |
1965 | int f2fs_setattr(struct dentry *, struct iattr *); | 2044 | struct kstat *stat); |
1966 | int truncate_hole(struct inode *, pgoff_t, pgoff_t); | 2045 | int f2fs_setattr(struct dentry *dentry, struct iattr *attr); |
1967 | int truncate_data_blocks_range(struct dnode_of_data *, int); | 2046 | int truncate_hole(struct inode *inode, pgoff_t pg_start, pgoff_t pg_end); |
1968 | long f2fs_ioctl(struct file *, unsigned int, unsigned long); | 2047 | int truncate_data_blocks_range(struct dnode_of_data *dn, int count); |
1969 | long f2fs_compat_ioctl(struct file *, unsigned int, unsigned long); | 2048 | long f2fs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg); |
2049 | long f2fs_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg); | ||
1970 | 2050 | ||
1971 | /* | 2051 | /* |
1972 | * inode.c | 2052 | * inode.c |
1973 | */ | 2053 | */ |
1974 | void f2fs_set_inode_flags(struct inode *); | 2054 | void f2fs_set_inode_flags(struct inode *inode); |
1975 | struct inode *f2fs_iget(struct super_block *, unsigned long); | 2055 | struct inode *f2fs_iget(struct super_block *sb, unsigned long ino); |
1976 | struct inode *f2fs_iget_retry(struct super_block *, unsigned long); | 2056 | struct inode *f2fs_iget_retry(struct super_block *sb, unsigned long ino); |
1977 | int try_to_free_nats(struct f2fs_sb_info *, int); | 2057 | int try_to_free_nats(struct f2fs_sb_info *sbi, int nr_shrink); |
1978 | int update_inode(struct inode *, struct page *); | 2058 | int update_inode(struct inode *inode, struct page *node_page); |
1979 | int update_inode_page(struct inode *); | 2059 | int update_inode_page(struct inode *inode); |
1980 | int f2fs_write_inode(struct inode *, struct writeback_control *); | 2060 | int f2fs_write_inode(struct inode *inode, struct writeback_control *wbc); |
1981 | void f2fs_evict_inode(struct inode *); | 2061 | void f2fs_evict_inode(struct inode *inode); |
1982 | void handle_failed_inode(struct inode *); | 2062 | void handle_failed_inode(struct inode *inode); |
1983 | 2063 | ||
1984 | /* | 2064 | /* |
1985 | * namei.c | 2065 | * namei.c |
@@ -1989,40 +2069,47 @@ struct dentry *f2fs_get_parent(struct dentry *child); | |||
1989 | /* | 2069 | /* |
1990 | * dir.c | 2070 | * dir.c |
1991 | */ | 2071 | */ |
1992 | void set_de_type(struct f2fs_dir_entry *, umode_t); | 2072 | void set_de_type(struct f2fs_dir_entry *de, umode_t mode); |
1993 | unsigned char get_de_type(struct f2fs_dir_entry *); | 2073 | unsigned char get_de_type(struct f2fs_dir_entry *de); |
1994 | struct f2fs_dir_entry *find_target_dentry(struct fscrypt_name *, | 2074 | struct f2fs_dir_entry *find_target_dentry(struct fscrypt_name *fname, |
1995 | f2fs_hash_t, int *, struct f2fs_dentry_ptr *); | 2075 | f2fs_hash_t namehash, int *max_slots, |
1996 | int f2fs_fill_dentries(struct dir_context *, struct f2fs_dentry_ptr *, | 2076 | struct f2fs_dentry_ptr *d); |
1997 | unsigned int, struct fscrypt_str *); | 2077 | int f2fs_fill_dentries(struct dir_context *ctx, struct f2fs_dentry_ptr *d, |
1998 | void do_make_empty_dir(struct inode *, struct inode *, | 2078 | unsigned int start_pos, struct fscrypt_str *fstr); |
1999 | struct f2fs_dentry_ptr *); | 2079 | void do_make_empty_dir(struct inode *inode, struct inode *parent, |
2000 | struct page *init_inode_metadata(struct inode *, struct inode *, | 2080 | struct f2fs_dentry_ptr *d); |
2001 | const struct qstr *, const struct qstr *, struct page *); | 2081 | struct page *init_inode_metadata(struct inode *inode, struct inode *dir, |
2002 | void update_parent_metadata(struct inode *, struct inode *, unsigned int); | 2082 | const struct qstr *new_name, |
2003 | int room_for_filename(const void *, int, int); | 2083 | const struct qstr *orig_name, struct page *dpage); |
2004 | void f2fs_drop_nlink(struct inode *, struct inode *); | 2084 | void update_parent_metadata(struct inode *dir, struct inode *inode, |
2005 | struct f2fs_dir_entry *__f2fs_find_entry(struct inode *, struct fscrypt_name *, | 2085 | unsigned int current_depth); |
2006 | struct page **); | 2086 | int room_for_filename(const void *bitmap, int slots, int max_slots); |
2007 | struct f2fs_dir_entry *f2fs_find_entry(struct inode *, const struct qstr *, | 2087 | void f2fs_drop_nlink(struct inode *dir, struct inode *inode); |
2008 | struct page **); | 2088 | struct f2fs_dir_entry *__f2fs_find_entry(struct inode *dir, |
2009 | struct f2fs_dir_entry *f2fs_parent_dir(struct inode *, struct page **); | 2089 | struct fscrypt_name *fname, struct page **res_page); |
2010 | ino_t f2fs_inode_by_name(struct inode *, const struct qstr *, struct page **); | 2090 | struct f2fs_dir_entry *f2fs_find_entry(struct inode *dir, |
2011 | void f2fs_set_link(struct inode *, struct f2fs_dir_entry *, | 2091 | const struct qstr *child, struct page **res_page); |
2012 | struct page *, struct inode *); | 2092 | struct f2fs_dir_entry *f2fs_parent_dir(struct inode *dir, struct page **p); |
2013 | int update_dent_inode(struct inode *, struct inode *, const struct qstr *); | 2093 | ino_t f2fs_inode_by_name(struct inode *dir, const struct qstr *qstr, |
2014 | void f2fs_update_dentry(nid_t ino, umode_t mode, struct f2fs_dentry_ptr *, | 2094 | struct page **page); |
2015 | const struct qstr *, f2fs_hash_t , unsigned int); | 2095 | void f2fs_set_link(struct inode *dir, struct f2fs_dir_entry *de, |
2016 | int f2fs_add_regular_entry(struct inode *, const struct qstr *, | 2096 | struct page *page, struct inode *inode); |
2017 | const struct qstr *, struct inode *, nid_t, umode_t); | 2097 | int update_dent_inode(struct inode *inode, struct inode *to, |
2018 | int __f2fs_do_add_link(struct inode *, struct fscrypt_name*, struct inode *, | 2098 | const struct qstr *name); |
2019 | nid_t, umode_t); | 2099 | void f2fs_update_dentry(nid_t ino, umode_t mode, struct f2fs_dentry_ptr *d, |
2020 | int __f2fs_add_link(struct inode *, const struct qstr *, struct inode *, nid_t, | 2100 | const struct qstr *name, f2fs_hash_t name_hash, |
2021 | umode_t); | 2101 | unsigned int bit_pos); |
2022 | void f2fs_delete_entry(struct f2fs_dir_entry *, struct page *, struct inode *, | 2102 | int f2fs_add_regular_entry(struct inode *dir, const struct qstr *new_name, |
2023 | struct inode *); | 2103 | const struct qstr *orig_name, |
2024 | int f2fs_do_tmpfile(struct inode *, struct inode *); | 2104 | struct inode *inode, nid_t ino, umode_t mode); |
2025 | bool f2fs_empty_dir(struct inode *); | 2105 | int __f2fs_do_add_link(struct inode *dir, struct fscrypt_name *fname, |
2106 | struct inode *inode, nid_t ino, umode_t mode); | ||
2107 | int __f2fs_add_link(struct inode *dir, const struct qstr *name, | ||
2108 | struct inode *inode, nid_t ino, umode_t mode); | ||
2109 | void f2fs_delete_entry(struct f2fs_dir_entry *dentry, struct page *page, | ||
2110 | struct inode *dir, struct inode *inode); | ||
2111 | int f2fs_do_tmpfile(struct inode *inode, struct inode *dir); | ||
2112 | bool f2fs_empty_dir(struct inode *dir); | ||
2026 | 2113 | ||
2027 | static inline int f2fs_add_link(struct dentry *dentry, struct inode *inode) | 2114 | static inline int f2fs_add_link(struct dentry *dentry, struct inode *inode) |
2028 | { | 2115 | { |
@@ -2033,18 +2120,18 @@ static inline int f2fs_add_link(struct dentry *dentry, struct inode *inode) | |||
2033 | /* | 2120 | /* |
2034 | * super.c | 2121 | * super.c |
2035 | */ | 2122 | */ |
2036 | int f2fs_inode_dirtied(struct inode *, bool); | 2123 | int f2fs_inode_dirtied(struct inode *inode, bool sync); |
2037 | void f2fs_inode_synced(struct inode *); | 2124 | void f2fs_inode_synced(struct inode *inode); |
2038 | int f2fs_commit_super(struct f2fs_sb_info *, bool); | 2125 | int f2fs_commit_super(struct f2fs_sb_info *sbi, bool recover); |
2039 | int f2fs_sync_fs(struct super_block *, int); | 2126 | int f2fs_sync_fs(struct super_block *sb, int sync); |
2040 | extern __printf(3, 4) | 2127 | extern __printf(3, 4) |
2041 | void f2fs_msg(struct super_block *, const char *, const char *, ...); | 2128 | void f2fs_msg(struct super_block *sb, const char *level, const char *fmt, ...); |
2042 | int sanity_check_ckpt(struct f2fs_sb_info *sbi); | 2129 | int sanity_check_ckpt(struct f2fs_sb_info *sbi); |
2043 | 2130 | ||
2044 | /* | 2131 | /* |
2045 | * hash.c | 2132 | * hash.c |
2046 | */ | 2133 | */ |
2047 | f2fs_hash_t f2fs_dentry_hash(const struct qstr *); | 2134 | f2fs_hash_t f2fs_dentry_hash(const struct qstr *name_info); |
2048 | 2135 | ||
2049 | /* | 2136 | /* |
2050 | * node.c | 2137 | * node.c |
@@ -2052,163 +2139,183 @@ f2fs_hash_t f2fs_dentry_hash(const struct qstr *); | |||
2052 | struct dnode_of_data; | 2139 | struct dnode_of_data; |
2053 | struct node_info; | 2140 | struct node_info; |
2054 | 2141 | ||
2055 | bool available_free_memory(struct f2fs_sb_info *, int); | 2142 | bool available_free_memory(struct f2fs_sb_info *sbi, int type); |
2056 | int need_dentry_mark(struct f2fs_sb_info *, nid_t); | 2143 | int need_dentry_mark(struct f2fs_sb_info *sbi, nid_t nid); |
2057 | bool is_checkpointed_node(struct f2fs_sb_info *, nid_t); | 2144 | bool is_checkpointed_node(struct f2fs_sb_info *sbi, nid_t nid); |
2058 | bool need_inode_block_update(struct f2fs_sb_info *, nid_t); | 2145 | bool need_inode_block_update(struct f2fs_sb_info *sbi, nid_t ino); |
2059 | void get_node_info(struct f2fs_sb_info *, nid_t, struct node_info *); | 2146 | void get_node_info(struct f2fs_sb_info *sbi, nid_t nid, struct node_info *ni); |
2060 | pgoff_t get_next_page_offset(struct dnode_of_data *, pgoff_t); | 2147 | pgoff_t get_next_page_offset(struct dnode_of_data *dn, pgoff_t pgofs); |
2061 | int get_dnode_of_data(struct dnode_of_data *, pgoff_t, int); | 2148 | int get_dnode_of_data(struct dnode_of_data *dn, pgoff_t index, int mode); |
2062 | int truncate_inode_blocks(struct inode *, pgoff_t); | 2149 | int truncate_inode_blocks(struct inode *inode, pgoff_t from); |
2063 | int truncate_xattr_node(struct inode *, struct page *); | 2150 | int truncate_xattr_node(struct inode *inode, struct page *page); |
2064 | int wait_on_node_pages_writeback(struct f2fs_sb_info *, nid_t); | 2151 | int wait_on_node_pages_writeback(struct f2fs_sb_info *sbi, nid_t ino); |
2065 | int remove_inode_page(struct inode *); | 2152 | int remove_inode_page(struct inode *inode); |
2066 | struct page *new_inode_page(struct inode *); | 2153 | struct page *new_inode_page(struct inode *inode); |
2067 | struct page *new_node_page(struct dnode_of_data *, unsigned int, struct page *); | 2154 | struct page *new_node_page(struct dnode_of_data *dn, |
2068 | void ra_node_page(struct f2fs_sb_info *, nid_t); | 2155 | unsigned int ofs, struct page *ipage); |
2069 | struct page *get_node_page(struct f2fs_sb_info *, pgoff_t); | 2156 | void ra_node_page(struct f2fs_sb_info *sbi, nid_t nid); |
2070 | struct page *get_node_page_ra(struct page *, int); | 2157 | struct page *get_node_page(struct f2fs_sb_info *sbi, pgoff_t nid); |
2071 | void move_node_page(struct page *, int); | 2158 | struct page *get_node_page_ra(struct page *parent, int start); |
2072 | int fsync_node_pages(struct f2fs_sb_info *, struct inode *, | 2159 | void move_node_page(struct page *node_page, int gc_type); |
2073 | struct writeback_control *, bool); | 2160 | int fsync_node_pages(struct f2fs_sb_info *sbi, struct inode *inode, |
2074 | int sync_node_pages(struct f2fs_sb_info *, struct writeback_control *); | 2161 | struct writeback_control *wbc, bool atomic); |
2075 | void build_free_nids(struct f2fs_sb_info *, bool); | 2162 | int sync_node_pages(struct f2fs_sb_info *sbi, struct writeback_control *wbc); |
2076 | bool alloc_nid(struct f2fs_sb_info *, nid_t *); | 2163 | void build_free_nids(struct f2fs_sb_info *sbi, bool sync, bool mount); |
2077 | void alloc_nid_done(struct f2fs_sb_info *, nid_t); | 2164 | bool alloc_nid(struct f2fs_sb_info *sbi, nid_t *nid); |
2078 | void alloc_nid_failed(struct f2fs_sb_info *, nid_t); | 2165 | void alloc_nid_done(struct f2fs_sb_info *sbi, nid_t nid); |
2079 | int try_to_free_nids(struct f2fs_sb_info *, int); | 2166 | void alloc_nid_failed(struct f2fs_sb_info *sbi, nid_t nid); |
2080 | void recover_inline_xattr(struct inode *, struct page *); | 2167 | int try_to_free_nids(struct f2fs_sb_info *sbi, int nr_shrink); |
2081 | void recover_xattr_data(struct inode *, struct page *, block_t); | 2168 | void recover_inline_xattr(struct inode *inode, struct page *page); |
2082 | int recover_inode_page(struct f2fs_sb_info *, struct page *); | 2169 | int recover_xattr_data(struct inode *inode, struct page *page, |
2083 | int restore_node_summary(struct f2fs_sb_info *, unsigned int, | 2170 | block_t blkaddr); |
2084 | struct f2fs_summary_block *); | 2171 | int recover_inode_page(struct f2fs_sb_info *sbi, struct page *page); |
2085 | void flush_nat_entries(struct f2fs_sb_info *); | 2172 | int restore_node_summary(struct f2fs_sb_info *sbi, |
2086 | int build_node_manager(struct f2fs_sb_info *); | 2173 | unsigned int segno, struct f2fs_summary_block *sum); |
2087 | void destroy_node_manager(struct f2fs_sb_info *); | 2174 | void flush_nat_entries(struct f2fs_sb_info *sbi, struct cp_control *cpc); |
2175 | int build_node_manager(struct f2fs_sb_info *sbi); | ||
2176 | void destroy_node_manager(struct f2fs_sb_info *sbi); | ||
2088 | int __init create_node_manager_caches(void); | 2177 | int __init create_node_manager_caches(void); |
2089 | void destroy_node_manager_caches(void); | 2178 | void destroy_node_manager_caches(void); |
2090 | 2179 | ||
2091 | /* | 2180 | /* |
2092 | * segment.c | 2181 | * segment.c |
2093 | */ | 2182 | */ |
2094 | void register_inmem_page(struct inode *, struct page *); | 2183 | void register_inmem_page(struct inode *inode, struct page *page); |
2095 | void drop_inmem_pages(struct inode *); | 2184 | void drop_inmem_pages(struct inode *inode); |
2096 | int commit_inmem_pages(struct inode *); | 2185 | int commit_inmem_pages(struct inode *inode); |
2097 | void f2fs_balance_fs(struct f2fs_sb_info *, bool); | 2186 | void f2fs_balance_fs(struct f2fs_sb_info *sbi, bool need); |
2098 | void f2fs_balance_fs_bg(struct f2fs_sb_info *); | 2187 | void f2fs_balance_fs_bg(struct f2fs_sb_info *sbi); |
2099 | int f2fs_issue_flush(struct f2fs_sb_info *); | 2188 | int f2fs_issue_flush(struct f2fs_sb_info *sbi); |
2100 | int create_flush_cmd_control(struct f2fs_sb_info *); | 2189 | int create_flush_cmd_control(struct f2fs_sb_info *sbi); |
2101 | void destroy_flush_cmd_control(struct f2fs_sb_info *, bool); | 2190 | void destroy_flush_cmd_control(struct f2fs_sb_info *sbi, bool free); |
2102 | void invalidate_blocks(struct f2fs_sb_info *, block_t); | 2191 | void invalidate_blocks(struct f2fs_sb_info *sbi, block_t addr); |
2103 | bool is_checkpointed_data(struct f2fs_sb_info *, block_t); | 2192 | bool is_checkpointed_data(struct f2fs_sb_info *sbi, block_t blkaddr); |
2104 | void refresh_sit_entry(struct f2fs_sb_info *, block_t, block_t); | 2193 | void refresh_sit_entry(struct f2fs_sb_info *sbi, block_t old, block_t new); |
2105 | void f2fs_wait_all_discard_bio(struct f2fs_sb_info *); | 2194 | void f2fs_wait_discard_bio(struct f2fs_sb_info *sbi, block_t blkaddr); |
2106 | void clear_prefree_segments(struct f2fs_sb_info *, struct cp_control *); | 2195 | void clear_prefree_segments(struct f2fs_sb_info *sbi, struct cp_control *cpc); |
2107 | void release_discard_addrs(struct f2fs_sb_info *); | 2196 | void release_discard_addrs(struct f2fs_sb_info *sbi); |
2108 | int npages_for_summary_flush(struct f2fs_sb_info *, bool); | 2197 | int npages_for_summary_flush(struct f2fs_sb_info *sbi, bool for_ra); |
2109 | void allocate_new_segments(struct f2fs_sb_info *); | 2198 | void allocate_new_segments(struct f2fs_sb_info *sbi); |
2110 | int f2fs_trim_fs(struct f2fs_sb_info *, struct fstrim_range *); | 2199 | int f2fs_trim_fs(struct f2fs_sb_info *sbi, struct fstrim_range *range); |
2111 | struct page *get_sum_page(struct f2fs_sb_info *, unsigned int); | 2200 | bool exist_trim_candidates(struct f2fs_sb_info *sbi, struct cp_control *cpc); |
2112 | void update_meta_page(struct f2fs_sb_info *, void *, block_t); | 2201 | struct page *get_sum_page(struct f2fs_sb_info *sbi, unsigned int segno); |
2113 | void write_meta_page(struct f2fs_sb_info *, struct page *); | 2202 | void update_meta_page(struct f2fs_sb_info *sbi, void *src, block_t blk_addr); |
2114 | void write_node_page(unsigned int, struct f2fs_io_info *); | 2203 | void write_meta_page(struct f2fs_sb_info *sbi, struct page *page); |
2115 | void write_data_page(struct dnode_of_data *, struct f2fs_io_info *); | 2204 | void write_node_page(unsigned int nid, struct f2fs_io_info *fio); |
2116 | void rewrite_data_page(struct f2fs_io_info *); | 2205 | void write_data_page(struct dnode_of_data *dn, struct f2fs_io_info *fio); |
2117 | void __f2fs_replace_block(struct f2fs_sb_info *, struct f2fs_summary *, | 2206 | void rewrite_data_page(struct f2fs_io_info *fio); |
2118 | block_t, block_t, bool, bool); | 2207 | void __f2fs_replace_block(struct f2fs_sb_info *sbi, struct f2fs_summary *sum, |
2119 | void f2fs_replace_block(struct f2fs_sb_info *, struct dnode_of_data *, | 2208 | block_t old_blkaddr, block_t new_blkaddr, |
2120 | block_t, block_t, unsigned char, bool, bool); | 2209 | bool recover_curseg, bool recover_newaddr); |
2121 | void allocate_data_block(struct f2fs_sb_info *, struct page *, | 2210 | void f2fs_replace_block(struct f2fs_sb_info *sbi, struct dnode_of_data *dn, |
2122 | block_t, block_t *, struct f2fs_summary *, int); | 2211 | block_t old_addr, block_t new_addr, |
2123 | void f2fs_wait_on_page_writeback(struct page *, enum page_type, bool); | 2212 | unsigned char version, bool recover_curseg, |
2124 | void f2fs_wait_on_encrypted_page_writeback(struct f2fs_sb_info *, block_t); | 2213 | bool recover_newaddr); |
2125 | void write_data_summaries(struct f2fs_sb_info *, block_t); | 2214 | void allocate_data_block(struct f2fs_sb_info *sbi, struct page *page, |
2126 | void write_node_summaries(struct f2fs_sb_info *, block_t); | 2215 | block_t old_blkaddr, block_t *new_blkaddr, |
2127 | int lookup_journal_in_cursum(struct f2fs_journal *, int, unsigned int, int); | 2216 | struct f2fs_summary *sum, int type); |
2128 | void flush_sit_entries(struct f2fs_sb_info *, struct cp_control *); | 2217 | void f2fs_wait_on_page_writeback(struct page *page, |
2129 | int build_segment_manager(struct f2fs_sb_info *); | 2218 | enum page_type type, bool ordered); |
2130 | void destroy_segment_manager(struct f2fs_sb_info *); | 2219 | void f2fs_wait_on_encrypted_page_writeback(struct f2fs_sb_info *sbi, |
2220 | block_t blkaddr); | ||
2221 | void write_data_summaries(struct f2fs_sb_info *sbi, block_t start_blk); | ||
2222 | void write_node_summaries(struct f2fs_sb_info *sbi, block_t start_blk); | ||
2223 | int lookup_journal_in_cursum(struct f2fs_journal *journal, int type, | ||
2224 | unsigned int val, int alloc); | ||
2225 | void flush_sit_entries(struct f2fs_sb_info *sbi, struct cp_control *cpc); | ||
2226 | int build_segment_manager(struct f2fs_sb_info *sbi); | ||
2227 | void destroy_segment_manager(struct f2fs_sb_info *sbi); | ||
2131 | int __init create_segment_manager_caches(void); | 2228 | int __init create_segment_manager_caches(void); |
2132 | void destroy_segment_manager_caches(void); | 2229 | void destroy_segment_manager_caches(void); |
2133 | 2230 | ||
2134 | /* | 2231 | /* |
2135 | * checkpoint.c | 2232 | * checkpoint.c |
2136 | */ | 2233 | */ |
2137 | void f2fs_stop_checkpoint(struct f2fs_sb_info *, bool); | 2234 | void f2fs_stop_checkpoint(struct f2fs_sb_info *sbi, bool end_io); |
2138 | struct page *grab_meta_page(struct f2fs_sb_info *, pgoff_t); | 2235 | struct page *grab_meta_page(struct f2fs_sb_info *sbi, pgoff_t index); |
2139 | struct page *get_meta_page(struct f2fs_sb_info *, pgoff_t); | 2236 | struct page *get_meta_page(struct f2fs_sb_info *sbi, pgoff_t index); |
2140 | struct page *get_tmp_page(struct f2fs_sb_info *, pgoff_t); | 2237 | struct page *get_tmp_page(struct f2fs_sb_info *sbi, pgoff_t index); |
2141 | bool is_valid_blkaddr(struct f2fs_sb_info *, block_t, int); | 2238 | bool is_valid_blkaddr(struct f2fs_sb_info *sbi, block_t blkaddr, int type); |
2142 | int ra_meta_pages(struct f2fs_sb_info *, block_t, int, int, bool); | 2239 | int ra_meta_pages(struct f2fs_sb_info *sbi, block_t start, int nrpages, |
2143 | void ra_meta_pages_cond(struct f2fs_sb_info *, pgoff_t); | 2240 | int type, bool sync); |
2144 | long sync_meta_pages(struct f2fs_sb_info *, enum page_type, long); | 2241 | void ra_meta_pages_cond(struct f2fs_sb_info *sbi, pgoff_t index); |
2145 | void add_ino_entry(struct f2fs_sb_info *, nid_t, int type); | 2242 | long sync_meta_pages(struct f2fs_sb_info *sbi, enum page_type type, |
2146 | void remove_ino_entry(struct f2fs_sb_info *, nid_t, int type); | 2243 | long nr_to_write); |
2147 | void release_ino_entry(struct f2fs_sb_info *, bool); | 2244 | void add_ino_entry(struct f2fs_sb_info *sbi, nid_t ino, int type); |
2148 | bool exist_written_data(struct f2fs_sb_info *, nid_t, int); | 2245 | void remove_ino_entry(struct f2fs_sb_info *sbi, nid_t ino, int type); |
2149 | int f2fs_sync_inode_meta(struct f2fs_sb_info *); | 2246 | void release_ino_entry(struct f2fs_sb_info *sbi, bool all); |
2150 | int acquire_orphan_inode(struct f2fs_sb_info *); | 2247 | bool exist_written_data(struct f2fs_sb_info *sbi, nid_t ino, int mode); |
2151 | void release_orphan_inode(struct f2fs_sb_info *); | 2248 | int f2fs_sync_inode_meta(struct f2fs_sb_info *sbi); |
2152 | void add_orphan_inode(struct inode *); | 2249 | int acquire_orphan_inode(struct f2fs_sb_info *sbi); |
2153 | void remove_orphan_inode(struct f2fs_sb_info *, nid_t); | 2250 | void release_orphan_inode(struct f2fs_sb_info *sbi); |
2154 | int recover_orphan_inodes(struct f2fs_sb_info *); | 2251 | void add_orphan_inode(struct inode *inode); |
2155 | int get_valid_checkpoint(struct f2fs_sb_info *); | 2252 | void remove_orphan_inode(struct f2fs_sb_info *sbi, nid_t ino); |
2156 | void update_dirty_page(struct inode *, struct page *); | 2253 | int recover_orphan_inodes(struct f2fs_sb_info *sbi); |
2157 | void remove_dirty_inode(struct inode *); | 2254 | int get_valid_checkpoint(struct f2fs_sb_info *sbi); |
2158 | int sync_dirty_inodes(struct f2fs_sb_info *, enum inode_type); | 2255 | void update_dirty_page(struct inode *inode, struct page *page); |
2159 | int write_checkpoint(struct f2fs_sb_info *, struct cp_control *); | 2256 | void remove_dirty_inode(struct inode *inode); |
2160 | void init_ino_entry_info(struct f2fs_sb_info *); | 2257 | int sync_dirty_inodes(struct f2fs_sb_info *sbi, enum inode_type type); |
2258 | int write_checkpoint(struct f2fs_sb_info *sbi, struct cp_control *cpc); | ||
2259 | void init_ino_entry_info(struct f2fs_sb_info *sbi); | ||
2161 | int __init create_checkpoint_caches(void); | 2260 | int __init create_checkpoint_caches(void); |
2162 | void destroy_checkpoint_caches(void); | 2261 | void destroy_checkpoint_caches(void); |
2163 | 2262 | ||
2164 | /* | 2263 | /* |
2165 | * data.c | 2264 | * data.c |
2166 | */ | 2265 | */ |
2167 | void f2fs_submit_merged_bio(struct f2fs_sb_info *, enum page_type, int); | 2266 | void f2fs_submit_merged_bio(struct f2fs_sb_info *sbi, enum page_type type, |
2168 | void f2fs_submit_merged_bio_cond(struct f2fs_sb_info *, struct inode *, | 2267 | int rw); |
2169 | struct page *, nid_t, enum page_type, int); | 2268 | void f2fs_submit_merged_bio_cond(struct f2fs_sb_info *sbi, |
2170 | void f2fs_flush_merged_bios(struct f2fs_sb_info *); | 2269 | struct inode *inode, nid_t ino, pgoff_t idx, |
2171 | int f2fs_submit_page_bio(struct f2fs_io_info *); | 2270 | enum page_type type, int rw); |
2172 | void f2fs_submit_page_mbio(struct f2fs_io_info *); | 2271 | void f2fs_flush_merged_bios(struct f2fs_sb_info *sbi); |
2173 | struct block_device *f2fs_target_device(struct f2fs_sb_info *, | 2272 | int f2fs_submit_page_bio(struct f2fs_io_info *fio); |
2174 | block_t, struct bio *); | 2273 | int f2fs_submit_page_mbio(struct f2fs_io_info *fio); |
2175 | int f2fs_target_device_index(struct f2fs_sb_info *, block_t); | 2274 | struct block_device *f2fs_target_device(struct f2fs_sb_info *sbi, |
2176 | void set_data_blkaddr(struct dnode_of_data *); | 2275 | block_t blk_addr, struct bio *bio); |
2177 | void f2fs_update_data_blkaddr(struct dnode_of_data *, block_t); | 2276 | int f2fs_target_device_index(struct f2fs_sb_info *sbi, block_t blkaddr); |
2178 | int reserve_new_blocks(struct dnode_of_data *, blkcnt_t); | 2277 | void set_data_blkaddr(struct dnode_of_data *dn); |
2179 | int reserve_new_block(struct dnode_of_data *); | 2278 | void f2fs_update_data_blkaddr(struct dnode_of_data *dn, block_t blkaddr); |
2180 | int f2fs_get_block(struct dnode_of_data *, pgoff_t); | 2279 | int reserve_new_blocks(struct dnode_of_data *dn, blkcnt_t count); |
2181 | int f2fs_preallocate_blocks(struct kiocb *, struct iov_iter *); | 2280 | int reserve_new_block(struct dnode_of_data *dn); |
2182 | int f2fs_reserve_block(struct dnode_of_data *, pgoff_t); | 2281 | int f2fs_get_block(struct dnode_of_data *dn, pgoff_t index); |
2183 | struct page *get_read_data_page(struct inode *, pgoff_t, int, bool); | 2282 | int f2fs_preallocate_blocks(struct kiocb *iocb, struct iov_iter *from); |
2184 | struct page *find_data_page(struct inode *, pgoff_t); | 2283 | int f2fs_reserve_block(struct dnode_of_data *dn, pgoff_t index); |
2185 | struct page *get_lock_data_page(struct inode *, pgoff_t, bool); | 2284 | struct page *get_read_data_page(struct inode *inode, pgoff_t index, |
2186 | struct page *get_new_data_page(struct inode *, struct page *, pgoff_t, bool); | 2285 | int op_flags, bool for_write); |
2187 | int do_write_data_page(struct f2fs_io_info *); | 2286 | struct page *find_data_page(struct inode *inode, pgoff_t index); |
2188 | int f2fs_map_blocks(struct inode *, struct f2fs_map_blocks *, int, int); | 2287 | struct page *get_lock_data_page(struct inode *inode, pgoff_t index, |
2189 | int f2fs_fiemap(struct inode *inode, struct fiemap_extent_info *, u64, u64); | 2288 | bool for_write); |
2190 | void f2fs_set_page_dirty_nobuffers(struct page *); | 2289 | struct page *get_new_data_page(struct inode *inode, |
2191 | void f2fs_invalidate_page(struct page *, unsigned int, unsigned int); | 2290 | struct page *ipage, pgoff_t index, bool new_i_size); |
2192 | int f2fs_release_page(struct page *, gfp_t); | 2291 | int do_write_data_page(struct f2fs_io_info *fio); |
2292 | int f2fs_map_blocks(struct inode *inode, struct f2fs_map_blocks *map, | ||
2293 | int create, int flag); | ||
2294 | int f2fs_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, | ||
2295 | u64 start, u64 len); | ||
2296 | void f2fs_set_page_dirty_nobuffers(struct page *page); | ||
2297 | void f2fs_invalidate_page(struct page *page, unsigned int offset, | ||
2298 | unsigned int length); | ||
2299 | int f2fs_release_page(struct page *page, gfp_t wait); | ||
2193 | #ifdef CONFIG_MIGRATION | 2300 | #ifdef CONFIG_MIGRATION |
2194 | int f2fs_migrate_page(struct address_space *, struct page *, struct page *, | 2301 | int f2fs_migrate_page(struct address_space *mapping, struct page *newpage, |
2195 | enum migrate_mode); | 2302 | struct page *page, enum migrate_mode mode); |
2196 | #endif | 2303 | #endif |
2197 | 2304 | ||
2198 | /* | 2305 | /* |
2199 | * gc.c | 2306 | * gc.c |
2200 | */ | 2307 | */ |
2201 | int start_gc_thread(struct f2fs_sb_info *); | 2308 | int start_gc_thread(struct f2fs_sb_info *sbi); |
2202 | void stop_gc_thread(struct f2fs_sb_info *); | 2309 | void stop_gc_thread(struct f2fs_sb_info *sbi); |
2203 | block_t start_bidx_of_node(unsigned int, struct inode *); | 2310 | block_t start_bidx_of_node(unsigned int node_ofs, struct inode *inode); |
2204 | int f2fs_gc(struct f2fs_sb_info *, bool, bool); | 2311 | int f2fs_gc(struct f2fs_sb_info *sbi, bool sync, bool background); |
2205 | void build_gc_manager(struct f2fs_sb_info *); | 2312 | void build_gc_manager(struct f2fs_sb_info *sbi); |
2206 | 2313 | ||
2207 | /* | 2314 | /* |
2208 | * recovery.c | 2315 | * recovery.c |
2209 | */ | 2316 | */ |
2210 | int recover_fsync_data(struct f2fs_sb_info *, bool); | 2317 | int recover_fsync_data(struct f2fs_sb_info *sbi, bool check_only); |
2211 | bool space_for_roll_forward(struct f2fs_sb_info *); | 2318 | bool space_for_roll_forward(struct f2fs_sb_info *sbi); |
2212 | 2319 | ||
2213 | /* | 2320 | /* |
2214 | * debug.c | 2321 | * debug.c |
@@ -2227,8 +2334,9 @@ struct f2fs_stat_info { | |||
2227 | unsigned int ndirty_dirs, ndirty_files, ndirty_all; | 2334 | unsigned int ndirty_dirs, ndirty_files, ndirty_all; |
2228 | int nats, dirty_nats, sits, dirty_sits, free_nids, alloc_nids; | 2335 | int nats, dirty_nats, sits, dirty_sits, free_nids, alloc_nids; |
2229 | int total_count, utilization; | 2336 | int total_count, utilization; |
2230 | int bg_gc, nr_wb_cp_data, nr_wb_data; | 2337 | int bg_gc, nr_wb_cp_data, nr_wb_data, nr_flush, nr_discard; |
2231 | int inline_xattr, inline_inode, inline_dir, orphans; | 2338 | int inline_xattr, inline_inode, inline_dir, append, update, orphans; |
2339 | int aw_cnt, max_aw_cnt; | ||
2232 | unsigned int valid_count, valid_node_count, valid_inode_count, discard_blks; | 2340 | unsigned int valid_count, valid_node_count, valid_inode_count, discard_blks; |
2233 | unsigned int bimodal, avg_vblocks; | 2341 | unsigned int bimodal, avg_vblocks; |
2234 | int util_free, util_valid, util_invalid; | 2342 | int util_free, util_valid, util_invalid; |
@@ -2300,6 +2408,17 @@ static inline struct f2fs_stat_info *F2FS_STAT(struct f2fs_sb_info *sbi) | |||
2300 | ((sbi)->block_count[(curseg)->alloc_type]++) | 2408 | ((sbi)->block_count[(curseg)->alloc_type]++) |
2301 | #define stat_inc_inplace_blocks(sbi) \ | 2409 | #define stat_inc_inplace_blocks(sbi) \ |
2302 | (atomic_inc(&(sbi)->inplace_count)) | 2410 | (atomic_inc(&(sbi)->inplace_count)) |
2411 | #define stat_inc_atomic_write(inode) \ | ||
2412 | (atomic_inc(&F2FS_I_SB(inode)->aw_cnt)) | ||
2413 | #define stat_dec_atomic_write(inode) \ | ||
2414 | (atomic_dec(&F2FS_I_SB(inode)->aw_cnt)) | ||
2415 | #define stat_update_max_atomic_write(inode) \ | ||
2416 | do { \ | ||
2417 | int cur = atomic_read(&F2FS_I_SB(inode)->aw_cnt); \ | ||
2418 | int max = atomic_read(&F2FS_I_SB(inode)->max_aw_cnt); \ | ||
2419 | if (cur > max) \ | ||
2420 | atomic_set(&F2FS_I_SB(inode)->max_aw_cnt, cur); \ | ||
2421 | } while (0) | ||
2303 | #define stat_inc_seg_count(sbi, type, gc_type) \ | 2422 | #define stat_inc_seg_count(sbi, type, gc_type) \ |
2304 | do { \ | 2423 | do { \ |
2305 | struct f2fs_stat_info *si = F2FS_STAT(sbi); \ | 2424 | struct f2fs_stat_info *si = F2FS_STAT(sbi); \ |
@@ -2332,8 +2451,8 @@ static inline struct f2fs_stat_info *F2FS_STAT(struct f2fs_sb_info *sbi) | |||
2332 | si->bg_node_blks += (gc_type == BG_GC) ? (blks) : 0; \ | 2451 | si->bg_node_blks += (gc_type == BG_GC) ? (blks) : 0; \ |
2333 | } while (0) | 2452 | } while (0) |
2334 | 2453 | ||
2335 | int f2fs_build_stats(struct f2fs_sb_info *); | 2454 | int f2fs_build_stats(struct f2fs_sb_info *sbi); |
2336 | void f2fs_destroy_stats(struct f2fs_sb_info *); | 2455 | void f2fs_destroy_stats(struct f2fs_sb_info *sbi); |
2337 | int __init f2fs_create_root_stats(void); | 2456 | int __init f2fs_create_root_stats(void); |
2338 | void f2fs_destroy_root_stats(void); | 2457 | void f2fs_destroy_root_stats(void); |
2339 | #else | 2458 | #else |
@@ -2353,6 +2472,9 @@ void f2fs_destroy_root_stats(void); | |||
2353 | #define stat_dec_inline_inode(inode) | 2472 | #define stat_dec_inline_inode(inode) |
2354 | #define stat_inc_inline_dir(inode) | 2473 | #define stat_inc_inline_dir(inode) |
2355 | #define stat_dec_inline_dir(inode) | 2474 | #define stat_dec_inline_dir(inode) |
2475 | #define stat_inc_atomic_write(inode) | ||
2476 | #define stat_dec_atomic_write(inode) | ||
2477 | #define stat_update_max_atomic_write(inode) | ||
2356 | #define stat_inc_seg_type(sbi, curseg) | 2478 | #define stat_inc_seg_type(sbi, curseg) |
2357 | #define stat_inc_block_count(sbi, curseg) | 2479 | #define stat_inc_block_count(sbi, curseg) |
2358 | #define stat_inc_inplace_blocks(sbi) | 2480 | #define stat_inc_inplace_blocks(sbi) |
@@ -2382,49 +2504,55 @@ extern struct kmem_cache *inode_entry_slab; | |||
2382 | /* | 2504 | /* |
2383 | * inline.c | 2505 | * inline.c |
2384 | */ | 2506 | */ |
2385 | bool f2fs_may_inline_data(struct inode *); | 2507 | bool f2fs_may_inline_data(struct inode *inode); |
2386 | bool f2fs_may_inline_dentry(struct inode *); | 2508 | bool f2fs_may_inline_dentry(struct inode *inode); |
2387 | void read_inline_data(struct page *, struct page *); | 2509 | void read_inline_data(struct page *page, struct page *ipage); |
2388 | bool truncate_inline_inode(struct page *, u64); | 2510 | bool truncate_inline_inode(struct page *ipage, u64 from); |
2389 | int f2fs_read_inline_data(struct inode *, struct page *); | 2511 | int f2fs_read_inline_data(struct inode *inode, struct page *page); |
2390 | int f2fs_convert_inline_page(struct dnode_of_data *, struct page *); | 2512 | int f2fs_convert_inline_page(struct dnode_of_data *dn, struct page *page); |
2391 | int f2fs_convert_inline_inode(struct inode *); | 2513 | int f2fs_convert_inline_inode(struct inode *inode); |
2392 | int f2fs_write_inline_data(struct inode *, struct page *); | 2514 | int f2fs_write_inline_data(struct inode *inode, struct page *page); |
2393 | bool recover_inline_data(struct inode *, struct page *); | 2515 | bool recover_inline_data(struct inode *inode, struct page *npage); |
2394 | struct f2fs_dir_entry *find_in_inline_dir(struct inode *, | 2516 | struct f2fs_dir_entry *find_in_inline_dir(struct inode *dir, |
2395 | struct fscrypt_name *, struct page **); | 2517 | struct fscrypt_name *fname, struct page **res_page); |
2396 | int make_empty_inline_dir(struct inode *inode, struct inode *, struct page *); | 2518 | int make_empty_inline_dir(struct inode *inode, struct inode *parent, |
2397 | int f2fs_add_inline_entry(struct inode *, const struct qstr *, | 2519 | struct page *ipage); |
2398 | const struct qstr *, struct inode *, nid_t, umode_t); | 2520 | int f2fs_add_inline_entry(struct inode *dir, const struct qstr *new_name, |
2399 | void f2fs_delete_inline_entry(struct f2fs_dir_entry *, struct page *, | 2521 | const struct qstr *orig_name, |
2400 | struct inode *, struct inode *); | 2522 | struct inode *inode, nid_t ino, umode_t mode); |
2401 | bool f2fs_empty_inline_dir(struct inode *); | 2523 | void f2fs_delete_inline_entry(struct f2fs_dir_entry *dentry, struct page *page, |
2402 | int f2fs_read_inline_dir(struct file *, struct dir_context *, | 2524 | struct inode *dir, struct inode *inode); |
2403 | struct fscrypt_str *); | 2525 | bool f2fs_empty_inline_dir(struct inode *dir); |
2404 | int f2fs_inline_data_fiemap(struct inode *, | 2526 | int f2fs_read_inline_dir(struct file *file, struct dir_context *ctx, |
2405 | struct fiemap_extent_info *, __u64, __u64); | 2527 | struct fscrypt_str *fstr); |
2528 | int f2fs_inline_data_fiemap(struct inode *inode, | ||
2529 | struct fiemap_extent_info *fieinfo, | ||
2530 | __u64 start, __u64 len); | ||
2406 | 2531 | ||
2407 | /* | 2532 | /* |
2408 | * shrinker.c | 2533 | * shrinker.c |
2409 | */ | 2534 | */ |
2410 | unsigned long f2fs_shrink_count(struct shrinker *, struct shrink_control *); | 2535 | unsigned long f2fs_shrink_count(struct shrinker *shrink, |
2411 | unsigned long f2fs_shrink_scan(struct shrinker *, struct shrink_control *); | 2536 | struct shrink_control *sc); |
2412 | void f2fs_join_shrinker(struct f2fs_sb_info *); | 2537 | unsigned long f2fs_shrink_scan(struct shrinker *shrink, |
2413 | void f2fs_leave_shrinker(struct f2fs_sb_info *); | 2538 | struct shrink_control *sc); |
2539 | void f2fs_join_shrinker(struct f2fs_sb_info *sbi); | ||
2540 | void f2fs_leave_shrinker(struct f2fs_sb_info *sbi); | ||
2414 | 2541 | ||
2415 | /* | 2542 | /* |
2416 | * extent_cache.c | 2543 | * extent_cache.c |
2417 | */ | 2544 | */ |
2418 | unsigned int f2fs_shrink_extent_tree(struct f2fs_sb_info *, int); | 2545 | unsigned int f2fs_shrink_extent_tree(struct f2fs_sb_info *sbi, int nr_shrink); |
2419 | bool f2fs_init_extent_tree(struct inode *, struct f2fs_extent *); | 2546 | bool f2fs_init_extent_tree(struct inode *inode, struct f2fs_extent *i_ext); |
2420 | void f2fs_drop_extent_tree(struct inode *); | 2547 | void f2fs_drop_extent_tree(struct inode *inode); |
2421 | unsigned int f2fs_destroy_extent_node(struct inode *); | 2548 | unsigned int f2fs_destroy_extent_node(struct inode *inode); |
2422 | void f2fs_destroy_extent_tree(struct inode *); | 2549 | void f2fs_destroy_extent_tree(struct inode *inode); |
2423 | bool f2fs_lookup_extent_cache(struct inode *, pgoff_t, struct extent_info *); | 2550 | bool f2fs_lookup_extent_cache(struct inode *inode, pgoff_t pgofs, |
2424 | void f2fs_update_extent_cache(struct dnode_of_data *); | 2551 | struct extent_info *ei); |
2552 | void f2fs_update_extent_cache(struct dnode_of_data *dn); | ||
2425 | void f2fs_update_extent_cache_range(struct dnode_of_data *dn, | 2553 | void f2fs_update_extent_cache_range(struct dnode_of_data *dn, |
2426 | pgoff_t, block_t, unsigned int); | 2554 | pgoff_t fofs, block_t blkaddr, unsigned int len); |
2427 | void init_extent_cache_info(struct f2fs_sb_info *); | 2555 | void init_extent_cache_info(struct f2fs_sb_info *sbi); |
2428 | int __init create_extent_cache(void); | 2556 | int __init create_extent_cache(void); |
2429 | void destroy_extent_cache(void); | 2557 | void destroy_extent_cache(void); |
2430 | 2558 | ||
diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c index 1edc86e874e3..78e65288f2b2 100644 --- a/fs/f2fs/file.c +++ b/fs/f2fs/file.c | |||
@@ -20,6 +20,7 @@ | |||
20 | #include <linux/uaccess.h> | 20 | #include <linux/uaccess.h> |
21 | #include <linux/mount.h> | 21 | #include <linux/mount.h> |
22 | #include <linux/pagevec.h> | 22 | #include <linux/pagevec.h> |
23 | #include <linux/uio.h> | ||
23 | #include <linux/uuid.h> | 24 | #include <linux/uuid.h> |
24 | #include <linux/file.h> | 25 | #include <linux/file.h> |
25 | 26 | ||
@@ -140,8 +141,6 @@ static inline bool need_do_checkpoint(struct inode *inode) | |||
140 | need_cp = true; | 141 | need_cp = true; |
141 | else if (!is_checkpointed_node(sbi, F2FS_I(inode)->i_pino)) | 142 | else if (!is_checkpointed_node(sbi, F2FS_I(inode)->i_pino)) |
142 | need_cp = true; | 143 | need_cp = true; |
143 | else if (F2FS_I(inode)->xattr_ver == cur_cp_version(F2FS_CKPT(sbi))) | ||
144 | need_cp = true; | ||
145 | else if (test_opt(sbi, FASTBOOT)) | 144 | else if (test_opt(sbi, FASTBOOT)) |
146 | need_cp = true; | 145 | need_cp = true; |
147 | else if (sbi->active_logs == 2) | 146 | else if (sbi->active_logs == 2) |
@@ -167,7 +166,6 @@ static void try_to_fix_pino(struct inode *inode) | |||
167 | nid_t pino; | 166 | nid_t pino; |
168 | 167 | ||
169 | down_write(&fi->i_sem); | 168 | down_write(&fi->i_sem); |
170 | fi->xattr_ver = 0; | ||
171 | if (file_wrong_pino(inode) && inode->i_nlink == 1 && | 169 | if (file_wrong_pino(inode) && inode->i_nlink == 1 && |
172 | get_parent_ino(inode, &pino)) { | 170 | get_parent_ino(inode, &pino)) { |
173 | f2fs_i_pino_write(inode, pino); | 171 | f2fs_i_pino_write(inode, pino); |
@@ -276,7 +274,8 @@ sync_nodes: | |||
276 | flush_out: | 274 | flush_out: |
277 | remove_ino_entry(sbi, ino, UPDATE_INO); | 275 | remove_ino_entry(sbi, ino, UPDATE_INO); |
278 | clear_inode_flag(inode, FI_UPDATE_WRITE); | 276 | clear_inode_flag(inode, FI_UPDATE_WRITE); |
279 | ret = f2fs_issue_flush(sbi); | 277 | if (!atomic) |
278 | ret = f2fs_issue_flush(sbi); | ||
280 | f2fs_update_time(sbi, REQ_TIME); | 279 | f2fs_update_time(sbi, REQ_TIME); |
281 | out: | 280 | out: |
282 | trace_f2fs_sync_file_exit(inode, need_cp, datasync, ret); | 281 | trace_f2fs_sync_file_exit(inode, need_cp, datasync, ret); |
@@ -567,8 +566,9 @@ int truncate_blocks(struct inode *inode, u64 from, bool lock) | |||
567 | } | 566 | } |
568 | 567 | ||
569 | if (f2fs_has_inline_data(inode)) { | 568 | if (f2fs_has_inline_data(inode)) { |
570 | if (truncate_inline_inode(ipage, from)) | 569 | truncate_inline_inode(ipage, from); |
571 | set_page_dirty(ipage); | 570 | if (from == 0) |
571 | clear_inode_flag(inode, FI_DATA_EXIST); | ||
572 | f2fs_put_page(ipage, 1); | 572 | f2fs_put_page(ipage, 1); |
573 | truncate_page = true; | 573 | truncate_page = true; |
574 | goto out; | 574 | goto out; |
@@ -1541,6 +1541,8 @@ static int f2fs_ioc_start_atomic_write(struct file *filp) | |||
1541 | if (ret) | 1541 | if (ret) |
1542 | clear_inode_flag(inode, FI_ATOMIC_FILE); | 1542 | clear_inode_flag(inode, FI_ATOMIC_FILE); |
1543 | out: | 1543 | out: |
1544 | stat_inc_atomic_write(inode); | ||
1545 | stat_update_max_atomic_write(inode); | ||
1544 | inode_unlock(inode); | 1546 | inode_unlock(inode); |
1545 | mnt_drop_write_file(filp); | 1547 | mnt_drop_write_file(filp); |
1546 | return ret; | 1548 | return ret; |
@@ -1564,15 +1566,18 @@ static int f2fs_ioc_commit_atomic_write(struct file *filp) | |||
1564 | goto err_out; | 1566 | goto err_out; |
1565 | 1567 | ||
1566 | if (f2fs_is_atomic_file(inode)) { | 1568 | if (f2fs_is_atomic_file(inode)) { |
1567 | clear_inode_flag(inode, FI_ATOMIC_FILE); | ||
1568 | ret = commit_inmem_pages(inode); | 1569 | ret = commit_inmem_pages(inode); |
1569 | if (ret) { | 1570 | if (ret) |
1570 | set_inode_flag(inode, FI_ATOMIC_FILE); | ||
1571 | goto err_out; | 1571 | goto err_out; |
1572 | |||
1573 | ret = f2fs_do_sync_file(filp, 0, LLONG_MAX, 0, true); | ||
1574 | if (!ret) { | ||
1575 | clear_inode_flag(inode, FI_ATOMIC_FILE); | ||
1576 | stat_dec_atomic_write(inode); | ||
1572 | } | 1577 | } |
1578 | } else { | ||
1579 | ret = f2fs_do_sync_file(filp, 0, LLONG_MAX, 0, true); | ||
1573 | } | 1580 | } |
1574 | |||
1575 | ret = f2fs_do_sync_file(filp, 0, LLONG_MAX, 0, true); | ||
1576 | err_out: | 1581 | err_out: |
1577 | inode_unlock(inode); | 1582 | inode_unlock(inode); |
1578 | mnt_drop_write_file(filp); | 1583 | mnt_drop_write_file(filp); |
@@ -1870,7 +1875,7 @@ static int f2fs_defragment_range(struct f2fs_sb_info *sbi, | |||
1870 | { | 1875 | { |
1871 | struct inode *inode = file_inode(filp); | 1876 | struct inode *inode = file_inode(filp); |
1872 | struct f2fs_map_blocks map = { .m_next_pgofs = NULL }; | 1877 | struct f2fs_map_blocks map = { .m_next_pgofs = NULL }; |
1873 | struct extent_info ei; | 1878 | struct extent_info ei = {0,0,0}; |
1874 | pgoff_t pg_start, pg_end; | 1879 | pgoff_t pg_start, pg_end; |
1875 | unsigned int blk_per_seg = sbi->blocks_per_seg; | 1880 | unsigned int blk_per_seg = sbi->blocks_per_seg; |
1876 | unsigned int total = 0, sec_num; | 1881 | unsigned int total = 0, sec_num; |
@@ -2250,8 +2255,12 @@ static ssize_t f2fs_file_write_iter(struct kiocb *iocb, struct iov_iter *from) | |||
2250 | inode_lock(inode); | 2255 | inode_lock(inode); |
2251 | ret = generic_write_checks(iocb, from); | 2256 | ret = generic_write_checks(iocb, from); |
2252 | if (ret > 0) { | 2257 | if (ret > 0) { |
2253 | int err = f2fs_preallocate_blocks(iocb, from); | 2258 | int err; |
2259 | |||
2260 | if (iov_iter_fault_in_readable(from, iov_iter_count(from))) | ||
2261 | set_inode_flag(inode, FI_NO_PREALLOC); | ||
2254 | 2262 | ||
2263 | err = f2fs_preallocate_blocks(iocb, from); | ||
2255 | if (err) { | 2264 | if (err) { |
2256 | inode_unlock(inode); | 2265 | inode_unlock(inode); |
2257 | return err; | 2266 | return err; |
@@ -2259,6 +2268,7 @@ static ssize_t f2fs_file_write_iter(struct kiocb *iocb, struct iov_iter *from) | |||
2259 | blk_start_plug(&plug); | 2268 | blk_start_plug(&plug); |
2260 | ret = __generic_file_write_iter(iocb, from); | 2269 | ret = __generic_file_write_iter(iocb, from); |
2261 | blk_finish_plug(&plug); | 2270 | blk_finish_plug(&plug); |
2271 | clear_inode_flag(inode, FI_NO_PREALLOC); | ||
2262 | } | 2272 | } |
2263 | inode_unlock(inode); | 2273 | inode_unlock(inode); |
2264 | 2274 | ||
diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c index 88bfc3dff496..418fd9881646 100644 --- a/fs/f2fs/gc.c +++ b/fs/f2fs/gc.c | |||
@@ -48,8 +48,10 @@ static int gc_thread_func(void *data) | |||
48 | } | 48 | } |
49 | 49 | ||
50 | #ifdef CONFIG_F2FS_FAULT_INJECTION | 50 | #ifdef CONFIG_F2FS_FAULT_INJECTION |
51 | if (time_to_inject(sbi, FAULT_CHECKPOINT)) | 51 | if (time_to_inject(sbi, FAULT_CHECKPOINT)) { |
52 | f2fs_show_injection_info(FAULT_CHECKPOINT); | ||
52 | f2fs_stop_checkpoint(sbi, false); | 53 | f2fs_stop_checkpoint(sbi, false); |
54 | } | ||
53 | #endif | 55 | #endif |
54 | 56 | ||
55 | /* | 57 | /* |
@@ -166,7 +168,8 @@ static void select_policy(struct f2fs_sb_info *sbi, int gc_type, | |||
166 | p->ofs_unit = sbi->segs_per_sec; | 168 | p->ofs_unit = sbi->segs_per_sec; |
167 | } | 169 | } |
168 | 170 | ||
169 | if (p->max_search > sbi->max_victim_search) | 171 | /* we need to check every dirty segments in the FG_GC case */ |
172 | if (gc_type != FG_GC && p->max_search > sbi->max_victim_search) | ||
170 | p->max_search = sbi->max_victim_search; | 173 | p->max_search = sbi->max_victim_search; |
171 | 174 | ||
172 | p->offset = sbi->last_victim[p->gc_mode]; | 175 | p->offset = sbi->last_victim[p->gc_mode]; |
@@ -199,6 +202,10 @@ static unsigned int check_bg_victims(struct f2fs_sb_info *sbi) | |||
199 | for_each_set_bit(secno, dirty_i->victim_secmap, MAIN_SECS(sbi)) { | 202 | for_each_set_bit(secno, dirty_i->victim_secmap, MAIN_SECS(sbi)) { |
200 | if (sec_usage_check(sbi, secno)) | 203 | if (sec_usage_check(sbi, secno)) |
201 | continue; | 204 | continue; |
205 | |||
206 | if (no_fggc_candidate(sbi, secno)) | ||
207 | continue; | ||
208 | |||
202 | clear_bit(secno, dirty_i->victim_secmap); | 209 | clear_bit(secno, dirty_i->victim_secmap); |
203 | return secno * sbi->segs_per_sec; | 210 | return secno * sbi->segs_per_sec; |
204 | } | 211 | } |
@@ -237,6 +244,16 @@ static unsigned int get_cb_cost(struct f2fs_sb_info *sbi, unsigned int segno) | |||
237 | return UINT_MAX - ((100 * (100 - u) * age) / (100 + u)); | 244 | return UINT_MAX - ((100 * (100 - u) * age) / (100 + u)); |
238 | } | 245 | } |
239 | 246 | ||
247 | static unsigned int get_greedy_cost(struct f2fs_sb_info *sbi, | ||
248 | unsigned int segno) | ||
249 | { | ||
250 | unsigned int valid_blocks = | ||
251 | get_valid_blocks(sbi, segno, sbi->segs_per_sec); | ||
252 | |||
253 | return IS_DATASEG(get_seg_entry(sbi, segno)->type) ? | ||
254 | valid_blocks * 2 : valid_blocks; | ||
255 | } | ||
256 | |||
240 | static inline unsigned int get_gc_cost(struct f2fs_sb_info *sbi, | 257 | static inline unsigned int get_gc_cost(struct f2fs_sb_info *sbi, |
241 | unsigned int segno, struct victim_sel_policy *p) | 258 | unsigned int segno, struct victim_sel_policy *p) |
242 | { | 259 | { |
@@ -245,7 +262,7 @@ static inline unsigned int get_gc_cost(struct f2fs_sb_info *sbi, | |||
245 | 262 | ||
246 | /* alloc_mode == LFS */ | 263 | /* alloc_mode == LFS */ |
247 | if (p->gc_mode == GC_GREEDY) | 264 | if (p->gc_mode == GC_GREEDY) |
248 | return get_valid_blocks(sbi, segno, sbi->segs_per_sec); | 265 | return get_greedy_cost(sbi, segno); |
249 | else | 266 | else |
250 | return get_cb_cost(sbi, segno); | 267 | return get_cb_cost(sbi, segno); |
251 | } | 268 | } |
@@ -322,13 +339,15 @@ static int get_victim_by_default(struct f2fs_sb_info *sbi, | |||
322 | nsearched++; | 339 | nsearched++; |
323 | } | 340 | } |
324 | 341 | ||
325 | |||
326 | secno = GET_SECNO(sbi, segno); | 342 | secno = GET_SECNO(sbi, segno); |
327 | 343 | ||
328 | if (sec_usage_check(sbi, secno)) | 344 | if (sec_usage_check(sbi, secno)) |
329 | goto next; | 345 | goto next; |
330 | if (gc_type == BG_GC && test_bit(secno, dirty_i->victim_secmap)) | 346 | if (gc_type == BG_GC && test_bit(secno, dirty_i->victim_secmap)) |
331 | goto next; | 347 | goto next; |
348 | if (gc_type == FG_GC && p.alloc_mode == LFS && | ||
349 | no_fggc_candidate(sbi, secno)) | ||
350 | goto next; | ||
332 | 351 | ||
333 | cost = get_gc_cost(sbi, segno, &p); | 352 | cost = get_gc_cost(sbi, segno, &p); |
334 | 353 | ||
@@ -569,6 +588,9 @@ static void move_encrypted_block(struct inode *inode, block_t bidx, | |||
569 | if (!check_valid_map(F2FS_I_SB(inode), segno, off)) | 588 | if (!check_valid_map(F2FS_I_SB(inode), segno, off)) |
570 | goto out; | 589 | goto out; |
571 | 590 | ||
591 | if (f2fs_is_atomic_file(inode)) | ||
592 | goto out; | ||
593 | |||
572 | set_new_dnode(&dn, inode, NULL, NULL, 0); | 594 | set_new_dnode(&dn, inode, NULL, NULL, 0); |
573 | err = get_dnode_of_data(&dn, bidx, LOOKUP_NODE); | 595 | err = get_dnode_of_data(&dn, bidx, LOOKUP_NODE); |
574 | if (err) | 596 | if (err) |
@@ -661,6 +683,9 @@ static void move_data_page(struct inode *inode, block_t bidx, int gc_type, | |||
661 | if (!check_valid_map(F2FS_I_SB(inode), segno, off)) | 683 | if (!check_valid_map(F2FS_I_SB(inode), segno, off)) |
662 | goto out; | 684 | goto out; |
663 | 685 | ||
686 | if (f2fs_is_atomic_file(inode)) | ||
687 | goto out; | ||
688 | |||
664 | if (gc_type == BG_GC) { | 689 | if (gc_type == BG_GC) { |
665 | if (PageWriteback(page)) | 690 | if (PageWriteback(page)) |
666 | goto out; | 691 | goto out; |
@@ -921,8 +946,6 @@ int f2fs_gc(struct f2fs_sb_info *sbi, bool sync, bool background) | |||
921 | 946 | ||
922 | cpc.reason = __get_cp_reason(sbi); | 947 | cpc.reason = __get_cp_reason(sbi); |
923 | gc_more: | 948 | gc_more: |
924 | segno = NULL_SEGNO; | ||
925 | |||
926 | if (unlikely(!(sbi->sb->s_flags & MS_ACTIVE))) | 949 | if (unlikely(!(sbi->sb->s_flags & MS_ACTIVE))) |
927 | goto stop; | 950 | goto stop; |
928 | if (unlikely(f2fs_cp_error(sbi))) { | 951 | if (unlikely(f2fs_cp_error(sbi))) { |
@@ -930,30 +953,23 @@ gc_more: | |||
930 | goto stop; | 953 | goto stop; |
931 | } | 954 | } |
932 | 955 | ||
933 | if (gc_type == BG_GC && has_not_enough_free_secs(sbi, sec_freed, 0)) { | 956 | if (gc_type == BG_GC && has_not_enough_free_secs(sbi, 0, 0)) { |
934 | gc_type = FG_GC; | ||
935 | /* | 957 | /* |
936 | * If there is no victim and no prefree segment but still not | 958 | * For example, if there are many prefree_segments below given |
937 | * enough free sections, we should flush dent/node blocks and do | 959 | * threshold, we can make them free by checkpoint. Then, we |
938 | * garbage collections. | 960 | * secure free segments which doesn't need fggc any more. |
939 | */ | 961 | */ |
940 | if (__get_victim(sbi, &segno, gc_type) || | 962 | ret = write_checkpoint(sbi, &cpc); |
941 | prefree_segments(sbi)) { | 963 | if (ret) |
942 | ret = write_checkpoint(sbi, &cpc); | 964 | goto stop; |
943 | if (ret) | 965 | if (has_not_enough_free_secs(sbi, 0, 0)) |
944 | goto stop; | 966 | gc_type = FG_GC; |
945 | segno = NULL_SEGNO; | ||
946 | } else if (has_not_enough_free_secs(sbi, 0, 0)) { | ||
947 | ret = write_checkpoint(sbi, &cpc); | ||
948 | if (ret) | ||
949 | goto stop; | ||
950 | } | ||
951 | } else if (gc_type == BG_GC && !background) { | ||
952 | /* f2fs_balance_fs doesn't need to do BG_GC in critical path. */ | ||
953 | goto stop; | ||
954 | } | 967 | } |
955 | 968 | ||
956 | if (segno == NULL_SEGNO && !__get_victim(sbi, &segno, gc_type)) | 969 | /* f2fs_balance_fs doesn't need to do BG_GC in critical path. */ |
970 | if (gc_type == BG_GC && !background) | ||
971 | goto stop; | ||
972 | if (!__get_victim(sbi, &segno, gc_type)) | ||
957 | goto stop; | 973 | goto stop; |
958 | ret = 0; | 974 | ret = 0; |
959 | 975 | ||
@@ -983,5 +999,16 @@ stop: | |||
983 | 999 | ||
984 | void build_gc_manager(struct f2fs_sb_info *sbi) | 1000 | void build_gc_manager(struct f2fs_sb_info *sbi) |
985 | { | 1001 | { |
1002 | u64 main_count, resv_count, ovp_count, blocks_per_sec; | ||
1003 | |||
986 | DIRTY_I(sbi)->v_ops = &default_v_ops; | 1004 | DIRTY_I(sbi)->v_ops = &default_v_ops; |
1005 | |||
1006 | /* threshold of # of valid blocks in a section for victims of FG_GC */ | ||
1007 | main_count = SM_I(sbi)->main_segments << sbi->log_blocks_per_seg; | ||
1008 | resv_count = SM_I(sbi)->reserved_segments << sbi->log_blocks_per_seg; | ||
1009 | ovp_count = SM_I(sbi)->ovp_segments << sbi->log_blocks_per_seg; | ||
1010 | blocks_per_sec = sbi->blocks_per_seg * sbi->segs_per_sec; | ||
1011 | |||
1012 | sbi->fggc_threshold = div64_u64((main_count - ovp_count) * blocks_per_sec, | ||
1013 | (main_count - resv_count)); | ||
987 | } | 1014 | } |
diff --git a/fs/f2fs/inode.c b/fs/f2fs/inode.c index af06bda51a54..24bb8213d974 100644 --- a/fs/f2fs/inode.c +++ b/fs/f2fs/inode.c | |||
@@ -373,8 +373,10 @@ void f2fs_evict_inode(struct inode *inode) | |||
373 | goto no_delete; | 373 | goto no_delete; |
374 | 374 | ||
375 | #ifdef CONFIG_F2FS_FAULT_INJECTION | 375 | #ifdef CONFIG_F2FS_FAULT_INJECTION |
376 | if (time_to_inject(sbi, FAULT_EVICT_INODE)) | 376 | if (time_to_inject(sbi, FAULT_EVICT_INODE)) { |
377 | f2fs_show_injection_info(FAULT_EVICT_INODE); | ||
377 | goto no_delete; | 378 | goto no_delete; |
379 | } | ||
378 | #endif | 380 | #endif |
379 | 381 | ||
380 | remove_ino_entry(sbi, inode->i_ino, APPEND_INO); | 382 | remove_ino_entry(sbi, inode->i_ino, APPEND_INO); |
diff --git a/fs/f2fs/namei.c b/fs/f2fs/namei.c index 11cabcadb1a3..98f00a3a7f50 100644 --- a/fs/f2fs/namei.c +++ b/fs/f2fs/namei.c | |||
@@ -321,9 +321,9 @@ static struct dentry *f2fs_lookup(struct inode *dir, struct dentry *dentry, | |||
321 | if (err) | 321 | if (err) |
322 | goto err_out; | 322 | goto err_out; |
323 | } | 323 | } |
324 | if (!IS_ERR(inode) && f2fs_encrypted_inode(dir) && | 324 | if (f2fs_encrypted_inode(dir) && |
325 | (S_ISDIR(inode->i_mode) || S_ISLNK(inode->i_mode)) && | 325 | (S_ISDIR(inode->i_mode) || S_ISLNK(inode->i_mode)) && |
326 | !fscrypt_has_permitted_context(dir, inode)) { | 326 | !fscrypt_has_permitted_context(dir, inode)) { |
327 | bool nokey = f2fs_encrypted_inode(inode) && | 327 | bool nokey = f2fs_encrypted_inode(inode) && |
328 | !fscrypt_has_encryption_key(inode); | 328 | !fscrypt_has_encryption_key(inode); |
329 | err = nokey ? -ENOKEY : -EPERM; | 329 | err = nokey ? -ENOKEY : -EPERM; |
@@ -663,6 +663,12 @@ static int f2fs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
663 | bool is_old_inline = f2fs_has_inline_dentry(old_dir); | 663 | bool is_old_inline = f2fs_has_inline_dentry(old_dir); |
664 | int err = -ENOENT; | 664 | int err = -ENOENT; |
665 | 665 | ||
666 | if ((f2fs_encrypted_inode(old_dir) && | ||
667 | !fscrypt_has_encryption_key(old_dir)) || | ||
668 | (f2fs_encrypted_inode(new_dir) && | ||
669 | !fscrypt_has_encryption_key(new_dir))) | ||
670 | return -ENOKEY; | ||
671 | |||
666 | if ((old_dir != new_dir) && f2fs_encrypted_inode(new_dir) && | 672 | if ((old_dir != new_dir) && f2fs_encrypted_inode(new_dir) && |
667 | !fscrypt_has_permitted_context(new_dir, old_inode)) { | 673 | !fscrypt_has_permitted_context(new_dir, old_inode)) { |
668 | err = -EPERM; | 674 | err = -EPERM; |
@@ -843,6 +849,12 @@ static int f2fs_cross_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
843 | int old_nlink = 0, new_nlink = 0; | 849 | int old_nlink = 0, new_nlink = 0; |
844 | int err = -ENOENT; | 850 | int err = -ENOENT; |
845 | 851 | ||
852 | if ((f2fs_encrypted_inode(old_dir) && | ||
853 | !fscrypt_has_encryption_key(old_dir)) || | ||
854 | (f2fs_encrypted_inode(new_dir) && | ||
855 | !fscrypt_has_encryption_key(new_dir))) | ||
856 | return -ENOKEY; | ||
857 | |||
846 | if ((f2fs_encrypted_inode(old_dir) || f2fs_encrypted_inode(new_dir)) && | 858 | if ((f2fs_encrypted_inode(old_dir) || f2fs_encrypted_inode(new_dir)) && |
847 | (old_dir != new_dir) && | 859 | (old_dir != new_dir) && |
848 | (!fscrypt_has_permitted_context(new_dir, old_inode) || | 860 | (!fscrypt_has_permitted_context(new_dir, old_inode) || |
diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c index b9078fdb3743..94967171dee8 100644 --- a/fs/f2fs/node.c +++ b/fs/f2fs/node.c | |||
@@ -245,12 +245,24 @@ bool need_inode_block_update(struct f2fs_sb_info *sbi, nid_t ino) | |||
245 | return need_update; | 245 | return need_update; |
246 | } | 246 | } |
247 | 247 | ||
248 | static struct nat_entry *grab_nat_entry(struct f2fs_nm_info *nm_i, nid_t nid) | 248 | static struct nat_entry *grab_nat_entry(struct f2fs_nm_info *nm_i, nid_t nid, |
249 | bool no_fail) | ||
249 | { | 250 | { |
250 | struct nat_entry *new; | 251 | struct nat_entry *new; |
251 | 252 | ||
252 | new = f2fs_kmem_cache_alloc(nat_entry_slab, GFP_NOFS); | 253 | if (no_fail) { |
253 | f2fs_radix_tree_insert(&nm_i->nat_root, nid, new); | 254 | new = f2fs_kmem_cache_alloc(nat_entry_slab, GFP_NOFS); |
255 | f2fs_radix_tree_insert(&nm_i->nat_root, nid, new); | ||
256 | } else { | ||
257 | new = kmem_cache_alloc(nat_entry_slab, GFP_NOFS); | ||
258 | if (!new) | ||
259 | return NULL; | ||
260 | if (radix_tree_insert(&nm_i->nat_root, nid, new)) { | ||
261 | kmem_cache_free(nat_entry_slab, new); | ||
262 | return NULL; | ||
263 | } | ||
264 | } | ||
265 | |||
254 | memset(new, 0, sizeof(struct nat_entry)); | 266 | memset(new, 0, sizeof(struct nat_entry)); |
255 | nat_set_nid(new, nid); | 267 | nat_set_nid(new, nid); |
256 | nat_reset_flag(new); | 268 | nat_reset_flag(new); |
@@ -267,8 +279,9 @@ static void cache_nat_entry(struct f2fs_sb_info *sbi, nid_t nid, | |||
267 | 279 | ||
268 | e = __lookup_nat_cache(nm_i, nid); | 280 | e = __lookup_nat_cache(nm_i, nid); |
269 | if (!e) { | 281 | if (!e) { |
270 | e = grab_nat_entry(nm_i, nid); | 282 | e = grab_nat_entry(nm_i, nid, false); |
271 | node_info_from_raw_nat(&e->ni, ne); | 283 | if (e) |
284 | node_info_from_raw_nat(&e->ni, ne); | ||
272 | } else { | 285 | } else { |
273 | f2fs_bug_on(sbi, nat_get_ino(e) != le32_to_cpu(ne->ino) || | 286 | f2fs_bug_on(sbi, nat_get_ino(e) != le32_to_cpu(ne->ino) || |
274 | nat_get_blkaddr(e) != | 287 | nat_get_blkaddr(e) != |
@@ -286,7 +299,7 @@ static void set_node_addr(struct f2fs_sb_info *sbi, struct node_info *ni, | |||
286 | down_write(&nm_i->nat_tree_lock); | 299 | down_write(&nm_i->nat_tree_lock); |
287 | e = __lookup_nat_cache(nm_i, ni->nid); | 300 | e = __lookup_nat_cache(nm_i, ni->nid); |
288 | if (!e) { | 301 | if (!e) { |
289 | e = grab_nat_entry(nm_i, ni->nid); | 302 | e = grab_nat_entry(nm_i, ni->nid, true); |
290 | copy_node_info(&e->ni, ni); | 303 | copy_node_info(&e->ni, ni); |
291 | f2fs_bug_on(sbi, ni->blk_addr == NEW_ADDR); | 304 | f2fs_bug_on(sbi, ni->blk_addr == NEW_ADDR); |
292 | } else if (new_blkaddr == NEW_ADDR) { | 305 | } else if (new_blkaddr == NEW_ADDR) { |
@@ -325,6 +338,9 @@ static void set_node_addr(struct f2fs_sb_info *sbi, struct node_info *ni, | |||
325 | set_nat_flag(e, IS_CHECKPOINTED, false); | 338 | set_nat_flag(e, IS_CHECKPOINTED, false); |
326 | __set_nat_cache_dirty(nm_i, e); | 339 | __set_nat_cache_dirty(nm_i, e); |
327 | 340 | ||
341 | if (enabled_nat_bits(sbi, NULL) && new_blkaddr == NEW_ADDR) | ||
342 | clear_bit_le(NAT_BLOCK_OFFSET(ni->nid), nm_i->empty_nat_bits); | ||
343 | |||
328 | /* update fsync_mark if its inode nat entry is still alive */ | 344 | /* update fsync_mark if its inode nat entry is still alive */ |
329 | if (ni->nid != ni->ino) | 345 | if (ni->nid != ni->ino) |
330 | e = __lookup_nat_cache(nm_i, ni->ino); | 346 | e = __lookup_nat_cache(nm_i, ni->ino); |
@@ -958,9 +974,6 @@ int truncate_xattr_node(struct inode *inode, struct page *page) | |||
958 | 974 | ||
959 | f2fs_i_xnid_write(inode, 0); | 975 | f2fs_i_xnid_write(inode, 0); |
960 | 976 | ||
961 | /* need to do checkpoint during fsync */ | ||
962 | F2FS_I(inode)->xattr_ver = cur_cp_version(F2FS_CKPT(sbi)); | ||
963 | |||
964 | set_new_dnode(&dn, inode, page, npage, nid); | 977 | set_new_dnode(&dn, inode, page, npage, nid); |
965 | 978 | ||
966 | if (page) | 979 | if (page) |
@@ -1018,7 +1031,7 @@ struct page *new_node_page(struct dnode_of_data *dn, | |||
1018 | unsigned int ofs, struct page *ipage) | 1031 | unsigned int ofs, struct page *ipage) |
1019 | { | 1032 | { |
1020 | struct f2fs_sb_info *sbi = F2FS_I_SB(dn->inode); | 1033 | struct f2fs_sb_info *sbi = F2FS_I_SB(dn->inode); |
1021 | struct node_info old_ni, new_ni; | 1034 | struct node_info new_ni; |
1022 | struct page *page; | 1035 | struct page *page; |
1023 | int err; | 1036 | int err; |
1024 | 1037 | ||
@@ -1033,13 +1046,15 @@ struct page *new_node_page(struct dnode_of_data *dn, | |||
1033 | err = -ENOSPC; | 1046 | err = -ENOSPC; |
1034 | goto fail; | 1047 | goto fail; |
1035 | } | 1048 | } |
1036 | 1049 | #ifdef CONFIG_F2FS_CHECK_FS | |
1037 | get_node_info(sbi, dn->nid, &old_ni); | 1050 | get_node_info(sbi, dn->nid, &new_ni); |
1038 | 1051 | f2fs_bug_on(sbi, new_ni.blk_addr != NULL_ADDR); | |
1039 | /* Reinitialize old_ni with new node page */ | 1052 | #endif |
1040 | f2fs_bug_on(sbi, old_ni.blk_addr != NULL_ADDR); | 1053 | new_ni.nid = dn->nid; |
1041 | new_ni = old_ni; | ||
1042 | new_ni.ino = dn->inode->i_ino; | 1054 | new_ni.ino = dn->inode->i_ino; |
1055 | new_ni.blk_addr = NULL_ADDR; | ||
1056 | new_ni.flag = 0; | ||
1057 | new_ni.version = 0; | ||
1043 | set_node_addr(sbi, &new_ni, NEW_ADDR, false); | 1058 | set_node_addr(sbi, &new_ni, NEW_ADDR, false); |
1044 | 1059 | ||
1045 | f2fs_wait_on_page_writeback(page, NODE, true); | 1060 | f2fs_wait_on_page_writeback(page, NODE, true); |
@@ -1305,16 +1320,99 @@ continue_unlock: | |||
1305 | return last_page; | 1320 | return last_page; |
1306 | } | 1321 | } |
1307 | 1322 | ||
1323 | static int __write_node_page(struct page *page, bool atomic, bool *submitted, | ||
1324 | struct writeback_control *wbc) | ||
1325 | { | ||
1326 | struct f2fs_sb_info *sbi = F2FS_P_SB(page); | ||
1327 | nid_t nid; | ||
1328 | struct node_info ni; | ||
1329 | struct f2fs_io_info fio = { | ||
1330 | .sbi = sbi, | ||
1331 | .type = NODE, | ||
1332 | .op = REQ_OP_WRITE, | ||
1333 | .op_flags = wbc_to_write_flags(wbc), | ||
1334 | .page = page, | ||
1335 | .encrypted_page = NULL, | ||
1336 | .submitted = false, | ||
1337 | }; | ||
1338 | |||
1339 | trace_f2fs_writepage(page, NODE); | ||
1340 | |||
1341 | if (unlikely(is_sbi_flag_set(sbi, SBI_POR_DOING))) | ||
1342 | goto redirty_out; | ||
1343 | if (unlikely(f2fs_cp_error(sbi))) | ||
1344 | goto redirty_out; | ||
1345 | |||
1346 | /* get old block addr of this node page */ | ||
1347 | nid = nid_of_node(page); | ||
1348 | f2fs_bug_on(sbi, page->index != nid); | ||
1349 | |||
1350 | if (wbc->for_reclaim) { | ||
1351 | if (!down_read_trylock(&sbi->node_write)) | ||
1352 | goto redirty_out; | ||
1353 | } else { | ||
1354 | down_read(&sbi->node_write); | ||
1355 | } | ||
1356 | |||
1357 | get_node_info(sbi, nid, &ni); | ||
1358 | |||
1359 | /* This page is already truncated */ | ||
1360 | if (unlikely(ni.blk_addr == NULL_ADDR)) { | ||
1361 | ClearPageUptodate(page); | ||
1362 | dec_page_count(sbi, F2FS_DIRTY_NODES); | ||
1363 | up_read(&sbi->node_write); | ||
1364 | unlock_page(page); | ||
1365 | return 0; | ||
1366 | } | ||
1367 | |||
1368 | if (atomic && !test_opt(sbi, NOBARRIER)) | ||
1369 | fio.op_flags |= REQ_PREFLUSH | REQ_FUA; | ||
1370 | |||
1371 | set_page_writeback(page); | ||
1372 | fio.old_blkaddr = ni.blk_addr; | ||
1373 | write_node_page(nid, &fio); | ||
1374 | set_node_addr(sbi, &ni, fio.new_blkaddr, is_fsync_dnode(page)); | ||
1375 | dec_page_count(sbi, F2FS_DIRTY_NODES); | ||
1376 | up_read(&sbi->node_write); | ||
1377 | |||
1378 | if (wbc->for_reclaim) { | ||
1379 | f2fs_submit_merged_bio_cond(sbi, page->mapping->host, 0, | ||
1380 | page->index, NODE, WRITE); | ||
1381 | submitted = NULL; | ||
1382 | } | ||
1383 | |||
1384 | unlock_page(page); | ||
1385 | |||
1386 | if (unlikely(f2fs_cp_error(sbi))) { | ||
1387 | f2fs_submit_merged_bio(sbi, NODE, WRITE); | ||
1388 | submitted = NULL; | ||
1389 | } | ||
1390 | if (submitted) | ||
1391 | *submitted = fio.submitted; | ||
1392 | |||
1393 | return 0; | ||
1394 | |||
1395 | redirty_out: | ||
1396 | redirty_page_for_writepage(wbc, page); | ||
1397 | return AOP_WRITEPAGE_ACTIVATE; | ||
1398 | } | ||
1399 | |||
1400 | static int f2fs_write_node_page(struct page *page, | ||
1401 | struct writeback_control *wbc) | ||
1402 | { | ||
1403 | return __write_node_page(page, false, NULL, wbc); | ||
1404 | } | ||
1405 | |||
1308 | int fsync_node_pages(struct f2fs_sb_info *sbi, struct inode *inode, | 1406 | int fsync_node_pages(struct f2fs_sb_info *sbi, struct inode *inode, |
1309 | struct writeback_control *wbc, bool atomic) | 1407 | struct writeback_control *wbc, bool atomic) |
1310 | { | 1408 | { |
1311 | pgoff_t index, end; | 1409 | pgoff_t index, end; |
1410 | pgoff_t last_idx = ULONG_MAX; | ||
1312 | struct pagevec pvec; | 1411 | struct pagevec pvec; |
1313 | int ret = 0; | 1412 | int ret = 0; |
1314 | struct page *last_page = NULL; | 1413 | struct page *last_page = NULL; |
1315 | bool marked = false; | 1414 | bool marked = false; |
1316 | nid_t ino = inode->i_ino; | 1415 | nid_t ino = inode->i_ino; |
1317 | int nwritten = 0; | ||
1318 | 1416 | ||
1319 | if (atomic) { | 1417 | if (atomic) { |
1320 | last_page = last_fsync_dnode(sbi, ino); | 1418 | last_page = last_fsync_dnode(sbi, ino); |
@@ -1336,6 +1434,7 @@ retry: | |||
1336 | 1434 | ||
1337 | for (i = 0; i < nr_pages; i++) { | 1435 | for (i = 0; i < nr_pages; i++) { |
1338 | struct page *page = pvec.pages[i]; | 1436 | struct page *page = pvec.pages[i]; |
1437 | bool submitted = false; | ||
1339 | 1438 | ||
1340 | if (unlikely(f2fs_cp_error(sbi))) { | 1439 | if (unlikely(f2fs_cp_error(sbi))) { |
1341 | f2fs_put_page(last_page, 0); | 1440 | f2fs_put_page(last_page, 0); |
@@ -1384,13 +1483,15 @@ continue_unlock: | |||
1384 | if (!clear_page_dirty_for_io(page)) | 1483 | if (!clear_page_dirty_for_io(page)) |
1385 | goto continue_unlock; | 1484 | goto continue_unlock; |
1386 | 1485 | ||
1387 | ret = NODE_MAPPING(sbi)->a_ops->writepage(page, wbc); | 1486 | ret = __write_node_page(page, atomic && |
1487 | page == last_page, | ||
1488 | &submitted, wbc); | ||
1388 | if (ret) { | 1489 | if (ret) { |
1389 | unlock_page(page); | 1490 | unlock_page(page); |
1390 | f2fs_put_page(last_page, 0); | 1491 | f2fs_put_page(last_page, 0); |
1391 | break; | 1492 | break; |
1392 | } else { | 1493 | } else if (submitted) { |
1393 | nwritten++; | 1494 | last_idx = page->index; |
1394 | } | 1495 | } |
1395 | 1496 | ||
1396 | if (page == last_page) { | 1497 | if (page == last_page) { |
@@ -1416,8 +1517,9 @@ continue_unlock: | |||
1416 | goto retry; | 1517 | goto retry; |
1417 | } | 1518 | } |
1418 | out: | 1519 | out: |
1419 | if (nwritten) | 1520 | if (last_idx != ULONG_MAX) |
1420 | f2fs_submit_merged_bio_cond(sbi, NULL, NULL, ino, NODE, WRITE); | 1521 | f2fs_submit_merged_bio_cond(sbi, NULL, ino, last_idx, |
1522 | NODE, WRITE); | ||
1421 | return ret ? -EIO: 0; | 1523 | return ret ? -EIO: 0; |
1422 | } | 1524 | } |
1423 | 1525 | ||
@@ -1445,6 +1547,7 @@ next_step: | |||
1445 | 1547 | ||
1446 | for (i = 0; i < nr_pages; i++) { | 1548 | for (i = 0; i < nr_pages; i++) { |
1447 | struct page *page = pvec.pages[i]; | 1549 | struct page *page = pvec.pages[i]; |
1550 | bool submitted = false; | ||
1448 | 1551 | ||
1449 | if (unlikely(f2fs_cp_error(sbi))) { | 1552 | if (unlikely(f2fs_cp_error(sbi))) { |
1450 | pagevec_release(&pvec); | 1553 | pagevec_release(&pvec); |
@@ -1498,9 +1601,10 @@ continue_unlock: | |||
1498 | set_fsync_mark(page, 0); | 1601 | set_fsync_mark(page, 0); |
1499 | set_dentry_mark(page, 0); | 1602 | set_dentry_mark(page, 0); |
1500 | 1603 | ||
1501 | if (NODE_MAPPING(sbi)->a_ops->writepage(page, wbc)) | 1604 | ret = __write_node_page(page, false, &submitted, wbc); |
1605 | if (ret) | ||
1502 | unlock_page(page); | 1606 | unlock_page(page); |
1503 | else | 1607 | else if (submitted) |
1504 | nwritten++; | 1608 | nwritten++; |
1505 | 1609 | ||
1506 | if (--wbc->nr_to_write == 0) | 1610 | if (--wbc->nr_to_write == 0) |
@@ -1564,72 +1668,6 @@ int wait_on_node_pages_writeback(struct f2fs_sb_info *sbi, nid_t ino) | |||
1564 | return ret; | 1668 | return ret; |
1565 | } | 1669 | } |
1566 | 1670 | ||
1567 | static int f2fs_write_node_page(struct page *page, | ||
1568 | struct writeback_control *wbc) | ||
1569 | { | ||
1570 | struct f2fs_sb_info *sbi = F2FS_P_SB(page); | ||
1571 | nid_t nid; | ||
1572 | struct node_info ni; | ||
1573 | struct f2fs_io_info fio = { | ||
1574 | .sbi = sbi, | ||
1575 | .type = NODE, | ||
1576 | .op = REQ_OP_WRITE, | ||
1577 | .op_flags = wbc_to_write_flags(wbc), | ||
1578 | .page = page, | ||
1579 | .encrypted_page = NULL, | ||
1580 | }; | ||
1581 | |||
1582 | trace_f2fs_writepage(page, NODE); | ||
1583 | |||
1584 | if (unlikely(is_sbi_flag_set(sbi, SBI_POR_DOING))) | ||
1585 | goto redirty_out; | ||
1586 | if (unlikely(f2fs_cp_error(sbi))) | ||
1587 | goto redirty_out; | ||
1588 | |||
1589 | /* get old block addr of this node page */ | ||
1590 | nid = nid_of_node(page); | ||
1591 | f2fs_bug_on(sbi, page->index != nid); | ||
1592 | |||
1593 | if (wbc->for_reclaim) { | ||
1594 | if (!down_read_trylock(&sbi->node_write)) | ||
1595 | goto redirty_out; | ||
1596 | } else { | ||
1597 | down_read(&sbi->node_write); | ||
1598 | } | ||
1599 | |||
1600 | get_node_info(sbi, nid, &ni); | ||
1601 | |||
1602 | /* This page is already truncated */ | ||
1603 | if (unlikely(ni.blk_addr == NULL_ADDR)) { | ||
1604 | ClearPageUptodate(page); | ||
1605 | dec_page_count(sbi, F2FS_DIRTY_NODES); | ||
1606 | up_read(&sbi->node_write); | ||
1607 | unlock_page(page); | ||
1608 | return 0; | ||
1609 | } | ||
1610 | |||
1611 | set_page_writeback(page); | ||
1612 | fio.old_blkaddr = ni.blk_addr; | ||
1613 | write_node_page(nid, &fio); | ||
1614 | set_node_addr(sbi, &ni, fio.new_blkaddr, is_fsync_dnode(page)); | ||
1615 | dec_page_count(sbi, F2FS_DIRTY_NODES); | ||
1616 | up_read(&sbi->node_write); | ||
1617 | |||
1618 | if (wbc->for_reclaim) | ||
1619 | f2fs_submit_merged_bio_cond(sbi, NULL, page, 0, NODE, WRITE); | ||
1620 | |||
1621 | unlock_page(page); | ||
1622 | |||
1623 | if (unlikely(f2fs_cp_error(sbi))) | ||
1624 | f2fs_submit_merged_bio(sbi, NODE, WRITE); | ||
1625 | |||
1626 | return 0; | ||
1627 | |||
1628 | redirty_out: | ||
1629 | redirty_page_for_writepage(wbc, page); | ||
1630 | return AOP_WRITEPAGE_ACTIVATE; | ||
1631 | } | ||
1632 | |||
1633 | static int f2fs_write_node_pages(struct address_space *mapping, | 1671 | static int f2fs_write_node_pages(struct address_space *mapping, |
1634 | struct writeback_control *wbc) | 1672 | struct writeback_control *wbc) |
1635 | { | 1673 | { |
@@ -1727,7 +1765,8 @@ static void __remove_nid_from_list(struct f2fs_sb_info *sbi, | |||
1727 | radix_tree_delete(&nm_i->free_nid_root, i->nid); | 1765 | radix_tree_delete(&nm_i->free_nid_root, i->nid); |
1728 | } | 1766 | } |
1729 | 1767 | ||
1730 | static int add_free_nid(struct f2fs_sb_info *sbi, nid_t nid, bool build) | 1768 | /* return if the nid is recognized as free */ |
1769 | static bool add_free_nid(struct f2fs_sb_info *sbi, nid_t nid, bool build) | ||
1731 | { | 1770 | { |
1732 | struct f2fs_nm_info *nm_i = NM_I(sbi); | 1771 | struct f2fs_nm_info *nm_i = NM_I(sbi); |
1733 | struct free_nid *i; | 1772 | struct free_nid *i; |
@@ -1736,14 +1775,14 @@ static int add_free_nid(struct f2fs_sb_info *sbi, nid_t nid, bool build) | |||
1736 | 1775 | ||
1737 | /* 0 nid should not be used */ | 1776 | /* 0 nid should not be used */ |
1738 | if (unlikely(nid == 0)) | 1777 | if (unlikely(nid == 0)) |
1739 | return 0; | 1778 | return false; |
1740 | 1779 | ||
1741 | if (build) { | 1780 | if (build) { |
1742 | /* do not add allocated nids */ | 1781 | /* do not add allocated nids */ |
1743 | ne = __lookup_nat_cache(nm_i, nid); | 1782 | ne = __lookup_nat_cache(nm_i, nid); |
1744 | if (ne && (!get_nat_flag(ne, IS_CHECKPOINTED) || | 1783 | if (ne && (!get_nat_flag(ne, IS_CHECKPOINTED) || |
1745 | nat_get_blkaddr(ne) != NULL_ADDR)) | 1784 | nat_get_blkaddr(ne) != NULL_ADDR)) |
1746 | return 0; | 1785 | return false; |
1747 | } | 1786 | } |
1748 | 1787 | ||
1749 | i = f2fs_kmem_cache_alloc(free_nid_slab, GFP_NOFS); | 1788 | i = f2fs_kmem_cache_alloc(free_nid_slab, GFP_NOFS); |
@@ -1752,7 +1791,7 @@ static int add_free_nid(struct f2fs_sb_info *sbi, nid_t nid, bool build) | |||
1752 | 1791 | ||
1753 | if (radix_tree_preload(GFP_NOFS)) { | 1792 | if (radix_tree_preload(GFP_NOFS)) { |
1754 | kmem_cache_free(free_nid_slab, i); | 1793 | kmem_cache_free(free_nid_slab, i); |
1755 | return 0; | 1794 | return true; |
1756 | } | 1795 | } |
1757 | 1796 | ||
1758 | spin_lock(&nm_i->nid_list_lock); | 1797 | spin_lock(&nm_i->nid_list_lock); |
@@ -1761,9 +1800,9 @@ static int add_free_nid(struct f2fs_sb_info *sbi, nid_t nid, bool build) | |||
1761 | radix_tree_preload_end(); | 1800 | radix_tree_preload_end(); |
1762 | if (err) { | 1801 | if (err) { |
1763 | kmem_cache_free(free_nid_slab, i); | 1802 | kmem_cache_free(free_nid_slab, i); |
1764 | return 0; | 1803 | return true; |
1765 | } | 1804 | } |
1766 | return 1; | 1805 | return true; |
1767 | } | 1806 | } |
1768 | 1807 | ||
1769 | static void remove_free_nid(struct f2fs_sb_info *sbi, nid_t nid) | 1808 | static void remove_free_nid(struct f2fs_sb_info *sbi, nid_t nid) |
@@ -1784,17 +1823,36 @@ static void remove_free_nid(struct f2fs_sb_info *sbi, nid_t nid) | |||
1784 | kmem_cache_free(free_nid_slab, i); | 1823 | kmem_cache_free(free_nid_slab, i); |
1785 | } | 1824 | } |
1786 | 1825 | ||
1826 | void update_free_nid_bitmap(struct f2fs_sb_info *sbi, nid_t nid, bool set) | ||
1827 | { | ||
1828 | struct f2fs_nm_info *nm_i = NM_I(sbi); | ||
1829 | unsigned int nat_ofs = NAT_BLOCK_OFFSET(nid); | ||
1830 | unsigned int nid_ofs = nid - START_NID(nid); | ||
1831 | |||
1832 | if (!test_bit_le(nat_ofs, nm_i->nat_block_bitmap)) | ||
1833 | return; | ||
1834 | |||
1835 | if (set) | ||
1836 | set_bit_le(nid_ofs, nm_i->free_nid_bitmap[nat_ofs]); | ||
1837 | else | ||
1838 | clear_bit_le(nid_ofs, nm_i->free_nid_bitmap[nat_ofs]); | ||
1839 | } | ||
1840 | |||
1787 | static void scan_nat_page(struct f2fs_sb_info *sbi, | 1841 | static void scan_nat_page(struct f2fs_sb_info *sbi, |
1788 | struct page *nat_page, nid_t start_nid) | 1842 | struct page *nat_page, nid_t start_nid) |
1789 | { | 1843 | { |
1790 | struct f2fs_nm_info *nm_i = NM_I(sbi); | 1844 | struct f2fs_nm_info *nm_i = NM_I(sbi); |
1791 | struct f2fs_nat_block *nat_blk = page_address(nat_page); | 1845 | struct f2fs_nat_block *nat_blk = page_address(nat_page); |
1792 | block_t blk_addr; | 1846 | block_t blk_addr; |
1847 | unsigned int nat_ofs = NAT_BLOCK_OFFSET(start_nid); | ||
1793 | int i; | 1848 | int i; |
1794 | 1849 | ||
1850 | set_bit_le(nat_ofs, nm_i->nat_block_bitmap); | ||
1851 | |||
1795 | i = start_nid % NAT_ENTRY_PER_BLOCK; | 1852 | i = start_nid % NAT_ENTRY_PER_BLOCK; |
1796 | 1853 | ||
1797 | for (; i < NAT_ENTRY_PER_BLOCK; i++, start_nid++) { | 1854 | for (; i < NAT_ENTRY_PER_BLOCK; i++, start_nid++) { |
1855 | bool freed = false; | ||
1798 | 1856 | ||
1799 | if (unlikely(start_nid >= nm_i->max_nid)) | 1857 | if (unlikely(start_nid >= nm_i->max_nid)) |
1800 | break; | 1858 | break; |
@@ -1802,11 +1860,106 @@ static void scan_nat_page(struct f2fs_sb_info *sbi, | |||
1802 | blk_addr = le32_to_cpu(nat_blk->entries[i].block_addr); | 1860 | blk_addr = le32_to_cpu(nat_blk->entries[i].block_addr); |
1803 | f2fs_bug_on(sbi, blk_addr == NEW_ADDR); | 1861 | f2fs_bug_on(sbi, blk_addr == NEW_ADDR); |
1804 | if (blk_addr == NULL_ADDR) | 1862 | if (blk_addr == NULL_ADDR) |
1805 | add_free_nid(sbi, start_nid, true); | 1863 | freed = add_free_nid(sbi, start_nid, true); |
1864 | update_free_nid_bitmap(sbi, start_nid, freed); | ||
1865 | } | ||
1866 | } | ||
1867 | |||
1868 | static void scan_free_nid_bits(struct f2fs_sb_info *sbi) | ||
1869 | { | ||
1870 | struct f2fs_nm_info *nm_i = NM_I(sbi); | ||
1871 | struct curseg_info *curseg = CURSEG_I(sbi, CURSEG_HOT_DATA); | ||
1872 | struct f2fs_journal *journal = curseg->journal; | ||
1873 | unsigned int i, idx; | ||
1874 | |||
1875 | down_read(&nm_i->nat_tree_lock); | ||
1876 | |||
1877 | for (i = 0; i < nm_i->nat_blocks; i++) { | ||
1878 | if (!test_bit_le(i, nm_i->nat_block_bitmap)) | ||
1879 | continue; | ||
1880 | for (idx = 0; idx < NAT_ENTRY_PER_BLOCK; idx++) { | ||
1881 | nid_t nid; | ||
1882 | |||
1883 | if (!test_bit_le(idx, nm_i->free_nid_bitmap[i])) | ||
1884 | continue; | ||
1885 | |||
1886 | nid = i * NAT_ENTRY_PER_BLOCK + idx; | ||
1887 | add_free_nid(sbi, nid, true); | ||
1888 | |||
1889 | if (nm_i->nid_cnt[FREE_NID_LIST] >= MAX_FREE_NIDS) | ||
1890 | goto out; | ||
1891 | } | ||
1892 | } | ||
1893 | out: | ||
1894 | down_read(&curseg->journal_rwsem); | ||
1895 | for (i = 0; i < nats_in_cursum(journal); i++) { | ||
1896 | block_t addr; | ||
1897 | nid_t nid; | ||
1898 | |||
1899 | addr = le32_to_cpu(nat_in_journal(journal, i).block_addr); | ||
1900 | nid = le32_to_cpu(nid_in_journal(journal, i)); | ||
1901 | if (addr == NULL_ADDR) | ||
1902 | add_free_nid(sbi, nid, true); | ||
1903 | else | ||
1904 | remove_free_nid(sbi, nid); | ||
1806 | } | 1905 | } |
1906 | up_read(&curseg->journal_rwsem); | ||
1907 | up_read(&nm_i->nat_tree_lock); | ||
1807 | } | 1908 | } |
1808 | 1909 | ||
1809 | static void __build_free_nids(struct f2fs_sb_info *sbi, bool sync) | 1910 | static int scan_nat_bits(struct f2fs_sb_info *sbi) |
1911 | { | ||
1912 | struct f2fs_nm_info *nm_i = NM_I(sbi); | ||
1913 | struct page *page; | ||
1914 | unsigned int i = 0; | ||
1915 | nid_t nid; | ||
1916 | |||
1917 | if (!enabled_nat_bits(sbi, NULL)) | ||
1918 | return -EAGAIN; | ||
1919 | |||
1920 | down_read(&nm_i->nat_tree_lock); | ||
1921 | check_empty: | ||
1922 | i = find_next_bit_le(nm_i->empty_nat_bits, nm_i->nat_blocks, i); | ||
1923 | if (i >= nm_i->nat_blocks) { | ||
1924 | i = 0; | ||
1925 | goto check_partial; | ||
1926 | } | ||
1927 | |||
1928 | for (nid = i * NAT_ENTRY_PER_BLOCK; nid < (i + 1) * NAT_ENTRY_PER_BLOCK; | ||
1929 | nid++) { | ||
1930 | if (unlikely(nid >= nm_i->max_nid)) | ||
1931 | break; | ||
1932 | add_free_nid(sbi, nid, true); | ||
1933 | } | ||
1934 | |||
1935 | if (nm_i->nid_cnt[FREE_NID_LIST] >= MAX_FREE_NIDS) | ||
1936 | goto out; | ||
1937 | i++; | ||
1938 | goto check_empty; | ||
1939 | |||
1940 | check_partial: | ||
1941 | i = find_next_zero_bit_le(nm_i->full_nat_bits, nm_i->nat_blocks, i); | ||
1942 | if (i >= nm_i->nat_blocks) { | ||
1943 | disable_nat_bits(sbi, true); | ||
1944 | up_read(&nm_i->nat_tree_lock); | ||
1945 | return -EINVAL; | ||
1946 | } | ||
1947 | |||
1948 | nid = i * NAT_ENTRY_PER_BLOCK; | ||
1949 | page = get_current_nat_page(sbi, nid); | ||
1950 | scan_nat_page(sbi, page, nid); | ||
1951 | f2fs_put_page(page, 1); | ||
1952 | |||
1953 | if (nm_i->nid_cnt[FREE_NID_LIST] < MAX_FREE_NIDS) { | ||
1954 | i++; | ||
1955 | goto check_partial; | ||
1956 | } | ||
1957 | out: | ||
1958 | up_read(&nm_i->nat_tree_lock); | ||
1959 | return 0; | ||
1960 | } | ||
1961 | |||
1962 | static void __build_free_nids(struct f2fs_sb_info *sbi, bool sync, bool mount) | ||
1810 | { | 1963 | { |
1811 | struct f2fs_nm_info *nm_i = NM_I(sbi); | 1964 | struct f2fs_nm_info *nm_i = NM_I(sbi); |
1812 | struct curseg_info *curseg = CURSEG_I(sbi, CURSEG_HOT_DATA); | 1965 | struct curseg_info *curseg = CURSEG_I(sbi, CURSEG_HOT_DATA); |
@@ -1821,6 +1974,29 @@ static void __build_free_nids(struct f2fs_sb_info *sbi, bool sync) | |||
1821 | if (!sync && !available_free_memory(sbi, FREE_NIDS)) | 1974 | if (!sync && !available_free_memory(sbi, FREE_NIDS)) |
1822 | return; | 1975 | return; |
1823 | 1976 | ||
1977 | if (!mount) { | ||
1978 | /* try to find free nids in free_nid_bitmap */ | ||
1979 | scan_free_nid_bits(sbi); | ||
1980 | |||
1981 | if (nm_i->nid_cnt[FREE_NID_LIST]) | ||
1982 | return; | ||
1983 | |||
1984 | /* try to find free nids with nat_bits */ | ||
1985 | if (!scan_nat_bits(sbi) && nm_i->nid_cnt[FREE_NID_LIST]) | ||
1986 | return; | ||
1987 | } | ||
1988 | |||
1989 | /* find next valid candidate */ | ||
1990 | if (enabled_nat_bits(sbi, NULL)) { | ||
1991 | int idx = find_next_zero_bit_le(nm_i->full_nat_bits, | ||
1992 | nm_i->nat_blocks, 0); | ||
1993 | |||
1994 | if (idx >= nm_i->nat_blocks) | ||
1995 | set_sbi_flag(sbi, SBI_NEED_FSCK); | ||
1996 | else | ||
1997 | nid = idx * NAT_ENTRY_PER_BLOCK; | ||
1998 | } | ||
1999 | |||
1824 | /* readahead nat pages to be scanned */ | 2000 | /* readahead nat pages to be scanned */ |
1825 | ra_meta_pages(sbi, NAT_BLOCK_OFFSET(nid), FREE_NID_PAGES, | 2001 | ra_meta_pages(sbi, NAT_BLOCK_OFFSET(nid), FREE_NID_PAGES, |
1826 | META_NAT, true); | 2002 | META_NAT, true); |
@@ -1863,10 +2039,10 @@ static void __build_free_nids(struct f2fs_sb_info *sbi, bool sync) | |||
1863 | nm_i->ra_nid_pages, META_NAT, false); | 2039 | nm_i->ra_nid_pages, META_NAT, false); |
1864 | } | 2040 | } |
1865 | 2041 | ||
1866 | void build_free_nids(struct f2fs_sb_info *sbi, bool sync) | 2042 | void build_free_nids(struct f2fs_sb_info *sbi, bool sync, bool mount) |
1867 | { | 2043 | { |
1868 | mutex_lock(&NM_I(sbi)->build_lock); | 2044 | mutex_lock(&NM_I(sbi)->build_lock); |
1869 | __build_free_nids(sbi, sync); | 2045 | __build_free_nids(sbi, sync, mount); |
1870 | mutex_unlock(&NM_I(sbi)->build_lock); | 2046 | mutex_unlock(&NM_I(sbi)->build_lock); |
1871 | } | 2047 | } |
1872 | 2048 | ||
@@ -1881,8 +2057,10 @@ bool alloc_nid(struct f2fs_sb_info *sbi, nid_t *nid) | |||
1881 | struct free_nid *i = NULL; | 2057 | struct free_nid *i = NULL; |
1882 | retry: | 2058 | retry: |
1883 | #ifdef CONFIG_F2FS_FAULT_INJECTION | 2059 | #ifdef CONFIG_F2FS_FAULT_INJECTION |
1884 | if (time_to_inject(sbi, FAULT_ALLOC_NID)) | 2060 | if (time_to_inject(sbi, FAULT_ALLOC_NID)) { |
2061 | f2fs_show_injection_info(FAULT_ALLOC_NID); | ||
1885 | return false; | 2062 | return false; |
2063 | } | ||
1886 | #endif | 2064 | #endif |
1887 | spin_lock(&nm_i->nid_list_lock); | 2065 | spin_lock(&nm_i->nid_list_lock); |
1888 | 2066 | ||
@@ -1902,13 +2080,16 @@ retry: | |||
1902 | i->state = NID_ALLOC; | 2080 | i->state = NID_ALLOC; |
1903 | __insert_nid_to_list(sbi, i, ALLOC_NID_LIST, false); | 2081 | __insert_nid_to_list(sbi, i, ALLOC_NID_LIST, false); |
1904 | nm_i->available_nids--; | 2082 | nm_i->available_nids--; |
2083 | |||
2084 | update_free_nid_bitmap(sbi, *nid, false); | ||
2085 | |||
1905 | spin_unlock(&nm_i->nid_list_lock); | 2086 | spin_unlock(&nm_i->nid_list_lock); |
1906 | return true; | 2087 | return true; |
1907 | } | 2088 | } |
1908 | spin_unlock(&nm_i->nid_list_lock); | 2089 | spin_unlock(&nm_i->nid_list_lock); |
1909 | 2090 | ||
1910 | /* Let's scan nat pages and its caches to get free nids */ | 2091 | /* Let's scan nat pages and its caches to get free nids */ |
1911 | build_free_nids(sbi, true); | 2092 | build_free_nids(sbi, true, false); |
1912 | goto retry; | 2093 | goto retry; |
1913 | } | 2094 | } |
1914 | 2095 | ||
@@ -1956,6 +2137,8 @@ void alloc_nid_failed(struct f2fs_sb_info *sbi, nid_t nid) | |||
1956 | 2137 | ||
1957 | nm_i->available_nids++; | 2138 | nm_i->available_nids++; |
1958 | 2139 | ||
2140 | update_free_nid_bitmap(sbi, nid, true); | ||
2141 | |||
1959 | spin_unlock(&nm_i->nid_list_lock); | 2142 | spin_unlock(&nm_i->nid_list_lock); |
1960 | 2143 | ||
1961 | if (need_free) | 2144 | if (need_free) |
@@ -2018,18 +2201,18 @@ update_inode: | |||
2018 | f2fs_put_page(ipage, 1); | 2201 | f2fs_put_page(ipage, 1); |
2019 | } | 2202 | } |
2020 | 2203 | ||
2021 | void recover_xattr_data(struct inode *inode, struct page *page, block_t blkaddr) | 2204 | int recover_xattr_data(struct inode *inode, struct page *page, block_t blkaddr) |
2022 | { | 2205 | { |
2023 | struct f2fs_sb_info *sbi = F2FS_I_SB(inode); | 2206 | struct f2fs_sb_info *sbi = F2FS_I_SB(inode); |
2024 | nid_t prev_xnid = F2FS_I(inode)->i_xattr_nid; | 2207 | nid_t prev_xnid = F2FS_I(inode)->i_xattr_nid; |
2025 | nid_t new_xnid = nid_of_node(page); | 2208 | nid_t new_xnid = nid_of_node(page); |
2026 | struct node_info ni; | 2209 | struct node_info ni; |
2210 | struct page *xpage; | ||
2027 | 2211 | ||
2028 | /* 1: invalidate the previous xattr nid */ | ||
2029 | if (!prev_xnid) | 2212 | if (!prev_xnid) |
2030 | goto recover_xnid; | 2213 | goto recover_xnid; |
2031 | 2214 | ||
2032 | /* Deallocate node address */ | 2215 | /* 1: invalidate the previous xattr nid */ |
2033 | get_node_info(sbi, prev_xnid, &ni); | 2216 | get_node_info(sbi, prev_xnid, &ni); |
2034 | f2fs_bug_on(sbi, ni.blk_addr == NULL_ADDR); | 2217 | f2fs_bug_on(sbi, ni.blk_addr == NULL_ADDR); |
2035 | invalidate_blocks(sbi, ni.blk_addr); | 2218 | invalidate_blocks(sbi, ni.blk_addr); |
@@ -2037,19 +2220,27 @@ void recover_xattr_data(struct inode *inode, struct page *page, block_t blkaddr) | |||
2037 | set_node_addr(sbi, &ni, NULL_ADDR, false); | 2220 | set_node_addr(sbi, &ni, NULL_ADDR, false); |
2038 | 2221 | ||
2039 | recover_xnid: | 2222 | recover_xnid: |
2040 | /* 2: allocate new xattr nid */ | 2223 | /* 2: update xattr nid in inode */ |
2224 | remove_free_nid(sbi, new_xnid); | ||
2225 | f2fs_i_xnid_write(inode, new_xnid); | ||
2041 | if (unlikely(!inc_valid_node_count(sbi, inode))) | 2226 | if (unlikely(!inc_valid_node_count(sbi, inode))) |
2042 | f2fs_bug_on(sbi, 1); | 2227 | f2fs_bug_on(sbi, 1); |
2228 | update_inode_page(inode); | ||
2229 | |||
2230 | /* 3: update and set xattr node page dirty */ | ||
2231 | xpage = grab_cache_page(NODE_MAPPING(sbi), new_xnid); | ||
2232 | if (!xpage) | ||
2233 | return -ENOMEM; | ||
2234 | |||
2235 | memcpy(F2FS_NODE(xpage), F2FS_NODE(page), PAGE_SIZE); | ||
2043 | 2236 | ||
2044 | remove_free_nid(sbi, new_xnid); | ||
2045 | get_node_info(sbi, new_xnid, &ni); | 2237 | get_node_info(sbi, new_xnid, &ni); |
2046 | ni.ino = inode->i_ino; | 2238 | ni.ino = inode->i_ino; |
2047 | set_node_addr(sbi, &ni, NEW_ADDR, false); | 2239 | set_node_addr(sbi, &ni, NEW_ADDR, false); |
2048 | f2fs_i_xnid_write(inode, new_xnid); | 2240 | set_page_dirty(xpage); |
2241 | f2fs_put_page(xpage, 1); | ||
2049 | 2242 | ||
2050 | /* 3: update xattr blkaddr */ | 2243 | return 0; |
2051 | refresh_sit_entry(sbi, NEW_ADDR, blkaddr); | ||
2052 | set_node_addr(sbi, &ni, blkaddr, false); | ||
2053 | } | 2244 | } |
2054 | 2245 | ||
2055 | int recover_inode_page(struct f2fs_sb_info *sbi, struct page *page) | 2246 | int recover_inode_page(struct f2fs_sb_info *sbi, struct page *page) |
@@ -2152,7 +2343,7 @@ static void remove_nats_in_journal(struct f2fs_sb_info *sbi) | |||
2152 | 2343 | ||
2153 | ne = __lookup_nat_cache(nm_i, nid); | 2344 | ne = __lookup_nat_cache(nm_i, nid); |
2154 | if (!ne) { | 2345 | if (!ne) { |
2155 | ne = grab_nat_entry(nm_i, nid); | 2346 | ne = grab_nat_entry(nm_i, nid, true); |
2156 | node_info_from_raw_nat(&ne->ni, &raw_ne); | 2347 | node_info_from_raw_nat(&ne->ni, &raw_ne); |
2157 | } | 2348 | } |
2158 | 2349 | ||
@@ -2192,8 +2383,39 @@ add_out: | |||
2192 | list_add_tail(&nes->set_list, head); | 2383 | list_add_tail(&nes->set_list, head); |
2193 | } | 2384 | } |
2194 | 2385 | ||
2386 | void __update_nat_bits(struct f2fs_sb_info *sbi, nid_t start_nid, | ||
2387 | struct page *page) | ||
2388 | { | ||
2389 | struct f2fs_nm_info *nm_i = NM_I(sbi); | ||
2390 | unsigned int nat_index = start_nid / NAT_ENTRY_PER_BLOCK; | ||
2391 | struct f2fs_nat_block *nat_blk = page_address(page); | ||
2392 | int valid = 0; | ||
2393 | int i; | ||
2394 | |||
2395 | if (!enabled_nat_bits(sbi, NULL)) | ||
2396 | return; | ||
2397 | |||
2398 | for (i = 0; i < NAT_ENTRY_PER_BLOCK; i++) { | ||
2399 | if (start_nid == 0 && i == 0) | ||
2400 | valid++; | ||
2401 | if (nat_blk->entries[i].block_addr) | ||
2402 | valid++; | ||
2403 | } | ||
2404 | if (valid == 0) { | ||
2405 | set_bit_le(nat_index, nm_i->empty_nat_bits); | ||
2406 | clear_bit_le(nat_index, nm_i->full_nat_bits); | ||
2407 | return; | ||
2408 | } | ||
2409 | |||
2410 | clear_bit_le(nat_index, nm_i->empty_nat_bits); | ||
2411 | if (valid == NAT_ENTRY_PER_BLOCK) | ||
2412 | set_bit_le(nat_index, nm_i->full_nat_bits); | ||
2413 | else | ||
2414 | clear_bit_le(nat_index, nm_i->full_nat_bits); | ||
2415 | } | ||
2416 | |||
2195 | static void __flush_nat_entry_set(struct f2fs_sb_info *sbi, | 2417 | static void __flush_nat_entry_set(struct f2fs_sb_info *sbi, |
2196 | struct nat_entry_set *set) | 2418 | struct nat_entry_set *set, struct cp_control *cpc) |
2197 | { | 2419 | { |
2198 | struct curseg_info *curseg = CURSEG_I(sbi, CURSEG_HOT_DATA); | 2420 | struct curseg_info *curseg = CURSEG_I(sbi, CURSEG_HOT_DATA); |
2199 | struct f2fs_journal *journal = curseg->journal; | 2421 | struct f2fs_journal *journal = curseg->journal; |
@@ -2208,7 +2430,8 @@ static void __flush_nat_entry_set(struct f2fs_sb_info *sbi, | |||
2208 | * #1, flush nat entries to journal in current hot data summary block. | 2430 | * #1, flush nat entries to journal in current hot data summary block. |
2209 | * #2, flush nat entries to nat page. | 2431 | * #2, flush nat entries to nat page. |
2210 | */ | 2432 | */ |
2211 | if (!__has_cursum_space(journal, set->entry_cnt, NAT_JOURNAL)) | 2433 | if (enabled_nat_bits(sbi, cpc) || |
2434 | !__has_cursum_space(journal, set->entry_cnt, NAT_JOURNAL)) | ||
2212 | to_journal = false; | 2435 | to_journal = false; |
2213 | 2436 | ||
2214 | if (to_journal) { | 2437 | if (to_journal) { |
@@ -2244,14 +2467,21 @@ static void __flush_nat_entry_set(struct f2fs_sb_info *sbi, | |||
2244 | add_free_nid(sbi, nid, false); | 2467 | add_free_nid(sbi, nid, false); |
2245 | spin_lock(&NM_I(sbi)->nid_list_lock); | 2468 | spin_lock(&NM_I(sbi)->nid_list_lock); |
2246 | NM_I(sbi)->available_nids++; | 2469 | NM_I(sbi)->available_nids++; |
2470 | update_free_nid_bitmap(sbi, nid, true); | ||
2471 | spin_unlock(&NM_I(sbi)->nid_list_lock); | ||
2472 | } else { | ||
2473 | spin_lock(&NM_I(sbi)->nid_list_lock); | ||
2474 | update_free_nid_bitmap(sbi, nid, false); | ||
2247 | spin_unlock(&NM_I(sbi)->nid_list_lock); | 2475 | spin_unlock(&NM_I(sbi)->nid_list_lock); |
2248 | } | 2476 | } |
2249 | } | 2477 | } |
2250 | 2478 | ||
2251 | if (to_journal) | 2479 | if (to_journal) { |
2252 | up_write(&curseg->journal_rwsem); | 2480 | up_write(&curseg->journal_rwsem); |
2253 | else | 2481 | } else { |
2482 | __update_nat_bits(sbi, start_nid, page); | ||
2254 | f2fs_put_page(page, 1); | 2483 | f2fs_put_page(page, 1); |
2484 | } | ||
2255 | 2485 | ||
2256 | f2fs_bug_on(sbi, set->entry_cnt); | 2486 | f2fs_bug_on(sbi, set->entry_cnt); |
2257 | 2487 | ||
@@ -2262,7 +2492,7 @@ static void __flush_nat_entry_set(struct f2fs_sb_info *sbi, | |||
2262 | /* | 2492 | /* |
2263 | * This function is called during the checkpointing process. | 2493 | * This function is called during the checkpointing process. |
2264 | */ | 2494 | */ |
2265 | void flush_nat_entries(struct f2fs_sb_info *sbi) | 2495 | void flush_nat_entries(struct f2fs_sb_info *sbi, struct cp_control *cpc) |
2266 | { | 2496 | { |
2267 | struct f2fs_nm_info *nm_i = NM_I(sbi); | 2497 | struct f2fs_nm_info *nm_i = NM_I(sbi); |
2268 | struct curseg_info *curseg = CURSEG_I(sbi, CURSEG_HOT_DATA); | 2498 | struct curseg_info *curseg = CURSEG_I(sbi, CURSEG_HOT_DATA); |
@@ -2283,7 +2513,8 @@ void flush_nat_entries(struct f2fs_sb_info *sbi) | |||
2283 | * entries, remove all entries from journal and merge them | 2513 | * entries, remove all entries from journal and merge them |
2284 | * into nat entry set. | 2514 | * into nat entry set. |
2285 | */ | 2515 | */ |
2286 | if (!__has_cursum_space(journal, nm_i->dirty_nat_cnt, NAT_JOURNAL)) | 2516 | if (enabled_nat_bits(sbi, cpc) || |
2517 | !__has_cursum_space(journal, nm_i->dirty_nat_cnt, NAT_JOURNAL)) | ||
2287 | remove_nats_in_journal(sbi); | 2518 | remove_nats_in_journal(sbi); |
2288 | 2519 | ||
2289 | while ((found = __gang_lookup_nat_set(nm_i, | 2520 | while ((found = __gang_lookup_nat_set(nm_i, |
@@ -2297,27 +2528,69 @@ void flush_nat_entries(struct f2fs_sb_info *sbi) | |||
2297 | 2528 | ||
2298 | /* flush dirty nats in nat entry set */ | 2529 | /* flush dirty nats in nat entry set */ |
2299 | list_for_each_entry_safe(set, tmp, &sets, set_list) | 2530 | list_for_each_entry_safe(set, tmp, &sets, set_list) |
2300 | __flush_nat_entry_set(sbi, set); | 2531 | __flush_nat_entry_set(sbi, set, cpc); |
2301 | 2532 | ||
2302 | up_write(&nm_i->nat_tree_lock); | 2533 | up_write(&nm_i->nat_tree_lock); |
2303 | 2534 | ||
2304 | f2fs_bug_on(sbi, nm_i->dirty_nat_cnt); | 2535 | f2fs_bug_on(sbi, nm_i->dirty_nat_cnt); |
2305 | } | 2536 | } |
2306 | 2537 | ||
2538 | static int __get_nat_bitmaps(struct f2fs_sb_info *sbi) | ||
2539 | { | ||
2540 | struct f2fs_checkpoint *ckpt = F2FS_CKPT(sbi); | ||
2541 | struct f2fs_nm_info *nm_i = NM_I(sbi); | ||
2542 | unsigned int nat_bits_bytes = nm_i->nat_blocks / BITS_PER_BYTE; | ||
2543 | unsigned int i; | ||
2544 | __u64 cp_ver = cur_cp_version(ckpt); | ||
2545 | block_t nat_bits_addr; | ||
2546 | |||
2547 | if (!enabled_nat_bits(sbi, NULL)) | ||
2548 | return 0; | ||
2549 | |||
2550 | nm_i->nat_bits_blocks = F2FS_BYTES_TO_BLK((nat_bits_bytes << 1) + 8 + | ||
2551 | F2FS_BLKSIZE - 1); | ||
2552 | nm_i->nat_bits = kzalloc(nm_i->nat_bits_blocks << F2FS_BLKSIZE_BITS, | ||
2553 | GFP_KERNEL); | ||
2554 | if (!nm_i->nat_bits) | ||
2555 | return -ENOMEM; | ||
2556 | |||
2557 | nat_bits_addr = __start_cp_addr(sbi) + sbi->blocks_per_seg - | ||
2558 | nm_i->nat_bits_blocks; | ||
2559 | for (i = 0; i < nm_i->nat_bits_blocks; i++) { | ||
2560 | struct page *page = get_meta_page(sbi, nat_bits_addr++); | ||
2561 | |||
2562 | memcpy(nm_i->nat_bits + (i << F2FS_BLKSIZE_BITS), | ||
2563 | page_address(page), F2FS_BLKSIZE); | ||
2564 | f2fs_put_page(page, 1); | ||
2565 | } | ||
2566 | |||
2567 | cp_ver |= (cur_cp_crc(ckpt) << 32); | ||
2568 | if (cpu_to_le64(cp_ver) != *(__le64 *)nm_i->nat_bits) { | ||
2569 | disable_nat_bits(sbi, true); | ||
2570 | return 0; | ||
2571 | } | ||
2572 | |||
2573 | nm_i->full_nat_bits = nm_i->nat_bits + 8; | ||
2574 | nm_i->empty_nat_bits = nm_i->full_nat_bits + nat_bits_bytes; | ||
2575 | |||
2576 | f2fs_msg(sbi->sb, KERN_NOTICE, "Found nat_bits in checkpoint"); | ||
2577 | return 0; | ||
2578 | } | ||
2579 | |||
2307 | static int init_node_manager(struct f2fs_sb_info *sbi) | 2580 | static int init_node_manager(struct f2fs_sb_info *sbi) |
2308 | { | 2581 | { |
2309 | struct f2fs_super_block *sb_raw = F2FS_RAW_SUPER(sbi); | 2582 | struct f2fs_super_block *sb_raw = F2FS_RAW_SUPER(sbi); |
2310 | struct f2fs_nm_info *nm_i = NM_I(sbi); | 2583 | struct f2fs_nm_info *nm_i = NM_I(sbi); |
2311 | unsigned char *version_bitmap; | 2584 | unsigned char *version_bitmap; |
2312 | unsigned int nat_segs, nat_blocks; | 2585 | unsigned int nat_segs; |
2586 | int err; | ||
2313 | 2587 | ||
2314 | nm_i->nat_blkaddr = le32_to_cpu(sb_raw->nat_blkaddr); | 2588 | nm_i->nat_blkaddr = le32_to_cpu(sb_raw->nat_blkaddr); |
2315 | 2589 | ||
2316 | /* segment_count_nat includes pair segment so divide to 2. */ | 2590 | /* segment_count_nat includes pair segment so divide to 2. */ |
2317 | nat_segs = le32_to_cpu(sb_raw->segment_count_nat) >> 1; | 2591 | nat_segs = le32_to_cpu(sb_raw->segment_count_nat) >> 1; |
2318 | nat_blocks = nat_segs << le32_to_cpu(sb_raw->log_blocks_per_seg); | 2592 | nm_i->nat_blocks = nat_segs << le32_to_cpu(sb_raw->log_blocks_per_seg); |
2319 | 2593 | nm_i->max_nid = NAT_ENTRY_PER_BLOCK * nm_i->nat_blocks; | |
2320 | nm_i->max_nid = NAT_ENTRY_PER_BLOCK * nat_blocks; | ||
2321 | 2594 | ||
2322 | /* not used nids: 0, node, meta, (and root counted as valid node) */ | 2595 | /* not used nids: 0, node, meta, (and root counted as valid node) */ |
2323 | nm_i->available_nids = nm_i->max_nid - sbi->total_valid_node_count - | 2596 | nm_i->available_nids = nm_i->max_nid - sbi->total_valid_node_count - |
@@ -2350,6 +2623,34 @@ static int init_node_manager(struct f2fs_sb_info *sbi) | |||
2350 | GFP_KERNEL); | 2623 | GFP_KERNEL); |
2351 | if (!nm_i->nat_bitmap) | 2624 | if (!nm_i->nat_bitmap) |
2352 | return -ENOMEM; | 2625 | return -ENOMEM; |
2626 | |||
2627 | err = __get_nat_bitmaps(sbi); | ||
2628 | if (err) | ||
2629 | return err; | ||
2630 | |||
2631 | #ifdef CONFIG_F2FS_CHECK_FS | ||
2632 | nm_i->nat_bitmap_mir = kmemdup(version_bitmap, nm_i->bitmap_size, | ||
2633 | GFP_KERNEL); | ||
2634 | if (!nm_i->nat_bitmap_mir) | ||
2635 | return -ENOMEM; | ||
2636 | #endif | ||
2637 | |||
2638 | return 0; | ||
2639 | } | ||
2640 | |||
2641 | int init_free_nid_cache(struct f2fs_sb_info *sbi) | ||
2642 | { | ||
2643 | struct f2fs_nm_info *nm_i = NM_I(sbi); | ||
2644 | |||
2645 | nm_i->free_nid_bitmap = f2fs_kvzalloc(nm_i->nat_blocks * | ||
2646 | NAT_ENTRY_BITMAP_SIZE, GFP_KERNEL); | ||
2647 | if (!nm_i->free_nid_bitmap) | ||
2648 | return -ENOMEM; | ||
2649 | |||
2650 | nm_i->nat_block_bitmap = f2fs_kvzalloc(nm_i->nat_blocks / 8, | ||
2651 | GFP_KERNEL); | ||
2652 | if (!nm_i->nat_block_bitmap) | ||
2653 | return -ENOMEM; | ||
2353 | return 0; | 2654 | return 0; |
2354 | } | 2655 | } |
2355 | 2656 | ||
@@ -2365,7 +2666,11 @@ int build_node_manager(struct f2fs_sb_info *sbi) | |||
2365 | if (err) | 2666 | if (err) |
2366 | return err; | 2667 | return err; |
2367 | 2668 | ||
2368 | build_free_nids(sbi, true); | 2669 | err = init_free_nid_cache(sbi); |
2670 | if (err) | ||
2671 | return err; | ||
2672 | |||
2673 | build_free_nids(sbi, true, true); | ||
2369 | return 0; | 2674 | return 0; |
2370 | } | 2675 | } |
2371 | 2676 | ||
@@ -2423,7 +2728,14 @@ void destroy_node_manager(struct f2fs_sb_info *sbi) | |||
2423 | } | 2728 | } |
2424 | up_write(&nm_i->nat_tree_lock); | 2729 | up_write(&nm_i->nat_tree_lock); |
2425 | 2730 | ||
2731 | kvfree(nm_i->nat_block_bitmap); | ||
2732 | kvfree(nm_i->free_nid_bitmap); | ||
2733 | |||
2426 | kfree(nm_i->nat_bitmap); | 2734 | kfree(nm_i->nat_bitmap); |
2735 | kfree(nm_i->nat_bits); | ||
2736 | #ifdef CONFIG_F2FS_CHECK_FS | ||
2737 | kfree(nm_i->nat_bitmap_mir); | ||
2738 | #endif | ||
2427 | sbi->nm_info = NULL; | 2739 | sbi->nm_info = NULL; |
2428 | kfree(nm_i); | 2740 | kfree(nm_i); |
2429 | } | 2741 | } |
diff --git a/fs/f2fs/node.h b/fs/f2fs/node.h index e7997e240366..2f9603fa85a5 100644 --- a/fs/f2fs/node.h +++ b/fs/f2fs/node.h | |||
@@ -174,7 +174,7 @@ static inline void next_free_nid(struct f2fs_sb_info *sbi, nid_t *nid) | |||
174 | spin_unlock(&nm_i->nid_list_lock); | 174 | spin_unlock(&nm_i->nid_list_lock); |
175 | return; | 175 | return; |
176 | } | 176 | } |
177 | fnid = list_entry(nm_i->nid_list[FREE_NID_LIST].next, | 177 | fnid = list_first_entry(&nm_i->nid_list[FREE_NID_LIST], |
178 | struct free_nid, list); | 178 | struct free_nid, list); |
179 | *nid = fnid->nid; | 179 | *nid = fnid->nid; |
180 | spin_unlock(&nm_i->nid_list_lock); | 180 | spin_unlock(&nm_i->nid_list_lock); |
@@ -186,6 +186,12 @@ static inline void next_free_nid(struct f2fs_sb_info *sbi, nid_t *nid) | |||
186 | static inline void get_nat_bitmap(struct f2fs_sb_info *sbi, void *addr) | 186 | static inline void get_nat_bitmap(struct f2fs_sb_info *sbi, void *addr) |
187 | { | 187 | { |
188 | struct f2fs_nm_info *nm_i = NM_I(sbi); | 188 | struct f2fs_nm_info *nm_i = NM_I(sbi); |
189 | |||
190 | #ifdef CONFIG_F2FS_CHECK_FS | ||
191 | if (memcmp(nm_i->nat_bitmap, nm_i->nat_bitmap_mir, | ||
192 | nm_i->bitmap_size)) | ||
193 | f2fs_bug_on(sbi, 1); | ||
194 | #endif | ||
189 | memcpy(addr, nm_i->nat_bitmap, nm_i->bitmap_size); | 195 | memcpy(addr, nm_i->nat_bitmap, nm_i->bitmap_size); |
190 | } | 196 | } |
191 | 197 | ||
@@ -228,6 +234,9 @@ static inline void set_to_next_nat(struct f2fs_nm_info *nm_i, nid_t start_nid) | |||
228 | unsigned int block_off = NAT_BLOCK_OFFSET(start_nid); | 234 | unsigned int block_off = NAT_BLOCK_OFFSET(start_nid); |
229 | 235 | ||
230 | f2fs_change_bit(block_off, nm_i->nat_bitmap); | 236 | f2fs_change_bit(block_off, nm_i->nat_bitmap); |
237 | #ifdef CONFIG_F2FS_CHECK_FS | ||
238 | f2fs_change_bit(block_off, nm_i->nat_bitmap_mir); | ||
239 | #endif | ||
231 | } | 240 | } |
232 | 241 | ||
233 | static inline nid_t ino_of_node(struct page *node_page) | 242 | static inline nid_t ino_of_node(struct page *node_page) |
@@ -291,14 +300,11 @@ static inline void fill_node_footer_blkaddr(struct page *page, block_t blkaddr) | |||
291 | { | 300 | { |
292 | struct f2fs_checkpoint *ckpt = F2FS_CKPT(F2FS_P_SB(page)); | 301 | struct f2fs_checkpoint *ckpt = F2FS_CKPT(F2FS_P_SB(page)); |
293 | struct f2fs_node *rn = F2FS_NODE(page); | 302 | struct f2fs_node *rn = F2FS_NODE(page); |
294 | size_t crc_offset = le32_to_cpu(ckpt->checksum_offset); | 303 | __u64 cp_ver = cur_cp_version(ckpt); |
295 | __u64 cp_ver = le64_to_cpu(ckpt->checkpoint_ver); | 304 | |
305 | if (__is_set_ckpt_flags(ckpt, CP_CRC_RECOVERY_FLAG)) | ||
306 | cp_ver |= (cur_cp_crc(ckpt) << 32); | ||
296 | 307 | ||
297 | if (__is_set_ckpt_flags(ckpt, CP_CRC_RECOVERY_FLAG)) { | ||
298 | __u64 crc = le32_to_cpu(*((__le32 *) | ||
299 | ((unsigned char *)ckpt + crc_offset))); | ||
300 | cp_ver |= (crc << 32); | ||
301 | } | ||
302 | rn->footer.cp_ver = cpu_to_le64(cp_ver); | 308 | rn->footer.cp_ver = cpu_to_le64(cp_ver); |
303 | rn->footer.next_blkaddr = cpu_to_le32(blkaddr); | 309 | rn->footer.next_blkaddr = cpu_to_le32(blkaddr); |
304 | } | 310 | } |
@@ -306,14 +312,11 @@ static inline void fill_node_footer_blkaddr(struct page *page, block_t blkaddr) | |||
306 | static inline bool is_recoverable_dnode(struct page *page) | 312 | static inline bool is_recoverable_dnode(struct page *page) |
307 | { | 313 | { |
308 | struct f2fs_checkpoint *ckpt = F2FS_CKPT(F2FS_P_SB(page)); | 314 | struct f2fs_checkpoint *ckpt = F2FS_CKPT(F2FS_P_SB(page)); |
309 | size_t crc_offset = le32_to_cpu(ckpt->checksum_offset); | ||
310 | __u64 cp_ver = cur_cp_version(ckpt); | 315 | __u64 cp_ver = cur_cp_version(ckpt); |
311 | 316 | ||
312 | if (__is_set_ckpt_flags(ckpt, CP_CRC_RECOVERY_FLAG)) { | 317 | if (__is_set_ckpt_flags(ckpt, CP_CRC_RECOVERY_FLAG)) |
313 | __u64 crc = le32_to_cpu(*((__le32 *) | 318 | cp_ver |= (cur_cp_crc(ckpt) << 32); |
314 | ((unsigned char *)ckpt + crc_offset))); | 319 | |
315 | cp_ver |= (crc << 32); | ||
316 | } | ||
317 | return cp_ver == cpver_of_node(page); | 320 | return cp_ver == cpver_of_node(page); |
318 | } | 321 | } |
319 | 322 | ||
@@ -343,7 +346,7 @@ static inline bool IS_DNODE(struct page *node_page) | |||
343 | unsigned int ofs = ofs_of_node(node_page); | 346 | unsigned int ofs = ofs_of_node(node_page); |
344 | 347 | ||
345 | if (f2fs_has_xattr_block(ofs)) | 348 | if (f2fs_has_xattr_block(ofs)) |
346 | return false; | 349 | return true; |
347 | 350 | ||
348 | if (ofs == 3 || ofs == 4 + NIDS_PER_BLOCK || | 351 | if (ofs == 3 || ofs == 4 + NIDS_PER_BLOCK || |
349 | ofs == 5 + 2 * NIDS_PER_BLOCK) | 352 | ofs == 5 + 2 * NIDS_PER_BLOCK) |
diff --git a/fs/f2fs/recovery.c b/fs/f2fs/recovery.c index 981a9584b62f..d025aa83fb5b 100644 --- a/fs/f2fs/recovery.c +++ b/fs/f2fs/recovery.c | |||
@@ -378,11 +378,9 @@ static int do_recover_data(struct f2fs_sb_info *sbi, struct inode *inode, | |||
378 | if (IS_INODE(page)) { | 378 | if (IS_INODE(page)) { |
379 | recover_inline_xattr(inode, page); | 379 | recover_inline_xattr(inode, page); |
380 | } else if (f2fs_has_xattr_block(ofs_of_node(page))) { | 380 | } else if (f2fs_has_xattr_block(ofs_of_node(page))) { |
381 | /* | 381 | err = recover_xattr_data(inode, page, blkaddr); |
382 | * Deprecated; xattr blocks should be found from cold log. | 382 | if (!err) |
383 | * But, we should remain this for backward compatibility. | 383 | recovered++; |
384 | */ | ||
385 | recover_xattr_data(inode, page, blkaddr); | ||
386 | goto out; | 384 | goto out; |
387 | } | 385 | } |
388 | 386 | ||
@@ -428,8 +426,9 @@ retry_dn: | |||
428 | } | 426 | } |
429 | 427 | ||
430 | if (!file_keep_isize(inode) && | 428 | if (!file_keep_isize(inode) && |
431 | (i_size_read(inode) <= (start << PAGE_SHIFT))) | 429 | (i_size_read(inode) <= ((loff_t)start << PAGE_SHIFT))) |
432 | f2fs_i_size_write(inode, (start + 1) << PAGE_SHIFT); | 430 | f2fs_i_size_write(inode, |
431 | (loff_t)(start + 1) << PAGE_SHIFT); | ||
433 | 432 | ||
434 | /* | 433 | /* |
435 | * dest is reserved block, invalidate src block | 434 | * dest is reserved block, invalidate src block |
@@ -552,10 +551,8 @@ next: | |||
552 | 551 | ||
553 | int recover_fsync_data(struct f2fs_sb_info *sbi, bool check_only) | 552 | int recover_fsync_data(struct f2fs_sb_info *sbi, bool check_only) |
554 | { | 553 | { |
555 | struct curseg_info *curseg = CURSEG_I(sbi, CURSEG_WARM_NODE); | ||
556 | struct list_head inode_list; | 554 | struct list_head inode_list; |
557 | struct list_head dir_list; | 555 | struct list_head dir_list; |
558 | block_t blkaddr; | ||
559 | int err; | 556 | int err; |
560 | int ret = 0; | 557 | int ret = 0; |
561 | bool need_writecp = false; | 558 | bool need_writecp = false; |
@@ -571,8 +568,6 @@ int recover_fsync_data(struct f2fs_sb_info *sbi, bool check_only) | |||
571 | /* prevent checkpoint */ | 568 | /* prevent checkpoint */ |
572 | mutex_lock(&sbi->cp_mutex); | 569 | mutex_lock(&sbi->cp_mutex); |
573 | 570 | ||
574 | blkaddr = NEXT_FREE_BLKADDR(sbi, curseg); | ||
575 | |||
576 | /* step #1: find fsynced inode numbers */ | 571 | /* step #1: find fsynced inode numbers */ |
577 | err = find_fsync_dnodes(sbi, &inode_list); | 572 | err = find_fsync_dnodes(sbi, &inode_list); |
578 | if (err || list_empty(&inode_list)) | 573 | if (err || list_empty(&inode_list)) |
diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c index 0d8802453758..4bd7a8b19332 100644 --- a/fs/f2fs/segment.c +++ b/fs/f2fs/segment.c | |||
@@ -26,7 +26,7 @@ | |||
26 | #define __reverse_ffz(x) __reverse_ffs(~(x)) | 26 | #define __reverse_ffz(x) __reverse_ffs(~(x)) |
27 | 27 | ||
28 | static struct kmem_cache *discard_entry_slab; | 28 | static struct kmem_cache *discard_entry_slab; |
29 | static struct kmem_cache *bio_entry_slab; | 29 | static struct kmem_cache *discard_cmd_slab; |
30 | static struct kmem_cache *sit_entry_set_slab; | 30 | static struct kmem_cache *sit_entry_set_slab; |
31 | static struct kmem_cache *inmem_entry_slab; | 31 | static struct kmem_cache *inmem_entry_slab; |
32 | 32 | ||
@@ -242,11 +242,12 @@ void drop_inmem_pages(struct inode *inode) | |||
242 | { | 242 | { |
243 | struct f2fs_inode_info *fi = F2FS_I(inode); | 243 | struct f2fs_inode_info *fi = F2FS_I(inode); |
244 | 244 | ||
245 | clear_inode_flag(inode, FI_ATOMIC_FILE); | ||
246 | |||
247 | mutex_lock(&fi->inmem_lock); | 245 | mutex_lock(&fi->inmem_lock); |
248 | __revoke_inmem_pages(inode, &fi->inmem_pages, true, false); | 246 | __revoke_inmem_pages(inode, &fi->inmem_pages, true, false); |
249 | mutex_unlock(&fi->inmem_lock); | 247 | mutex_unlock(&fi->inmem_lock); |
248 | |||
249 | clear_inode_flag(inode, FI_ATOMIC_FILE); | ||
250 | stat_dec_atomic_write(inode); | ||
250 | } | 251 | } |
251 | 252 | ||
252 | static int __commit_inmem_pages(struct inode *inode, | 253 | static int __commit_inmem_pages(struct inode *inode, |
@@ -262,7 +263,7 @@ static int __commit_inmem_pages(struct inode *inode, | |||
262 | .op_flags = REQ_SYNC | REQ_PRIO, | 263 | .op_flags = REQ_SYNC | REQ_PRIO, |
263 | .encrypted_page = NULL, | 264 | .encrypted_page = NULL, |
264 | }; | 265 | }; |
265 | bool submit_bio = false; | 266 | pgoff_t last_idx = ULONG_MAX; |
266 | int err = 0; | 267 | int err = 0; |
267 | 268 | ||
268 | list_for_each_entry_safe(cur, tmp, &fi->inmem_pages, list) { | 269 | list_for_each_entry_safe(cur, tmp, &fi->inmem_pages, list) { |
@@ -288,15 +289,15 @@ static int __commit_inmem_pages(struct inode *inode, | |||
288 | 289 | ||
289 | /* record old blkaddr for revoking */ | 290 | /* record old blkaddr for revoking */ |
290 | cur->old_addr = fio.old_blkaddr; | 291 | cur->old_addr = fio.old_blkaddr; |
291 | 292 | last_idx = page->index; | |
292 | submit_bio = true; | ||
293 | } | 293 | } |
294 | unlock_page(page); | 294 | unlock_page(page); |
295 | list_move_tail(&cur->list, revoke_list); | 295 | list_move_tail(&cur->list, revoke_list); |
296 | } | 296 | } |
297 | 297 | ||
298 | if (submit_bio) | 298 | if (last_idx != ULONG_MAX) |
299 | f2fs_submit_merged_bio_cond(sbi, inode, NULL, 0, DATA, WRITE); | 299 | f2fs_submit_merged_bio_cond(sbi, inode, 0, last_idx, |
300 | DATA, WRITE); | ||
300 | 301 | ||
301 | if (!err) | 302 | if (!err) |
302 | __revoke_inmem_pages(inode, revoke_list, false, false); | 303 | __revoke_inmem_pages(inode, revoke_list, false, false); |
@@ -315,6 +316,8 @@ int commit_inmem_pages(struct inode *inode) | |||
315 | f2fs_balance_fs(sbi, true); | 316 | f2fs_balance_fs(sbi, true); |
316 | f2fs_lock_op(sbi); | 317 | f2fs_lock_op(sbi); |
317 | 318 | ||
319 | set_inode_flag(inode, FI_ATOMIC_COMMIT); | ||
320 | |||
318 | mutex_lock(&fi->inmem_lock); | 321 | mutex_lock(&fi->inmem_lock); |
319 | err = __commit_inmem_pages(inode, &revoke_list); | 322 | err = __commit_inmem_pages(inode, &revoke_list); |
320 | if (err) { | 323 | if (err) { |
@@ -336,6 +339,8 @@ int commit_inmem_pages(struct inode *inode) | |||
336 | } | 339 | } |
337 | mutex_unlock(&fi->inmem_lock); | 340 | mutex_unlock(&fi->inmem_lock); |
338 | 341 | ||
342 | clear_inode_flag(inode, FI_ATOMIC_COMMIT); | ||
343 | |||
339 | f2fs_unlock_op(sbi); | 344 | f2fs_unlock_op(sbi); |
340 | return err; | 345 | return err; |
341 | } | 346 | } |
@@ -347,8 +352,10 @@ int commit_inmem_pages(struct inode *inode) | |||
347 | void f2fs_balance_fs(struct f2fs_sb_info *sbi, bool need) | 352 | void f2fs_balance_fs(struct f2fs_sb_info *sbi, bool need) |
348 | { | 353 | { |
349 | #ifdef CONFIG_F2FS_FAULT_INJECTION | 354 | #ifdef CONFIG_F2FS_FAULT_INJECTION |
350 | if (time_to_inject(sbi, FAULT_CHECKPOINT)) | 355 | if (time_to_inject(sbi, FAULT_CHECKPOINT)) { |
356 | f2fs_show_injection_info(FAULT_CHECKPOINT); | ||
351 | f2fs_stop_checkpoint(sbi, false); | 357 | f2fs_stop_checkpoint(sbi, false); |
358 | } | ||
352 | #endif | 359 | #endif |
353 | 360 | ||
354 | if (!need) | 361 | if (!need) |
@@ -381,7 +388,7 @@ void f2fs_balance_fs_bg(struct f2fs_sb_info *sbi) | |||
381 | if (!available_free_memory(sbi, FREE_NIDS)) | 388 | if (!available_free_memory(sbi, FREE_NIDS)) |
382 | try_to_free_nids(sbi, MAX_FREE_NIDS); | 389 | try_to_free_nids(sbi, MAX_FREE_NIDS); |
383 | else | 390 | else |
384 | build_free_nids(sbi, false); | 391 | build_free_nids(sbi, false, false); |
385 | 392 | ||
386 | if (!is_idle(sbi)) | 393 | if (!is_idle(sbi)) |
387 | return; | 394 | return; |
@@ -423,6 +430,9 @@ static int submit_flush_wait(struct f2fs_sb_info *sbi) | |||
423 | 430 | ||
424 | if (sbi->s_ndevs && !ret) { | 431 | if (sbi->s_ndevs && !ret) { |
425 | for (i = 1; i < sbi->s_ndevs; i++) { | 432 | for (i = 1; i < sbi->s_ndevs; i++) { |
433 | trace_f2fs_issue_flush(FDEV(i).bdev, | ||
434 | test_opt(sbi, NOBARRIER), | ||
435 | test_opt(sbi, FLUSH_MERGE)); | ||
426 | ret = __submit_flush_wait(FDEV(i).bdev); | 436 | ret = __submit_flush_wait(FDEV(i).bdev); |
427 | if (ret) | 437 | if (ret) |
428 | break; | 438 | break; |
@@ -434,7 +444,7 @@ static int submit_flush_wait(struct f2fs_sb_info *sbi) | |||
434 | static int issue_flush_thread(void *data) | 444 | static int issue_flush_thread(void *data) |
435 | { | 445 | { |
436 | struct f2fs_sb_info *sbi = data; | 446 | struct f2fs_sb_info *sbi = data; |
437 | struct flush_cmd_control *fcc = SM_I(sbi)->cmd_control_info; | 447 | struct flush_cmd_control *fcc = SM_I(sbi)->fcc_info; |
438 | wait_queue_head_t *q = &fcc->flush_wait_queue; | 448 | wait_queue_head_t *q = &fcc->flush_wait_queue; |
439 | repeat: | 449 | repeat: |
440 | if (kthread_should_stop()) | 450 | if (kthread_should_stop()) |
@@ -463,16 +473,16 @@ repeat: | |||
463 | 473 | ||
464 | int f2fs_issue_flush(struct f2fs_sb_info *sbi) | 474 | int f2fs_issue_flush(struct f2fs_sb_info *sbi) |
465 | { | 475 | { |
466 | struct flush_cmd_control *fcc = SM_I(sbi)->cmd_control_info; | 476 | struct flush_cmd_control *fcc = SM_I(sbi)->fcc_info; |
467 | struct flush_cmd cmd; | 477 | struct flush_cmd cmd; |
468 | 478 | ||
469 | trace_f2fs_issue_flush(sbi->sb, test_opt(sbi, NOBARRIER), | ||
470 | test_opt(sbi, FLUSH_MERGE)); | ||
471 | |||
472 | if (test_opt(sbi, NOBARRIER)) | 479 | if (test_opt(sbi, NOBARRIER)) |
473 | return 0; | 480 | return 0; |
474 | 481 | ||
475 | if (!test_opt(sbi, FLUSH_MERGE) || !atomic_read(&fcc->submit_flush)) { | 482 | if (!test_opt(sbi, FLUSH_MERGE)) |
483 | return submit_flush_wait(sbi); | ||
484 | |||
485 | if (!atomic_read(&fcc->submit_flush)) { | ||
476 | int ret; | 486 | int ret; |
477 | 487 | ||
478 | atomic_inc(&fcc->submit_flush); | 488 | atomic_inc(&fcc->submit_flush); |
@@ -506,8 +516,8 @@ int create_flush_cmd_control(struct f2fs_sb_info *sbi) | |||
506 | struct flush_cmd_control *fcc; | 516 | struct flush_cmd_control *fcc; |
507 | int err = 0; | 517 | int err = 0; |
508 | 518 | ||
509 | if (SM_I(sbi)->cmd_control_info) { | 519 | if (SM_I(sbi)->fcc_info) { |
510 | fcc = SM_I(sbi)->cmd_control_info; | 520 | fcc = SM_I(sbi)->fcc_info; |
511 | goto init_thread; | 521 | goto init_thread; |
512 | } | 522 | } |
513 | 523 | ||
@@ -517,14 +527,14 @@ int create_flush_cmd_control(struct f2fs_sb_info *sbi) | |||
517 | atomic_set(&fcc->submit_flush, 0); | 527 | atomic_set(&fcc->submit_flush, 0); |
518 | init_waitqueue_head(&fcc->flush_wait_queue); | 528 | init_waitqueue_head(&fcc->flush_wait_queue); |
519 | init_llist_head(&fcc->issue_list); | 529 | init_llist_head(&fcc->issue_list); |
520 | SM_I(sbi)->cmd_control_info = fcc; | 530 | SM_I(sbi)->fcc_info = fcc; |
521 | init_thread: | 531 | init_thread: |
522 | fcc->f2fs_issue_flush = kthread_run(issue_flush_thread, sbi, | 532 | fcc->f2fs_issue_flush = kthread_run(issue_flush_thread, sbi, |
523 | "f2fs_flush-%u:%u", MAJOR(dev), MINOR(dev)); | 533 | "f2fs_flush-%u:%u", MAJOR(dev), MINOR(dev)); |
524 | if (IS_ERR(fcc->f2fs_issue_flush)) { | 534 | if (IS_ERR(fcc->f2fs_issue_flush)) { |
525 | err = PTR_ERR(fcc->f2fs_issue_flush); | 535 | err = PTR_ERR(fcc->f2fs_issue_flush); |
526 | kfree(fcc); | 536 | kfree(fcc); |
527 | SM_I(sbi)->cmd_control_info = NULL; | 537 | SM_I(sbi)->fcc_info = NULL; |
528 | return err; | 538 | return err; |
529 | } | 539 | } |
530 | 540 | ||
@@ -533,7 +543,7 @@ init_thread: | |||
533 | 543 | ||
534 | void destroy_flush_cmd_control(struct f2fs_sb_info *sbi, bool free) | 544 | void destroy_flush_cmd_control(struct f2fs_sb_info *sbi, bool free) |
535 | { | 545 | { |
536 | struct flush_cmd_control *fcc = SM_I(sbi)->cmd_control_info; | 546 | struct flush_cmd_control *fcc = SM_I(sbi)->fcc_info; |
537 | 547 | ||
538 | if (fcc && fcc->f2fs_issue_flush) { | 548 | if (fcc && fcc->f2fs_issue_flush) { |
539 | struct task_struct *flush_thread = fcc->f2fs_issue_flush; | 549 | struct task_struct *flush_thread = fcc->f2fs_issue_flush; |
@@ -543,7 +553,7 @@ void destroy_flush_cmd_control(struct f2fs_sb_info *sbi, bool free) | |||
543 | } | 553 | } |
544 | if (free) { | 554 | if (free) { |
545 | kfree(fcc); | 555 | kfree(fcc); |
546 | SM_I(sbi)->cmd_control_info = NULL; | 556 | SM_I(sbi)->fcc_info = NULL; |
547 | } | 557 | } |
548 | } | 558 | } |
549 | 559 | ||
@@ -623,60 +633,144 @@ static void locate_dirty_segment(struct f2fs_sb_info *sbi, unsigned int segno) | |||
623 | mutex_unlock(&dirty_i->seglist_lock); | 633 | mutex_unlock(&dirty_i->seglist_lock); |
624 | } | 634 | } |
625 | 635 | ||
626 | static struct bio_entry *__add_bio_entry(struct f2fs_sb_info *sbi, | 636 | static void __add_discard_cmd(struct f2fs_sb_info *sbi, |
627 | struct bio *bio) | 637 | struct bio *bio, block_t lstart, block_t len) |
628 | { | 638 | { |
629 | struct list_head *wait_list = &(SM_I(sbi)->wait_list); | 639 | struct discard_cmd_control *dcc = SM_I(sbi)->dcc_info; |
630 | struct bio_entry *be = f2fs_kmem_cache_alloc(bio_entry_slab, GFP_NOFS); | 640 | struct list_head *cmd_list = &(dcc->discard_cmd_list); |
641 | struct discard_cmd *dc; | ||
631 | 642 | ||
632 | INIT_LIST_HEAD(&be->list); | 643 | dc = f2fs_kmem_cache_alloc(discard_cmd_slab, GFP_NOFS); |
633 | be->bio = bio; | 644 | INIT_LIST_HEAD(&dc->list); |
634 | init_completion(&be->event); | 645 | dc->bio = bio; |
635 | list_add_tail(&be->list, wait_list); | 646 | bio->bi_private = dc; |
647 | dc->lstart = lstart; | ||
648 | dc->len = len; | ||
649 | dc->state = D_PREP; | ||
650 | init_completion(&dc->wait); | ||
636 | 651 | ||
637 | return be; | 652 | mutex_lock(&dcc->cmd_lock); |
653 | list_add_tail(&dc->list, cmd_list); | ||
654 | mutex_unlock(&dcc->cmd_lock); | ||
638 | } | 655 | } |
639 | 656 | ||
640 | void f2fs_wait_all_discard_bio(struct f2fs_sb_info *sbi) | 657 | static void __remove_discard_cmd(struct f2fs_sb_info *sbi, struct discard_cmd *dc) |
641 | { | 658 | { |
642 | struct list_head *wait_list = &(SM_I(sbi)->wait_list); | 659 | int err = dc->bio->bi_error; |
643 | struct bio_entry *be, *tmp; | ||
644 | 660 | ||
645 | list_for_each_entry_safe(be, tmp, wait_list, list) { | 661 | if (dc->state == D_DONE) |
646 | struct bio *bio = be->bio; | 662 | atomic_dec(&(SM_I(sbi)->dcc_info->submit_discard)); |
647 | int err; | ||
648 | 663 | ||
649 | wait_for_completion_io(&be->event); | 664 | if (err == -EOPNOTSUPP) |
650 | err = be->error; | 665 | err = 0; |
651 | if (err == -EOPNOTSUPP) | ||
652 | err = 0; | ||
653 | 666 | ||
654 | if (err) | 667 | if (err) |
655 | f2fs_msg(sbi->sb, KERN_INFO, | 668 | f2fs_msg(sbi->sb, KERN_INFO, |
656 | "Issue discard failed, ret: %d", err); | 669 | "Issue discard failed, ret: %d", err); |
670 | bio_put(dc->bio); | ||
671 | list_del(&dc->list); | ||
672 | kmem_cache_free(discard_cmd_slab, dc); | ||
673 | } | ||
674 | |||
675 | /* This should be covered by global mutex, &sit_i->sentry_lock */ | ||
676 | void f2fs_wait_discard_bio(struct f2fs_sb_info *sbi, block_t blkaddr) | ||
677 | { | ||
678 | struct discard_cmd_control *dcc = SM_I(sbi)->dcc_info; | ||
679 | struct list_head *wait_list = &(dcc->discard_cmd_list); | ||
680 | struct discard_cmd *dc, *tmp; | ||
681 | struct blk_plug plug; | ||
682 | |||
683 | mutex_lock(&dcc->cmd_lock); | ||
657 | 684 | ||
658 | bio_put(bio); | 685 | blk_start_plug(&plug); |
659 | list_del(&be->list); | 686 | |
660 | kmem_cache_free(bio_entry_slab, be); | 687 | list_for_each_entry_safe(dc, tmp, wait_list, list) { |
688 | |||
689 | if (blkaddr == NULL_ADDR) { | ||
690 | if (dc->state == D_PREP) { | ||
691 | dc->state = D_SUBMIT; | ||
692 | submit_bio(dc->bio); | ||
693 | atomic_inc(&dcc->submit_discard); | ||
694 | } | ||
695 | continue; | ||
696 | } | ||
697 | |||
698 | if (dc->lstart <= blkaddr && blkaddr < dc->lstart + dc->len) { | ||
699 | if (dc->state == D_SUBMIT) | ||
700 | wait_for_completion_io(&dc->wait); | ||
701 | else | ||
702 | __remove_discard_cmd(sbi, dc); | ||
703 | } | ||
704 | } | ||
705 | blk_finish_plug(&plug); | ||
706 | |||
707 | /* this comes from f2fs_put_super */ | ||
708 | if (blkaddr == NULL_ADDR) { | ||
709 | list_for_each_entry_safe(dc, tmp, wait_list, list) { | ||
710 | wait_for_completion_io(&dc->wait); | ||
711 | __remove_discard_cmd(sbi, dc); | ||
712 | } | ||
661 | } | 713 | } |
714 | mutex_unlock(&dcc->cmd_lock); | ||
715 | } | ||
716 | |||
717 | static void f2fs_submit_discard_endio(struct bio *bio) | ||
718 | { | ||
719 | struct discard_cmd *dc = (struct discard_cmd *)bio->bi_private; | ||
720 | |||
721 | complete(&dc->wait); | ||
722 | dc->state = D_DONE; | ||
662 | } | 723 | } |
663 | 724 | ||
664 | static void f2fs_submit_bio_wait_endio(struct bio *bio) | 725 | static int issue_discard_thread(void *data) |
665 | { | 726 | { |
666 | struct bio_entry *be = (struct bio_entry *)bio->bi_private; | 727 | struct f2fs_sb_info *sbi = data; |
728 | struct discard_cmd_control *dcc = SM_I(sbi)->dcc_info; | ||
729 | wait_queue_head_t *q = &dcc->discard_wait_queue; | ||
730 | struct list_head *cmd_list = &dcc->discard_cmd_list; | ||
731 | struct discard_cmd *dc, *tmp; | ||
732 | struct blk_plug plug; | ||
733 | int iter = 0; | ||
734 | repeat: | ||
735 | if (kthread_should_stop()) | ||
736 | return 0; | ||
737 | |||
738 | blk_start_plug(&plug); | ||
739 | |||
740 | mutex_lock(&dcc->cmd_lock); | ||
741 | list_for_each_entry_safe(dc, tmp, cmd_list, list) { | ||
742 | if (dc->state == D_PREP) { | ||
743 | dc->state = D_SUBMIT; | ||
744 | submit_bio(dc->bio); | ||
745 | atomic_inc(&dcc->submit_discard); | ||
746 | if (iter++ > DISCARD_ISSUE_RATE) | ||
747 | break; | ||
748 | } else if (dc->state == D_DONE) { | ||
749 | __remove_discard_cmd(sbi, dc); | ||
750 | } | ||
751 | } | ||
752 | mutex_unlock(&dcc->cmd_lock); | ||
753 | |||
754 | blk_finish_plug(&plug); | ||
755 | |||
756 | iter = 0; | ||
757 | congestion_wait(BLK_RW_SYNC, HZ/50); | ||
667 | 758 | ||
668 | be->error = bio->bi_error; | 759 | wait_event_interruptible(*q, |
669 | complete(&be->event); | 760 | kthread_should_stop() || !list_empty(&dcc->discard_cmd_list)); |
761 | goto repeat; | ||
670 | } | 762 | } |
671 | 763 | ||
764 | |||
672 | /* this function is copied from blkdev_issue_discard from block/blk-lib.c */ | 765 | /* this function is copied from blkdev_issue_discard from block/blk-lib.c */ |
673 | static int __f2fs_issue_discard_async(struct f2fs_sb_info *sbi, | 766 | static int __f2fs_issue_discard_async(struct f2fs_sb_info *sbi, |
674 | struct block_device *bdev, block_t blkstart, block_t blklen) | 767 | struct block_device *bdev, block_t blkstart, block_t blklen) |
675 | { | 768 | { |
676 | struct bio *bio = NULL; | 769 | struct bio *bio = NULL; |
770 | block_t lblkstart = blkstart; | ||
677 | int err; | 771 | int err; |
678 | 772 | ||
679 | trace_f2fs_issue_discard(sbi->sb, blkstart, blklen); | 773 | trace_f2fs_issue_discard(bdev, blkstart, blklen); |
680 | 774 | ||
681 | if (sbi->s_ndevs) { | 775 | if (sbi->s_ndevs) { |
682 | int devi = f2fs_target_device_index(sbi, blkstart); | 776 | int devi = f2fs_target_device_index(sbi, blkstart); |
@@ -688,14 +782,12 @@ static int __f2fs_issue_discard_async(struct f2fs_sb_info *sbi, | |||
688 | SECTOR_FROM_BLOCK(blklen), | 782 | SECTOR_FROM_BLOCK(blklen), |
689 | GFP_NOFS, 0, &bio); | 783 | GFP_NOFS, 0, &bio); |
690 | if (!err && bio) { | 784 | if (!err && bio) { |
691 | struct bio_entry *be = __add_bio_entry(sbi, bio); | 785 | bio->bi_end_io = f2fs_submit_discard_endio; |
692 | |||
693 | bio->bi_private = be; | ||
694 | bio->bi_end_io = f2fs_submit_bio_wait_endio; | ||
695 | bio->bi_opf |= REQ_SYNC; | 786 | bio->bi_opf |= REQ_SYNC; |
696 | submit_bio(bio); | ||
697 | } | ||
698 | 787 | ||
788 | __add_discard_cmd(sbi, bio, lblkstart, blklen); | ||
789 | wake_up(&SM_I(sbi)->dcc_info->discard_wait_queue); | ||
790 | } | ||
699 | return err; | 791 | return err; |
700 | } | 792 | } |
701 | 793 | ||
@@ -703,24 +795,13 @@ static int __f2fs_issue_discard_async(struct f2fs_sb_info *sbi, | |||
703 | static int __f2fs_issue_discard_zone(struct f2fs_sb_info *sbi, | 795 | static int __f2fs_issue_discard_zone(struct f2fs_sb_info *sbi, |
704 | struct block_device *bdev, block_t blkstart, block_t blklen) | 796 | struct block_device *bdev, block_t blkstart, block_t blklen) |
705 | { | 797 | { |
706 | sector_t nr_sects = SECTOR_FROM_BLOCK(blklen); | 798 | sector_t sector, nr_sects; |
707 | sector_t sector; | ||
708 | int devi = 0; | 799 | int devi = 0; |
709 | 800 | ||
710 | if (sbi->s_ndevs) { | 801 | if (sbi->s_ndevs) { |
711 | devi = f2fs_target_device_index(sbi, blkstart); | 802 | devi = f2fs_target_device_index(sbi, blkstart); |
712 | blkstart -= FDEV(devi).start_blk; | 803 | blkstart -= FDEV(devi).start_blk; |
713 | } | 804 | } |
714 | sector = SECTOR_FROM_BLOCK(blkstart); | ||
715 | |||
716 | if (sector & (bdev_zone_sectors(bdev) - 1) || | ||
717 | nr_sects != bdev_zone_sectors(bdev)) { | ||
718 | f2fs_msg(sbi->sb, KERN_INFO, | ||
719 | "(%d) %s: Unaligned discard attempted (block %x + %x)", | ||
720 | devi, sbi->s_ndevs ? FDEV(devi).path: "", | ||
721 | blkstart, blklen); | ||
722 | return -EIO; | ||
723 | } | ||
724 | 805 | ||
725 | /* | 806 | /* |
726 | * We need to know the type of the zone: for conventional zones, | 807 | * We need to know the type of the zone: for conventional zones, |
@@ -735,7 +816,18 @@ static int __f2fs_issue_discard_zone(struct f2fs_sb_info *sbi, | |||
735 | return __f2fs_issue_discard_async(sbi, bdev, blkstart, blklen); | 816 | return __f2fs_issue_discard_async(sbi, bdev, blkstart, blklen); |
736 | case BLK_ZONE_TYPE_SEQWRITE_REQ: | 817 | case BLK_ZONE_TYPE_SEQWRITE_REQ: |
737 | case BLK_ZONE_TYPE_SEQWRITE_PREF: | 818 | case BLK_ZONE_TYPE_SEQWRITE_PREF: |
738 | trace_f2fs_issue_reset_zone(sbi->sb, blkstart); | 819 | sector = SECTOR_FROM_BLOCK(blkstart); |
820 | nr_sects = SECTOR_FROM_BLOCK(blklen); | ||
821 | |||
822 | if (sector & (bdev_zone_sectors(bdev) - 1) || | ||
823 | nr_sects != bdev_zone_sectors(bdev)) { | ||
824 | f2fs_msg(sbi->sb, KERN_INFO, | ||
825 | "(%d) %s: Unaligned discard attempted (block %x + %x)", | ||
826 | devi, sbi->s_ndevs ? FDEV(devi).path: "", | ||
827 | blkstart, blklen); | ||
828 | return -EIO; | ||
829 | } | ||
830 | trace_f2fs_issue_reset_zone(bdev, blkstart); | ||
739 | return blkdev_reset_zones(bdev, sector, | 831 | return blkdev_reset_zones(bdev, sector, |
740 | nr_sects, GFP_NOFS); | 832 | nr_sects, GFP_NOFS); |
741 | default: | 833 | default: |
@@ -800,13 +892,14 @@ static void __add_discard_entry(struct f2fs_sb_info *sbi, | |||
800 | struct cp_control *cpc, struct seg_entry *se, | 892 | struct cp_control *cpc, struct seg_entry *se, |
801 | unsigned int start, unsigned int end) | 893 | unsigned int start, unsigned int end) |
802 | { | 894 | { |
803 | struct list_head *head = &SM_I(sbi)->discard_list; | 895 | struct list_head *head = &SM_I(sbi)->dcc_info->discard_entry_list; |
804 | struct discard_entry *new, *last; | 896 | struct discard_entry *new, *last; |
805 | 897 | ||
806 | if (!list_empty(head)) { | 898 | if (!list_empty(head)) { |
807 | last = list_last_entry(head, struct discard_entry, list); | 899 | last = list_last_entry(head, struct discard_entry, list); |
808 | if (START_BLOCK(sbi, cpc->trim_start) + start == | 900 | if (START_BLOCK(sbi, cpc->trim_start) + start == |
809 | last->blkaddr + last->len) { | 901 | last->blkaddr + last->len && |
902 | last->len < MAX_DISCARD_BLOCKS(sbi)) { | ||
810 | last->len += end - start; | 903 | last->len += end - start; |
811 | goto done; | 904 | goto done; |
812 | } | 905 | } |
@@ -818,10 +911,11 @@ static void __add_discard_entry(struct f2fs_sb_info *sbi, | |||
818 | new->len = end - start; | 911 | new->len = end - start; |
819 | list_add_tail(&new->list, head); | 912 | list_add_tail(&new->list, head); |
820 | done: | 913 | done: |
821 | SM_I(sbi)->nr_discards += end - start; | 914 | SM_I(sbi)->dcc_info->nr_discards += end - start; |
822 | } | 915 | } |
823 | 916 | ||
824 | static void add_discard_addrs(struct f2fs_sb_info *sbi, struct cp_control *cpc) | 917 | static bool add_discard_addrs(struct f2fs_sb_info *sbi, struct cp_control *cpc, |
918 | bool check_only) | ||
825 | { | 919 | { |
826 | int entries = SIT_VBLOCK_MAP_SIZE / sizeof(unsigned long); | 920 | int entries = SIT_VBLOCK_MAP_SIZE / sizeof(unsigned long); |
827 | int max_blocks = sbi->blocks_per_seg; | 921 | int max_blocks = sbi->blocks_per_seg; |
@@ -835,12 +929,13 @@ static void add_discard_addrs(struct f2fs_sb_info *sbi, struct cp_control *cpc) | |||
835 | int i; | 929 | int i; |
836 | 930 | ||
837 | if (se->valid_blocks == max_blocks || !f2fs_discard_en(sbi)) | 931 | if (se->valid_blocks == max_blocks || !f2fs_discard_en(sbi)) |
838 | return; | 932 | return false; |
839 | 933 | ||
840 | if (!force) { | 934 | if (!force) { |
841 | if (!test_opt(sbi, DISCARD) || !se->valid_blocks || | 935 | if (!test_opt(sbi, DISCARD) || !se->valid_blocks || |
842 | SM_I(sbi)->nr_discards >= SM_I(sbi)->max_discards) | 936 | SM_I(sbi)->dcc_info->nr_discards >= |
843 | return; | 937 | SM_I(sbi)->dcc_info->max_discards) |
938 | return false; | ||
844 | } | 939 | } |
845 | 940 | ||
846 | /* SIT_VBLOCK_MAP_SIZE should be multiple of sizeof(unsigned long) */ | 941 | /* SIT_VBLOCK_MAP_SIZE should be multiple of sizeof(unsigned long) */ |
@@ -848,7 +943,8 @@ static void add_discard_addrs(struct f2fs_sb_info *sbi, struct cp_control *cpc) | |||
848 | dmap[i] = force ? ~ckpt_map[i] & ~discard_map[i] : | 943 | dmap[i] = force ? ~ckpt_map[i] & ~discard_map[i] : |
849 | (cur_map[i] ^ ckpt_map[i]) & ckpt_map[i]; | 944 | (cur_map[i] ^ ckpt_map[i]) & ckpt_map[i]; |
850 | 945 | ||
851 | while (force || SM_I(sbi)->nr_discards <= SM_I(sbi)->max_discards) { | 946 | while (force || SM_I(sbi)->dcc_info->nr_discards <= |
947 | SM_I(sbi)->dcc_info->max_discards) { | ||
852 | start = __find_rev_next_bit(dmap, max_blocks, end + 1); | 948 | start = __find_rev_next_bit(dmap, max_blocks, end + 1); |
853 | if (start >= max_blocks) | 949 | if (start >= max_blocks) |
854 | break; | 950 | break; |
@@ -858,13 +954,17 @@ static void add_discard_addrs(struct f2fs_sb_info *sbi, struct cp_control *cpc) | |||
858 | && (end - start) < cpc->trim_minlen) | 954 | && (end - start) < cpc->trim_minlen) |
859 | continue; | 955 | continue; |
860 | 956 | ||
957 | if (check_only) | ||
958 | return true; | ||
959 | |||
861 | __add_discard_entry(sbi, cpc, se, start, end); | 960 | __add_discard_entry(sbi, cpc, se, start, end); |
862 | } | 961 | } |
962 | return false; | ||
863 | } | 963 | } |
864 | 964 | ||
865 | void release_discard_addrs(struct f2fs_sb_info *sbi) | 965 | void release_discard_addrs(struct f2fs_sb_info *sbi) |
866 | { | 966 | { |
867 | struct list_head *head = &(SM_I(sbi)->discard_list); | 967 | struct list_head *head = &(SM_I(sbi)->dcc_info->discard_entry_list); |
868 | struct discard_entry *entry, *this; | 968 | struct discard_entry *entry, *this; |
869 | 969 | ||
870 | /* drop caches */ | 970 | /* drop caches */ |
@@ -890,17 +990,14 @@ static void set_prefree_as_free_segments(struct f2fs_sb_info *sbi) | |||
890 | 990 | ||
891 | void clear_prefree_segments(struct f2fs_sb_info *sbi, struct cp_control *cpc) | 991 | void clear_prefree_segments(struct f2fs_sb_info *sbi, struct cp_control *cpc) |
892 | { | 992 | { |
893 | struct list_head *head = &(SM_I(sbi)->discard_list); | 993 | struct list_head *head = &(SM_I(sbi)->dcc_info->discard_entry_list); |
894 | struct discard_entry *entry, *this; | 994 | struct discard_entry *entry, *this; |
895 | struct dirty_seglist_info *dirty_i = DIRTY_I(sbi); | 995 | struct dirty_seglist_info *dirty_i = DIRTY_I(sbi); |
896 | struct blk_plug plug; | ||
897 | unsigned long *prefree_map = dirty_i->dirty_segmap[PRE]; | 996 | unsigned long *prefree_map = dirty_i->dirty_segmap[PRE]; |
898 | unsigned int start = 0, end = -1; | 997 | unsigned int start = 0, end = -1; |
899 | unsigned int secno, start_segno; | 998 | unsigned int secno, start_segno; |
900 | bool force = (cpc->reason == CP_DISCARD); | 999 | bool force = (cpc->reason == CP_DISCARD); |
901 | 1000 | ||
902 | blk_start_plug(&plug); | ||
903 | |||
904 | mutex_lock(&dirty_i->seglist_lock); | 1001 | mutex_lock(&dirty_i->seglist_lock); |
905 | 1002 | ||
906 | while (1) { | 1003 | while (1) { |
@@ -916,9 +1013,13 @@ void clear_prefree_segments(struct f2fs_sb_info *sbi, struct cp_control *cpc) | |||
916 | 1013 | ||
917 | dirty_i->nr_dirty[PRE] -= end - start; | 1014 | dirty_i->nr_dirty[PRE] -= end - start; |
918 | 1015 | ||
919 | if (force || !test_opt(sbi, DISCARD)) | 1016 | if (!test_opt(sbi, DISCARD)) |
920 | continue; | 1017 | continue; |
921 | 1018 | ||
1019 | if (force && start >= cpc->trim_start && | ||
1020 | (end - 1) <= cpc->trim_end) | ||
1021 | continue; | ||
1022 | |||
922 | if (!test_opt(sbi, LFS) || sbi->segs_per_sec == 1) { | 1023 | if (!test_opt(sbi, LFS) || sbi->segs_per_sec == 1) { |
923 | f2fs_issue_discard(sbi, START_BLOCK(sbi, start), | 1024 | f2fs_issue_discard(sbi, START_BLOCK(sbi, start), |
924 | (end - start) << sbi->log_blocks_per_seg); | 1025 | (end - start) << sbi->log_blocks_per_seg); |
@@ -935,6 +1036,8 @@ next: | |||
935 | start = start_segno + sbi->segs_per_sec; | 1036 | start = start_segno + sbi->segs_per_sec; |
936 | if (start < end) | 1037 | if (start < end) |
937 | goto next; | 1038 | goto next; |
1039 | else | ||
1040 | end = start - 1; | ||
938 | } | 1041 | } |
939 | mutex_unlock(&dirty_i->seglist_lock); | 1042 | mutex_unlock(&dirty_i->seglist_lock); |
940 | 1043 | ||
@@ -946,11 +1049,62 @@ next: | |||
946 | cpc->trimmed += entry->len; | 1049 | cpc->trimmed += entry->len; |
947 | skip: | 1050 | skip: |
948 | list_del(&entry->list); | 1051 | list_del(&entry->list); |
949 | SM_I(sbi)->nr_discards -= entry->len; | 1052 | SM_I(sbi)->dcc_info->nr_discards -= entry->len; |
950 | kmem_cache_free(discard_entry_slab, entry); | 1053 | kmem_cache_free(discard_entry_slab, entry); |
951 | } | 1054 | } |
1055 | } | ||
952 | 1056 | ||
953 | blk_finish_plug(&plug); | 1057 | static int create_discard_cmd_control(struct f2fs_sb_info *sbi) |
1058 | { | ||
1059 | dev_t dev = sbi->sb->s_bdev->bd_dev; | ||
1060 | struct discard_cmd_control *dcc; | ||
1061 | int err = 0; | ||
1062 | |||
1063 | if (SM_I(sbi)->dcc_info) { | ||
1064 | dcc = SM_I(sbi)->dcc_info; | ||
1065 | goto init_thread; | ||
1066 | } | ||
1067 | |||
1068 | dcc = kzalloc(sizeof(struct discard_cmd_control), GFP_KERNEL); | ||
1069 | if (!dcc) | ||
1070 | return -ENOMEM; | ||
1071 | |||
1072 | INIT_LIST_HEAD(&dcc->discard_entry_list); | ||
1073 | INIT_LIST_HEAD(&dcc->discard_cmd_list); | ||
1074 | mutex_init(&dcc->cmd_lock); | ||
1075 | atomic_set(&dcc->submit_discard, 0); | ||
1076 | dcc->nr_discards = 0; | ||
1077 | dcc->max_discards = 0; | ||
1078 | |||
1079 | init_waitqueue_head(&dcc->discard_wait_queue); | ||
1080 | SM_I(sbi)->dcc_info = dcc; | ||
1081 | init_thread: | ||
1082 | dcc->f2fs_issue_discard = kthread_run(issue_discard_thread, sbi, | ||
1083 | "f2fs_discard-%u:%u", MAJOR(dev), MINOR(dev)); | ||
1084 | if (IS_ERR(dcc->f2fs_issue_discard)) { | ||
1085 | err = PTR_ERR(dcc->f2fs_issue_discard); | ||
1086 | kfree(dcc); | ||
1087 | SM_I(sbi)->dcc_info = NULL; | ||
1088 | return err; | ||
1089 | } | ||
1090 | |||
1091 | return err; | ||
1092 | } | ||
1093 | |||
1094 | static void destroy_discard_cmd_control(struct f2fs_sb_info *sbi, bool free) | ||
1095 | { | ||
1096 | struct discard_cmd_control *dcc = SM_I(sbi)->dcc_info; | ||
1097 | |||
1098 | if (dcc && dcc->f2fs_issue_discard) { | ||
1099 | struct task_struct *discard_thread = dcc->f2fs_issue_discard; | ||
1100 | |||
1101 | dcc->f2fs_issue_discard = NULL; | ||
1102 | kthread_stop(discard_thread); | ||
1103 | } | ||
1104 | if (free) { | ||
1105 | kfree(dcc); | ||
1106 | SM_I(sbi)->dcc_info = NULL; | ||
1107 | } | ||
954 | } | 1108 | } |
955 | 1109 | ||
956 | static bool __mark_sit_entry_dirty(struct f2fs_sb_info *sbi, unsigned int segno) | 1110 | static bool __mark_sit_entry_dirty(struct f2fs_sb_info *sbi, unsigned int segno) |
@@ -995,14 +1149,32 @@ static void update_sit_entry(struct f2fs_sb_info *sbi, block_t blkaddr, int del) | |||
995 | 1149 | ||
996 | /* Update valid block bitmap */ | 1150 | /* Update valid block bitmap */ |
997 | if (del > 0) { | 1151 | if (del > 0) { |
998 | if (f2fs_test_and_set_bit(offset, se->cur_valid_map)) | 1152 | if (f2fs_test_and_set_bit(offset, se->cur_valid_map)) { |
1153 | #ifdef CONFIG_F2FS_CHECK_FS | ||
1154 | if (f2fs_test_and_set_bit(offset, | ||
1155 | se->cur_valid_map_mir)) | ||
1156 | f2fs_bug_on(sbi, 1); | ||
1157 | else | ||
1158 | WARN_ON(1); | ||
1159 | #else | ||
999 | f2fs_bug_on(sbi, 1); | 1160 | f2fs_bug_on(sbi, 1); |
1161 | #endif | ||
1162 | } | ||
1000 | if (f2fs_discard_en(sbi) && | 1163 | if (f2fs_discard_en(sbi) && |
1001 | !f2fs_test_and_set_bit(offset, se->discard_map)) | 1164 | !f2fs_test_and_set_bit(offset, se->discard_map)) |
1002 | sbi->discard_blks--; | 1165 | sbi->discard_blks--; |
1003 | } else { | 1166 | } else { |
1004 | if (!f2fs_test_and_clear_bit(offset, se->cur_valid_map)) | 1167 | if (!f2fs_test_and_clear_bit(offset, se->cur_valid_map)) { |
1168 | #ifdef CONFIG_F2FS_CHECK_FS | ||
1169 | if (!f2fs_test_and_clear_bit(offset, | ||
1170 | se->cur_valid_map_mir)) | ||
1171 | f2fs_bug_on(sbi, 1); | ||
1172 | else | ||
1173 | WARN_ON(1); | ||
1174 | #else | ||
1005 | f2fs_bug_on(sbi, 1); | 1175 | f2fs_bug_on(sbi, 1); |
1176 | #endif | ||
1177 | } | ||
1006 | if (f2fs_discard_en(sbi) && | 1178 | if (f2fs_discard_en(sbi) && |
1007 | f2fs_test_and_clear_bit(offset, se->discard_map)) | 1179 | f2fs_test_and_clear_bit(offset, se->discard_map)) |
1008 | sbi->discard_blks++; | 1180 | sbi->discard_blks++; |
@@ -1167,17 +1339,6 @@ static void write_current_sum_page(struct f2fs_sb_info *sbi, | |||
1167 | f2fs_put_page(page, 1); | 1339 | f2fs_put_page(page, 1); |
1168 | } | 1340 | } |
1169 | 1341 | ||
1170 | static int is_next_segment_free(struct f2fs_sb_info *sbi, int type) | ||
1171 | { | ||
1172 | struct curseg_info *curseg = CURSEG_I(sbi, type); | ||
1173 | unsigned int segno = curseg->segno + 1; | ||
1174 | struct free_segmap_info *free_i = FREE_I(sbi); | ||
1175 | |||
1176 | if (segno < MAIN_SEGS(sbi) && segno % sbi->segs_per_sec) | ||
1177 | return !test_bit(segno, free_i->free_segmap); | ||
1178 | return 0; | ||
1179 | } | ||
1180 | |||
1181 | /* | 1342 | /* |
1182 | * Find a new segment from the free segments bitmap to right order | 1343 | * Find a new segment from the free segments bitmap to right order |
1183 | * This function should be returned with success, otherwise BUG | 1344 | * This function should be returned with success, otherwise BUG |
@@ -1382,16 +1543,39 @@ static int get_ssr_segment(struct f2fs_sb_info *sbi, int type) | |||
1382 | { | 1543 | { |
1383 | struct curseg_info *curseg = CURSEG_I(sbi, type); | 1544 | struct curseg_info *curseg = CURSEG_I(sbi, type); |
1384 | const struct victim_selection *v_ops = DIRTY_I(sbi)->v_ops; | 1545 | const struct victim_selection *v_ops = DIRTY_I(sbi)->v_ops; |
1546 | int i, cnt; | ||
1547 | bool reversed = false; | ||
1548 | |||
1549 | /* need_SSR() already forces to do this */ | ||
1550 | if (v_ops->get_victim(sbi, &(curseg)->next_segno, BG_GC, type, SSR)) | ||
1551 | return 1; | ||
1385 | 1552 | ||
1386 | if (IS_NODESEG(type) || !has_not_enough_free_secs(sbi, 0, 0)) | 1553 | /* For node segments, let's do SSR more intensively */ |
1387 | return v_ops->get_victim(sbi, | 1554 | if (IS_NODESEG(type)) { |
1388 | &(curseg)->next_segno, BG_GC, type, SSR); | 1555 | if (type >= CURSEG_WARM_NODE) { |
1556 | reversed = true; | ||
1557 | i = CURSEG_COLD_NODE; | ||
1558 | } else { | ||
1559 | i = CURSEG_HOT_NODE; | ||
1560 | } | ||
1561 | cnt = NR_CURSEG_NODE_TYPE; | ||
1562 | } else { | ||
1563 | if (type >= CURSEG_WARM_DATA) { | ||
1564 | reversed = true; | ||
1565 | i = CURSEG_COLD_DATA; | ||
1566 | } else { | ||
1567 | i = CURSEG_HOT_DATA; | ||
1568 | } | ||
1569 | cnt = NR_CURSEG_DATA_TYPE; | ||
1570 | } | ||
1389 | 1571 | ||
1390 | /* For data segments, let's do SSR more intensively */ | 1572 | for (; cnt-- > 0; reversed ? i-- : i++) { |
1391 | for (; type >= CURSEG_HOT_DATA; type--) | 1573 | if (i == type) |
1574 | continue; | ||
1392 | if (v_ops->get_victim(sbi, &(curseg)->next_segno, | 1575 | if (v_ops->get_victim(sbi, &(curseg)->next_segno, |
1393 | BG_GC, type, SSR)) | 1576 | BG_GC, i, SSR)) |
1394 | return 1; | 1577 | return 1; |
1578 | } | ||
1395 | return 0; | 1579 | return 0; |
1396 | } | 1580 | } |
1397 | 1581 | ||
@@ -1402,20 +1586,17 @@ static int get_ssr_segment(struct f2fs_sb_info *sbi, int type) | |||
1402 | static void allocate_segment_by_default(struct f2fs_sb_info *sbi, | 1586 | static void allocate_segment_by_default(struct f2fs_sb_info *sbi, |
1403 | int type, bool force) | 1587 | int type, bool force) |
1404 | { | 1588 | { |
1405 | struct curseg_info *curseg = CURSEG_I(sbi, type); | ||
1406 | |||
1407 | if (force) | 1589 | if (force) |
1408 | new_curseg(sbi, type, true); | 1590 | new_curseg(sbi, type, true); |
1409 | else if (type == CURSEG_WARM_NODE) | 1591 | else if (!is_set_ckpt_flags(sbi, CP_CRC_RECOVERY_FLAG) && |
1410 | new_curseg(sbi, type, false); | 1592 | type == CURSEG_WARM_NODE) |
1411 | else if (curseg->alloc_type == LFS && is_next_segment_free(sbi, type)) | ||
1412 | new_curseg(sbi, type, false); | 1593 | new_curseg(sbi, type, false); |
1413 | else if (need_SSR(sbi) && get_ssr_segment(sbi, type)) | 1594 | else if (need_SSR(sbi) && get_ssr_segment(sbi, type)) |
1414 | change_curseg(sbi, type, true); | 1595 | change_curseg(sbi, type, true); |
1415 | else | 1596 | else |
1416 | new_curseg(sbi, type, false); | 1597 | new_curseg(sbi, type, false); |
1417 | 1598 | ||
1418 | stat_inc_seg_type(sbi, curseg); | 1599 | stat_inc_seg_type(sbi, CURSEG_I(sbi, type)); |
1419 | } | 1600 | } |
1420 | 1601 | ||
1421 | void allocate_new_segments(struct f2fs_sb_info *sbi) | 1602 | void allocate_new_segments(struct f2fs_sb_info *sbi) |
@@ -1424,9 +1605,6 @@ void allocate_new_segments(struct f2fs_sb_info *sbi) | |||
1424 | unsigned int old_segno; | 1605 | unsigned int old_segno; |
1425 | int i; | 1606 | int i; |
1426 | 1607 | ||
1427 | if (test_opt(sbi, LFS)) | ||
1428 | return; | ||
1429 | |||
1430 | for (i = CURSEG_HOT_DATA; i <= CURSEG_COLD_DATA; i++) { | 1608 | for (i = CURSEG_HOT_DATA; i <= CURSEG_COLD_DATA; i++) { |
1431 | curseg = CURSEG_I(sbi, i); | 1609 | curseg = CURSEG_I(sbi, i); |
1432 | old_segno = curseg->segno; | 1610 | old_segno = curseg->segno; |
@@ -1439,6 +1617,24 @@ static const struct segment_allocation default_salloc_ops = { | |||
1439 | .allocate_segment = allocate_segment_by_default, | 1617 | .allocate_segment = allocate_segment_by_default, |
1440 | }; | 1618 | }; |
1441 | 1619 | ||
1620 | bool exist_trim_candidates(struct f2fs_sb_info *sbi, struct cp_control *cpc) | ||
1621 | { | ||
1622 | __u64 trim_start = cpc->trim_start; | ||
1623 | bool has_candidate = false; | ||
1624 | |||
1625 | mutex_lock(&SIT_I(sbi)->sentry_lock); | ||
1626 | for (; cpc->trim_start <= cpc->trim_end; cpc->trim_start++) { | ||
1627 | if (add_discard_addrs(sbi, cpc, true)) { | ||
1628 | has_candidate = true; | ||
1629 | break; | ||
1630 | } | ||
1631 | } | ||
1632 | mutex_unlock(&SIT_I(sbi)->sentry_lock); | ||
1633 | |||
1634 | cpc->trim_start = trim_start; | ||
1635 | return has_candidate; | ||
1636 | } | ||
1637 | |||
1442 | int f2fs_trim_fs(struct f2fs_sb_info *sbi, struct fstrim_range *range) | 1638 | int f2fs_trim_fs(struct f2fs_sb_info *sbi, struct fstrim_range *range) |
1443 | { | 1639 | { |
1444 | __u64 start = F2FS_BYTES_TO_BLK(range->start); | 1640 | __u64 start = F2FS_BYTES_TO_BLK(range->start); |
@@ -1573,6 +1769,8 @@ void allocate_data_block(struct f2fs_sb_info *sbi, struct page *page, | |||
1573 | 1769 | ||
1574 | *new_blkaddr = NEXT_FREE_BLKADDR(sbi, curseg); | 1770 | *new_blkaddr = NEXT_FREE_BLKADDR(sbi, curseg); |
1575 | 1771 | ||
1772 | f2fs_wait_discard_bio(sbi, *new_blkaddr); | ||
1773 | |||
1576 | /* | 1774 | /* |
1577 | * __add_sum_entry should be resided under the curseg_mutex | 1775 | * __add_sum_entry should be resided under the curseg_mutex |
1578 | * because, this function updates a summary entry in the | 1776 | * because, this function updates a summary entry in the |
@@ -1584,14 +1782,15 @@ void allocate_data_block(struct f2fs_sb_info *sbi, struct page *page, | |||
1584 | 1782 | ||
1585 | stat_inc_block_count(sbi, curseg); | 1783 | stat_inc_block_count(sbi, curseg); |
1586 | 1784 | ||
1587 | if (!__has_curseg_space(sbi, type)) | ||
1588 | sit_i->s_ops->allocate_segment(sbi, type, false); | ||
1589 | /* | 1785 | /* |
1590 | * SIT information should be updated before segment allocation, | 1786 | * SIT information should be updated before segment allocation, |
1591 | * since SSR needs latest valid block information. | 1787 | * since SSR needs latest valid block information. |
1592 | */ | 1788 | */ |
1593 | refresh_sit_entry(sbi, old_blkaddr, *new_blkaddr); | 1789 | refresh_sit_entry(sbi, old_blkaddr, *new_blkaddr); |
1594 | 1790 | ||
1791 | if (!__has_curseg_space(sbi, type)) | ||
1792 | sit_i->s_ops->allocate_segment(sbi, type, false); | ||
1793 | |||
1595 | mutex_unlock(&sit_i->sentry_lock); | 1794 | mutex_unlock(&sit_i->sentry_lock); |
1596 | 1795 | ||
1597 | if (page && IS_NODESEG(type)) | 1796 | if (page && IS_NODESEG(type)) |
@@ -1603,15 +1802,20 @@ void allocate_data_block(struct f2fs_sb_info *sbi, struct page *page, | |||
1603 | static void do_write_page(struct f2fs_summary *sum, struct f2fs_io_info *fio) | 1802 | static void do_write_page(struct f2fs_summary *sum, struct f2fs_io_info *fio) |
1604 | { | 1803 | { |
1605 | int type = __get_segment_type(fio->page, fio->type); | 1804 | int type = __get_segment_type(fio->page, fio->type); |
1805 | int err; | ||
1606 | 1806 | ||
1607 | if (fio->type == NODE || fio->type == DATA) | 1807 | if (fio->type == NODE || fio->type == DATA) |
1608 | mutex_lock(&fio->sbi->wio_mutex[fio->type]); | 1808 | mutex_lock(&fio->sbi->wio_mutex[fio->type]); |
1609 | 1809 | reallocate: | |
1610 | allocate_data_block(fio->sbi, fio->page, fio->old_blkaddr, | 1810 | allocate_data_block(fio->sbi, fio->page, fio->old_blkaddr, |
1611 | &fio->new_blkaddr, sum, type); | 1811 | &fio->new_blkaddr, sum, type); |
1612 | 1812 | ||
1613 | /* writeout dirty page into bdev */ | 1813 | /* writeout dirty page into bdev */ |
1614 | f2fs_submit_page_mbio(fio); | 1814 | err = f2fs_submit_page_mbio(fio); |
1815 | if (err == -EAGAIN) { | ||
1816 | fio->old_blkaddr = fio->new_blkaddr; | ||
1817 | goto reallocate; | ||
1818 | } | ||
1615 | 1819 | ||
1616 | if (fio->type == NODE || fio->type == DATA) | 1820 | if (fio->type == NODE || fio->type == DATA) |
1617 | mutex_unlock(&fio->sbi->wio_mutex[fio->type]); | 1821 | mutex_unlock(&fio->sbi->wio_mutex[fio->type]); |
@@ -1753,7 +1957,8 @@ void f2fs_wait_on_page_writeback(struct page *page, | |||
1753 | if (PageWriteback(page)) { | 1957 | if (PageWriteback(page)) { |
1754 | struct f2fs_sb_info *sbi = F2FS_P_SB(page); | 1958 | struct f2fs_sb_info *sbi = F2FS_P_SB(page); |
1755 | 1959 | ||
1756 | f2fs_submit_merged_bio_cond(sbi, NULL, page, 0, type, WRITE); | 1960 | f2fs_submit_merged_bio_cond(sbi, page->mapping->host, |
1961 | 0, page->index, type, WRITE); | ||
1757 | if (ordered) | 1962 | if (ordered) |
1758 | wait_on_page_writeback(page); | 1963 | wait_on_page_writeback(page); |
1759 | else | 1964 | else |
@@ -2228,7 +2433,7 @@ void flush_sit_entries(struct f2fs_sb_info *sbi, struct cp_control *cpc) | |||
2228 | /* add discard candidates */ | 2433 | /* add discard candidates */ |
2229 | if (cpc->reason != CP_DISCARD) { | 2434 | if (cpc->reason != CP_DISCARD) { |
2230 | cpc->trim_start = segno; | 2435 | cpc->trim_start = segno; |
2231 | add_discard_addrs(sbi, cpc); | 2436 | add_discard_addrs(sbi, cpc, false); |
2232 | } | 2437 | } |
2233 | 2438 | ||
2234 | if (to_journal) { | 2439 | if (to_journal) { |
@@ -2263,8 +2468,12 @@ void flush_sit_entries(struct f2fs_sb_info *sbi, struct cp_control *cpc) | |||
2263 | f2fs_bug_on(sbi, sit_i->dirty_sentries); | 2468 | f2fs_bug_on(sbi, sit_i->dirty_sentries); |
2264 | out: | 2469 | out: |
2265 | if (cpc->reason == CP_DISCARD) { | 2470 | if (cpc->reason == CP_DISCARD) { |
2471 | __u64 trim_start = cpc->trim_start; | ||
2472 | |||
2266 | for (; cpc->trim_start <= cpc->trim_end; cpc->trim_start++) | 2473 | for (; cpc->trim_start <= cpc->trim_end; cpc->trim_start++) |
2267 | add_discard_addrs(sbi, cpc); | 2474 | add_discard_addrs(sbi, cpc, false); |
2475 | |||
2476 | cpc->trim_start = trim_start; | ||
2268 | } | 2477 | } |
2269 | mutex_unlock(&sit_i->sentry_lock); | 2478 | mutex_unlock(&sit_i->sentry_lock); |
2270 | 2479 | ||
@@ -2276,7 +2485,7 @@ static int build_sit_info(struct f2fs_sb_info *sbi) | |||
2276 | struct f2fs_super_block *raw_super = F2FS_RAW_SUPER(sbi); | 2485 | struct f2fs_super_block *raw_super = F2FS_RAW_SUPER(sbi); |
2277 | struct sit_info *sit_i; | 2486 | struct sit_info *sit_i; |
2278 | unsigned int sit_segs, start; | 2487 | unsigned int sit_segs, start; |
2279 | char *src_bitmap, *dst_bitmap; | 2488 | char *src_bitmap; |
2280 | unsigned int bitmap_size; | 2489 | unsigned int bitmap_size; |
2281 | 2490 | ||
2282 | /* allocate memory for SIT information */ | 2491 | /* allocate memory for SIT information */ |
@@ -2305,6 +2514,13 @@ static int build_sit_info(struct f2fs_sb_info *sbi) | |||
2305 | !sit_i->sentries[start].ckpt_valid_map) | 2514 | !sit_i->sentries[start].ckpt_valid_map) |
2306 | return -ENOMEM; | 2515 | return -ENOMEM; |
2307 | 2516 | ||
2517 | #ifdef CONFIG_F2FS_CHECK_FS | ||
2518 | sit_i->sentries[start].cur_valid_map_mir | ||
2519 | = kzalloc(SIT_VBLOCK_MAP_SIZE, GFP_KERNEL); | ||
2520 | if (!sit_i->sentries[start].cur_valid_map_mir) | ||
2521 | return -ENOMEM; | ||
2522 | #endif | ||
2523 | |||
2308 | if (f2fs_discard_en(sbi)) { | 2524 | if (f2fs_discard_en(sbi)) { |
2309 | sit_i->sentries[start].discard_map | 2525 | sit_i->sentries[start].discard_map |
2310 | = kzalloc(SIT_VBLOCK_MAP_SIZE, GFP_KERNEL); | 2526 | = kzalloc(SIT_VBLOCK_MAP_SIZE, GFP_KERNEL); |
@@ -2331,17 +2547,22 @@ static int build_sit_info(struct f2fs_sb_info *sbi) | |||
2331 | bitmap_size = __bitmap_size(sbi, SIT_BITMAP); | 2547 | bitmap_size = __bitmap_size(sbi, SIT_BITMAP); |
2332 | src_bitmap = __bitmap_ptr(sbi, SIT_BITMAP); | 2548 | src_bitmap = __bitmap_ptr(sbi, SIT_BITMAP); |
2333 | 2549 | ||
2334 | dst_bitmap = kmemdup(src_bitmap, bitmap_size, GFP_KERNEL); | 2550 | sit_i->sit_bitmap = kmemdup(src_bitmap, bitmap_size, GFP_KERNEL); |
2335 | if (!dst_bitmap) | 2551 | if (!sit_i->sit_bitmap) |
2336 | return -ENOMEM; | 2552 | return -ENOMEM; |
2337 | 2553 | ||
2554 | #ifdef CONFIG_F2FS_CHECK_FS | ||
2555 | sit_i->sit_bitmap_mir = kmemdup(src_bitmap, bitmap_size, GFP_KERNEL); | ||
2556 | if (!sit_i->sit_bitmap_mir) | ||
2557 | return -ENOMEM; | ||
2558 | #endif | ||
2559 | |||
2338 | /* init SIT information */ | 2560 | /* init SIT information */ |
2339 | sit_i->s_ops = &default_salloc_ops; | 2561 | sit_i->s_ops = &default_salloc_ops; |
2340 | 2562 | ||
2341 | sit_i->sit_base_addr = le32_to_cpu(raw_super->sit_blkaddr); | 2563 | sit_i->sit_base_addr = le32_to_cpu(raw_super->sit_blkaddr); |
2342 | sit_i->sit_blocks = sit_segs << sbi->log_blocks_per_seg; | 2564 | sit_i->sit_blocks = sit_segs << sbi->log_blocks_per_seg; |
2343 | sit_i->written_valid_blocks = 0; | 2565 | sit_i->written_valid_blocks = 0; |
2344 | sit_i->sit_bitmap = dst_bitmap; | ||
2345 | sit_i->bitmap_size = bitmap_size; | 2566 | sit_i->bitmap_size = bitmap_size; |
2346 | sit_i->dirty_sentries = 0; | 2567 | sit_i->dirty_sentries = 0; |
2347 | sit_i->sents_per_block = SIT_ENTRY_PER_BLOCK; | 2568 | sit_i->sents_per_block = SIT_ENTRY_PER_BLOCK; |
@@ -2626,11 +2847,6 @@ int build_segment_manager(struct f2fs_sb_info *sbi) | |||
2626 | sm_info->min_ipu_util = DEF_MIN_IPU_UTIL; | 2847 | sm_info->min_ipu_util = DEF_MIN_IPU_UTIL; |
2627 | sm_info->min_fsync_blocks = DEF_MIN_FSYNC_BLOCKS; | 2848 | sm_info->min_fsync_blocks = DEF_MIN_FSYNC_BLOCKS; |
2628 | 2849 | ||
2629 | INIT_LIST_HEAD(&sm_info->discard_list); | ||
2630 | INIT_LIST_HEAD(&sm_info->wait_list); | ||
2631 | sm_info->nr_discards = 0; | ||
2632 | sm_info->max_discards = 0; | ||
2633 | |||
2634 | sm_info->trim_sections = DEF_BATCHED_TRIM_SECTIONS; | 2850 | sm_info->trim_sections = DEF_BATCHED_TRIM_SECTIONS; |
2635 | 2851 | ||
2636 | INIT_LIST_HEAD(&sm_info->sit_entry_set); | 2852 | INIT_LIST_HEAD(&sm_info->sit_entry_set); |
@@ -2641,6 +2857,10 @@ int build_segment_manager(struct f2fs_sb_info *sbi) | |||
2641 | return err; | 2857 | return err; |
2642 | } | 2858 | } |
2643 | 2859 | ||
2860 | err = create_discard_cmd_control(sbi); | ||
2861 | if (err) | ||
2862 | return err; | ||
2863 | |||
2644 | err = build_sit_info(sbi); | 2864 | err = build_sit_info(sbi); |
2645 | if (err) | 2865 | if (err) |
2646 | return err; | 2866 | return err; |
@@ -2734,6 +2954,9 @@ static void destroy_sit_info(struct f2fs_sb_info *sbi) | |||
2734 | if (sit_i->sentries) { | 2954 | if (sit_i->sentries) { |
2735 | for (start = 0; start < MAIN_SEGS(sbi); start++) { | 2955 | for (start = 0; start < MAIN_SEGS(sbi); start++) { |
2736 | kfree(sit_i->sentries[start].cur_valid_map); | 2956 | kfree(sit_i->sentries[start].cur_valid_map); |
2957 | #ifdef CONFIG_F2FS_CHECK_FS | ||
2958 | kfree(sit_i->sentries[start].cur_valid_map_mir); | ||
2959 | #endif | ||
2737 | kfree(sit_i->sentries[start].ckpt_valid_map); | 2960 | kfree(sit_i->sentries[start].ckpt_valid_map); |
2738 | kfree(sit_i->sentries[start].discard_map); | 2961 | kfree(sit_i->sentries[start].discard_map); |
2739 | } | 2962 | } |
@@ -2746,6 +2969,9 @@ static void destroy_sit_info(struct f2fs_sb_info *sbi) | |||
2746 | 2969 | ||
2747 | SM_I(sbi)->sit_info = NULL; | 2970 | SM_I(sbi)->sit_info = NULL; |
2748 | kfree(sit_i->sit_bitmap); | 2971 | kfree(sit_i->sit_bitmap); |
2972 | #ifdef CONFIG_F2FS_CHECK_FS | ||
2973 | kfree(sit_i->sit_bitmap_mir); | ||
2974 | #endif | ||
2749 | kfree(sit_i); | 2975 | kfree(sit_i); |
2750 | } | 2976 | } |
2751 | 2977 | ||
@@ -2756,6 +2982,7 @@ void destroy_segment_manager(struct f2fs_sb_info *sbi) | |||
2756 | if (!sm_info) | 2982 | if (!sm_info) |
2757 | return; | 2983 | return; |
2758 | destroy_flush_cmd_control(sbi, true); | 2984 | destroy_flush_cmd_control(sbi, true); |
2985 | destroy_discard_cmd_control(sbi, true); | ||
2759 | destroy_dirty_segmap(sbi); | 2986 | destroy_dirty_segmap(sbi); |
2760 | destroy_curseg(sbi); | 2987 | destroy_curseg(sbi); |
2761 | destroy_free_segmap(sbi); | 2988 | destroy_free_segmap(sbi); |
@@ -2771,15 +2998,15 @@ int __init create_segment_manager_caches(void) | |||
2771 | if (!discard_entry_slab) | 2998 | if (!discard_entry_slab) |
2772 | goto fail; | 2999 | goto fail; |
2773 | 3000 | ||
2774 | bio_entry_slab = f2fs_kmem_cache_create("bio_entry", | 3001 | discard_cmd_slab = f2fs_kmem_cache_create("discard_cmd", |
2775 | sizeof(struct bio_entry)); | 3002 | sizeof(struct discard_cmd)); |
2776 | if (!bio_entry_slab) | 3003 | if (!discard_cmd_slab) |
2777 | goto destroy_discard_entry; | 3004 | goto destroy_discard_entry; |
2778 | 3005 | ||
2779 | sit_entry_set_slab = f2fs_kmem_cache_create("sit_entry_set", | 3006 | sit_entry_set_slab = f2fs_kmem_cache_create("sit_entry_set", |
2780 | sizeof(struct sit_entry_set)); | 3007 | sizeof(struct sit_entry_set)); |
2781 | if (!sit_entry_set_slab) | 3008 | if (!sit_entry_set_slab) |
2782 | goto destroy_bio_entry; | 3009 | goto destroy_discard_cmd; |
2783 | 3010 | ||
2784 | inmem_entry_slab = f2fs_kmem_cache_create("inmem_page_entry", | 3011 | inmem_entry_slab = f2fs_kmem_cache_create("inmem_page_entry", |
2785 | sizeof(struct inmem_pages)); | 3012 | sizeof(struct inmem_pages)); |
@@ -2789,8 +3016,8 @@ int __init create_segment_manager_caches(void) | |||
2789 | 3016 | ||
2790 | destroy_sit_entry_set: | 3017 | destroy_sit_entry_set: |
2791 | kmem_cache_destroy(sit_entry_set_slab); | 3018 | kmem_cache_destroy(sit_entry_set_slab); |
2792 | destroy_bio_entry: | 3019 | destroy_discard_cmd: |
2793 | kmem_cache_destroy(bio_entry_slab); | 3020 | kmem_cache_destroy(discard_cmd_slab); |
2794 | destroy_discard_entry: | 3021 | destroy_discard_entry: |
2795 | kmem_cache_destroy(discard_entry_slab); | 3022 | kmem_cache_destroy(discard_entry_slab); |
2796 | fail: | 3023 | fail: |
@@ -2800,7 +3027,7 @@ fail: | |||
2800 | void destroy_segment_manager_caches(void) | 3027 | void destroy_segment_manager_caches(void) |
2801 | { | 3028 | { |
2802 | kmem_cache_destroy(sit_entry_set_slab); | 3029 | kmem_cache_destroy(sit_entry_set_slab); |
2803 | kmem_cache_destroy(bio_entry_slab); | 3030 | kmem_cache_destroy(discard_cmd_slab); |
2804 | kmem_cache_destroy(discard_entry_slab); | 3031 | kmem_cache_destroy(discard_entry_slab); |
2805 | kmem_cache_destroy(inmem_entry_slab); | 3032 | kmem_cache_destroy(inmem_entry_slab); |
2806 | } | 3033 | } |
diff --git a/fs/f2fs/segment.h b/fs/f2fs/segment.h index 9d44ce83acb2..5e8ad4280a50 100644 --- a/fs/f2fs/segment.h +++ b/fs/f2fs/segment.h | |||
@@ -164,6 +164,9 @@ struct seg_entry { | |||
164 | unsigned int ckpt_valid_blocks:10; /* # of valid blocks last cp */ | 164 | unsigned int ckpt_valid_blocks:10; /* # of valid blocks last cp */ |
165 | unsigned int padding:6; /* padding */ | 165 | unsigned int padding:6; /* padding */ |
166 | unsigned char *cur_valid_map; /* validity bitmap of blocks */ | 166 | unsigned char *cur_valid_map; /* validity bitmap of blocks */ |
167 | #ifdef CONFIG_F2FS_CHECK_FS | ||
168 | unsigned char *cur_valid_map_mir; /* mirror of current valid bitmap */ | ||
169 | #endif | ||
167 | /* | 170 | /* |
168 | * # of valid blocks and the validity bitmap stored in the the last | 171 | * # of valid blocks and the validity bitmap stored in the the last |
169 | * checkpoint pack. This information is used by the SSR mode. | 172 | * checkpoint pack. This information is used by the SSR mode. |
@@ -186,9 +189,12 @@ struct segment_allocation { | |||
186 | * the page is atomically written, and it is in inmem_pages list. | 189 | * the page is atomically written, and it is in inmem_pages list. |
187 | */ | 190 | */ |
188 | #define ATOMIC_WRITTEN_PAGE ((unsigned long)-1) | 191 | #define ATOMIC_WRITTEN_PAGE ((unsigned long)-1) |
192 | #define DUMMY_WRITTEN_PAGE ((unsigned long)-2) | ||
189 | 193 | ||
190 | #define IS_ATOMIC_WRITTEN_PAGE(page) \ | 194 | #define IS_ATOMIC_WRITTEN_PAGE(page) \ |
191 | (page_private(page) == (unsigned long)ATOMIC_WRITTEN_PAGE) | 195 | (page_private(page) == (unsigned long)ATOMIC_WRITTEN_PAGE) |
196 | #define IS_DUMMY_WRITTEN_PAGE(page) \ | ||
197 | (page_private(page) == (unsigned long)DUMMY_WRITTEN_PAGE) | ||
192 | 198 | ||
193 | struct inmem_pages { | 199 | struct inmem_pages { |
194 | struct list_head list; | 200 | struct list_head list; |
@@ -203,6 +209,9 @@ struct sit_info { | |||
203 | block_t sit_blocks; /* # of blocks used by SIT area */ | 209 | block_t sit_blocks; /* # of blocks used by SIT area */ |
204 | block_t written_valid_blocks; /* # of valid blocks in main area */ | 210 | block_t written_valid_blocks; /* # of valid blocks in main area */ |
205 | char *sit_bitmap; /* SIT bitmap pointer */ | 211 | char *sit_bitmap; /* SIT bitmap pointer */ |
212 | #ifdef CONFIG_F2FS_CHECK_FS | ||
213 | char *sit_bitmap_mir; /* SIT bitmap mirror */ | ||
214 | #endif | ||
206 | unsigned int bitmap_size; /* SIT bitmap size */ | 215 | unsigned int bitmap_size; /* SIT bitmap size */ |
207 | 216 | ||
208 | unsigned long *tmp_map; /* bitmap for temporal use */ | 217 | unsigned long *tmp_map; /* bitmap for temporal use */ |
@@ -317,6 +326,9 @@ static inline void seg_info_from_raw_sit(struct seg_entry *se, | |||
317 | se->ckpt_valid_blocks = GET_SIT_VBLOCKS(rs); | 326 | se->ckpt_valid_blocks = GET_SIT_VBLOCKS(rs); |
318 | memcpy(se->cur_valid_map, rs->valid_map, SIT_VBLOCK_MAP_SIZE); | 327 | memcpy(se->cur_valid_map, rs->valid_map, SIT_VBLOCK_MAP_SIZE); |
319 | memcpy(se->ckpt_valid_map, rs->valid_map, SIT_VBLOCK_MAP_SIZE); | 328 | memcpy(se->ckpt_valid_map, rs->valid_map, SIT_VBLOCK_MAP_SIZE); |
329 | #ifdef CONFIG_F2FS_CHECK_FS | ||
330 | memcpy(se->cur_valid_map_mir, rs->valid_map, SIT_VBLOCK_MAP_SIZE); | ||
331 | #endif | ||
320 | se->type = GET_SIT_TYPE(rs); | 332 | se->type = GET_SIT_TYPE(rs); |
321 | se->mtime = le64_to_cpu(rs->mtime); | 333 | se->mtime = le64_to_cpu(rs->mtime); |
322 | } | 334 | } |
@@ -414,6 +426,12 @@ static inline void get_sit_bitmap(struct f2fs_sb_info *sbi, | |||
414 | void *dst_addr) | 426 | void *dst_addr) |
415 | { | 427 | { |
416 | struct sit_info *sit_i = SIT_I(sbi); | 428 | struct sit_info *sit_i = SIT_I(sbi); |
429 | |||
430 | #ifdef CONFIG_F2FS_CHECK_FS | ||
431 | if (memcmp(sit_i->sit_bitmap, sit_i->sit_bitmap_mir, | ||
432 | sit_i->bitmap_size)) | ||
433 | f2fs_bug_on(sbi, 1); | ||
434 | #endif | ||
417 | memcpy(dst_addr, sit_i->sit_bitmap, sit_i->bitmap_size); | 435 | memcpy(dst_addr, sit_i->sit_bitmap, sit_i->bitmap_size); |
418 | } | 436 | } |
419 | 437 | ||
@@ -634,6 +652,12 @@ static inline pgoff_t current_sit_addr(struct f2fs_sb_info *sbi, | |||
634 | 652 | ||
635 | check_seg_range(sbi, start); | 653 | check_seg_range(sbi, start); |
636 | 654 | ||
655 | #ifdef CONFIG_F2FS_CHECK_FS | ||
656 | if (f2fs_test_bit(offset, sit_i->sit_bitmap) != | ||
657 | f2fs_test_bit(offset, sit_i->sit_bitmap_mir)) | ||
658 | f2fs_bug_on(sbi, 1); | ||
659 | #endif | ||
660 | |||
637 | /* calculate sit block address */ | 661 | /* calculate sit block address */ |
638 | if (f2fs_test_bit(offset, sit_i->sit_bitmap)) | 662 | if (f2fs_test_bit(offset, sit_i->sit_bitmap)) |
639 | blk_addr += sit_i->sit_blocks; | 663 | blk_addr += sit_i->sit_blocks; |
@@ -659,6 +683,9 @@ static inline void set_to_next_sit(struct sit_info *sit_i, unsigned int start) | |||
659 | unsigned int block_off = SIT_BLOCK_OFFSET(start); | 683 | unsigned int block_off = SIT_BLOCK_OFFSET(start); |
660 | 684 | ||
661 | f2fs_change_bit(block_off, sit_i->sit_bitmap); | 685 | f2fs_change_bit(block_off, sit_i->sit_bitmap); |
686 | #ifdef CONFIG_F2FS_CHECK_FS | ||
687 | f2fs_change_bit(block_off, sit_i->sit_bitmap_mir); | ||
688 | #endif | ||
662 | } | 689 | } |
663 | 690 | ||
664 | static inline unsigned long long get_mtime(struct f2fs_sb_info *sbi) | 691 | static inline unsigned long long get_mtime(struct f2fs_sb_info *sbi) |
@@ -689,6 +716,15 @@ static inline block_t sum_blk_addr(struct f2fs_sb_info *sbi, int base, int type) | |||
689 | - (base + 1) + type; | 716 | - (base + 1) + type; |
690 | } | 717 | } |
691 | 718 | ||
719 | static inline bool no_fggc_candidate(struct f2fs_sb_info *sbi, | ||
720 | unsigned int secno) | ||
721 | { | ||
722 | if (get_valid_blocks(sbi, secno, sbi->segs_per_sec) >= | ||
723 | sbi->fggc_threshold) | ||
724 | return true; | ||
725 | return false; | ||
726 | } | ||
727 | |||
692 | static inline bool sec_usage_check(struct f2fs_sb_info *sbi, unsigned int secno) | 728 | static inline bool sec_usage_check(struct f2fs_sb_info *sbi, unsigned int secno) |
693 | { | 729 | { |
694 | if (IS_CURSEC(sbi, secno) || (sbi->cur_victim_sec == secno)) | 730 | if (IS_CURSEC(sbi, secno) || (sbi->cur_victim_sec == secno)) |
@@ -700,8 +736,8 @@ static inline bool sec_usage_check(struct f2fs_sb_info *sbi, unsigned int secno) | |||
700 | * It is very important to gather dirty pages and write at once, so that we can | 736 | * It is very important to gather dirty pages and write at once, so that we can |
701 | * submit a big bio without interfering other data writes. | 737 | * submit a big bio without interfering other data writes. |
702 | * By default, 512 pages for directory data, | 738 | * By default, 512 pages for directory data, |
703 | * 512 pages (2MB) * 3 for three types of nodes, and | 739 | * 512 pages (2MB) * 8 for nodes, and |
704 | * max_bio_blocks for meta are set. | 740 | * 256 pages * 8 for meta are set. |
705 | */ | 741 | */ |
706 | static inline int nr_pages_to_skip(struct f2fs_sb_info *sbi, int type) | 742 | static inline int nr_pages_to_skip(struct f2fs_sb_info *sbi, int type) |
707 | { | 743 | { |
diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c index a831303bb777..96fe8ed73100 100644 --- a/fs/f2fs/super.c +++ b/fs/f2fs/super.c | |||
@@ -89,6 +89,7 @@ enum { | |||
89 | Opt_active_logs, | 89 | Opt_active_logs, |
90 | Opt_disable_ext_identify, | 90 | Opt_disable_ext_identify, |
91 | Opt_inline_xattr, | 91 | Opt_inline_xattr, |
92 | Opt_noinline_xattr, | ||
92 | Opt_inline_data, | 93 | Opt_inline_data, |
93 | Opt_inline_dentry, | 94 | Opt_inline_dentry, |
94 | Opt_noinline_dentry, | 95 | Opt_noinline_dentry, |
@@ -101,6 +102,7 @@ enum { | |||
101 | Opt_noinline_data, | 102 | Opt_noinline_data, |
102 | Opt_data_flush, | 103 | Opt_data_flush, |
103 | Opt_mode, | 104 | Opt_mode, |
105 | Opt_io_size_bits, | ||
104 | Opt_fault_injection, | 106 | Opt_fault_injection, |
105 | Opt_lazytime, | 107 | Opt_lazytime, |
106 | Opt_nolazytime, | 108 | Opt_nolazytime, |
@@ -121,6 +123,7 @@ static match_table_t f2fs_tokens = { | |||
121 | {Opt_active_logs, "active_logs=%u"}, | 123 | {Opt_active_logs, "active_logs=%u"}, |
122 | {Opt_disable_ext_identify, "disable_ext_identify"}, | 124 | {Opt_disable_ext_identify, "disable_ext_identify"}, |
123 | {Opt_inline_xattr, "inline_xattr"}, | 125 | {Opt_inline_xattr, "inline_xattr"}, |
126 | {Opt_noinline_xattr, "noinline_xattr"}, | ||
124 | {Opt_inline_data, "inline_data"}, | 127 | {Opt_inline_data, "inline_data"}, |
125 | {Opt_inline_dentry, "inline_dentry"}, | 128 | {Opt_inline_dentry, "inline_dentry"}, |
126 | {Opt_noinline_dentry, "noinline_dentry"}, | 129 | {Opt_noinline_dentry, "noinline_dentry"}, |
@@ -133,6 +136,7 @@ static match_table_t f2fs_tokens = { | |||
133 | {Opt_noinline_data, "noinline_data"}, | 136 | {Opt_noinline_data, "noinline_data"}, |
134 | {Opt_data_flush, "data_flush"}, | 137 | {Opt_data_flush, "data_flush"}, |
135 | {Opt_mode, "mode=%s"}, | 138 | {Opt_mode, "mode=%s"}, |
139 | {Opt_io_size_bits, "io_bits=%u"}, | ||
136 | {Opt_fault_injection, "fault_injection=%u"}, | 140 | {Opt_fault_injection, "fault_injection=%u"}, |
137 | {Opt_lazytime, "lazytime"}, | 141 | {Opt_lazytime, "lazytime"}, |
138 | {Opt_nolazytime, "nolazytime"}, | 142 | {Opt_nolazytime, "nolazytime"}, |
@@ -143,6 +147,7 @@ static match_table_t f2fs_tokens = { | |||
143 | enum { | 147 | enum { |
144 | GC_THREAD, /* struct f2fs_gc_thread */ | 148 | GC_THREAD, /* struct f2fs_gc_thread */ |
145 | SM_INFO, /* struct f2fs_sm_info */ | 149 | SM_INFO, /* struct f2fs_sm_info */ |
150 | DCC_INFO, /* struct discard_cmd_control */ | ||
146 | NM_INFO, /* struct f2fs_nm_info */ | 151 | NM_INFO, /* struct f2fs_nm_info */ |
147 | F2FS_SBI, /* struct f2fs_sb_info */ | 152 | F2FS_SBI, /* struct f2fs_sb_info */ |
148 | #ifdef CONFIG_F2FS_FAULT_INJECTION | 153 | #ifdef CONFIG_F2FS_FAULT_INJECTION |
@@ -166,6 +171,8 @@ static unsigned char *__struct_ptr(struct f2fs_sb_info *sbi, int struct_type) | |||
166 | return (unsigned char *)sbi->gc_thread; | 171 | return (unsigned char *)sbi->gc_thread; |
167 | else if (struct_type == SM_INFO) | 172 | else if (struct_type == SM_INFO) |
168 | return (unsigned char *)SM_I(sbi); | 173 | return (unsigned char *)SM_I(sbi); |
174 | else if (struct_type == DCC_INFO) | ||
175 | return (unsigned char *)SM_I(sbi)->dcc_info; | ||
169 | else if (struct_type == NM_INFO) | 176 | else if (struct_type == NM_INFO) |
170 | return (unsigned char *)NM_I(sbi); | 177 | return (unsigned char *)NM_I(sbi); |
171 | else if (struct_type == F2FS_SBI) | 178 | else if (struct_type == F2FS_SBI) |
@@ -281,7 +288,7 @@ F2FS_RW_ATTR(GC_THREAD, f2fs_gc_kthread, gc_max_sleep_time, max_sleep_time); | |||
281 | F2FS_RW_ATTR(GC_THREAD, f2fs_gc_kthread, gc_no_gc_sleep_time, no_gc_sleep_time); | 288 | F2FS_RW_ATTR(GC_THREAD, f2fs_gc_kthread, gc_no_gc_sleep_time, no_gc_sleep_time); |
282 | F2FS_RW_ATTR(GC_THREAD, f2fs_gc_kthread, gc_idle, gc_idle); | 289 | F2FS_RW_ATTR(GC_THREAD, f2fs_gc_kthread, gc_idle, gc_idle); |
283 | F2FS_RW_ATTR(SM_INFO, f2fs_sm_info, reclaim_segments, rec_prefree_segments); | 290 | F2FS_RW_ATTR(SM_INFO, f2fs_sm_info, reclaim_segments, rec_prefree_segments); |
284 | F2FS_RW_ATTR(SM_INFO, f2fs_sm_info, max_small_discards, max_discards); | 291 | F2FS_RW_ATTR(DCC_INFO, discard_cmd_control, max_small_discards, max_discards); |
285 | F2FS_RW_ATTR(SM_INFO, f2fs_sm_info, batched_trim_sections, trim_sections); | 292 | F2FS_RW_ATTR(SM_INFO, f2fs_sm_info, batched_trim_sections, trim_sections); |
286 | F2FS_RW_ATTR(SM_INFO, f2fs_sm_info, ipu_policy, ipu_policy); | 293 | F2FS_RW_ATTR(SM_INFO, f2fs_sm_info, ipu_policy, ipu_policy); |
287 | F2FS_RW_ATTR(SM_INFO, f2fs_sm_info, min_ipu_util, min_ipu_util); | 294 | F2FS_RW_ATTR(SM_INFO, f2fs_sm_info, min_ipu_util, min_ipu_util); |
@@ -439,6 +446,9 @@ static int parse_options(struct super_block *sb, char *options) | |||
439 | case Opt_inline_xattr: | 446 | case Opt_inline_xattr: |
440 | set_opt(sbi, INLINE_XATTR); | 447 | set_opt(sbi, INLINE_XATTR); |
441 | break; | 448 | break; |
449 | case Opt_noinline_xattr: | ||
450 | clear_opt(sbi, INLINE_XATTR); | ||
451 | break; | ||
442 | #else | 452 | #else |
443 | case Opt_user_xattr: | 453 | case Opt_user_xattr: |
444 | f2fs_msg(sb, KERN_INFO, | 454 | f2fs_msg(sb, KERN_INFO, |
@@ -452,6 +462,10 @@ static int parse_options(struct super_block *sb, char *options) | |||
452 | f2fs_msg(sb, KERN_INFO, | 462 | f2fs_msg(sb, KERN_INFO, |
453 | "inline_xattr options not supported"); | 463 | "inline_xattr options not supported"); |
454 | break; | 464 | break; |
465 | case Opt_noinline_xattr: | ||
466 | f2fs_msg(sb, KERN_INFO, | ||
467 | "noinline_xattr options not supported"); | ||
468 | break; | ||
455 | #endif | 469 | #endif |
456 | #ifdef CONFIG_F2FS_FS_POSIX_ACL | 470 | #ifdef CONFIG_F2FS_FS_POSIX_ACL |
457 | case Opt_acl: | 471 | case Opt_acl: |
@@ -535,11 +549,23 @@ static int parse_options(struct super_block *sb, char *options) | |||
535 | } | 549 | } |
536 | kfree(name); | 550 | kfree(name); |
537 | break; | 551 | break; |
552 | case Opt_io_size_bits: | ||
553 | if (args->from && match_int(args, &arg)) | ||
554 | return -EINVAL; | ||
555 | if (arg > __ilog2_u32(BIO_MAX_PAGES)) { | ||
556 | f2fs_msg(sb, KERN_WARNING, | ||
557 | "Not support %d, larger than %d", | ||
558 | 1 << arg, BIO_MAX_PAGES); | ||
559 | return -EINVAL; | ||
560 | } | ||
561 | sbi->write_io_size_bits = arg; | ||
562 | break; | ||
538 | case Opt_fault_injection: | 563 | case Opt_fault_injection: |
539 | if (args->from && match_int(args, &arg)) | 564 | if (args->from && match_int(args, &arg)) |
540 | return -EINVAL; | 565 | return -EINVAL; |
541 | #ifdef CONFIG_F2FS_FAULT_INJECTION | 566 | #ifdef CONFIG_F2FS_FAULT_INJECTION |
542 | f2fs_build_fault_attr(sbi, arg); | 567 | f2fs_build_fault_attr(sbi, arg); |
568 | set_opt(sbi, FAULT_INJECTION); | ||
543 | #else | 569 | #else |
544 | f2fs_msg(sb, KERN_INFO, | 570 | f2fs_msg(sb, KERN_INFO, |
545 | "FAULT_INJECTION was not selected"); | 571 | "FAULT_INJECTION was not selected"); |
@@ -558,6 +584,13 @@ static int parse_options(struct super_block *sb, char *options) | |||
558 | return -EINVAL; | 584 | return -EINVAL; |
559 | } | 585 | } |
560 | } | 586 | } |
587 | |||
588 | if (F2FS_IO_SIZE_BITS(sbi) && !test_opt(sbi, LFS)) { | ||
589 | f2fs_msg(sb, KERN_ERR, | ||
590 | "Should set mode=lfs with %uKB-sized IO", | ||
591 | F2FS_IO_SIZE_KB(sbi)); | ||
592 | return -EINVAL; | ||
593 | } | ||
561 | return 0; | 594 | return 0; |
562 | } | 595 | } |
563 | 596 | ||
@@ -591,6 +624,7 @@ static struct inode *f2fs_alloc_inode(struct super_block *sb) | |||
591 | 624 | ||
592 | static int f2fs_drop_inode(struct inode *inode) | 625 | static int f2fs_drop_inode(struct inode *inode) |
593 | { | 626 | { |
627 | int ret; | ||
594 | /* | 628 | /* |
595 | * This is to avoid a deadlock condition like below. | 629 | * This is to avoid a deadlock condition like below. |
596 | * writeback_single_inode(inode) | 630 | * writeback_single_inode(inode) |
@@ -623,10 +657,12 @@ static int f2fs_drop_inode(struct inode *inode) | |||
623 | spin_lock(&inode->i_lock); | 657 | spin_lock(&inode->i_lock); |
624 | atomic_dec(&inode->i_count); | 658 | atomic_dec(&inode->i_count); |
625 | } | 659 | } |
660 | trace_f2fs_drop_inode(inode, 0); | ||
626 | return 0; | 661 | return 0; |
627 | } | 662 | } |
628 | 663 | ret = generic_drop_inode(inode); | |
629 | return generic_drop_inode(inode); | 664 | trace_f2fs_drop_inode(inode, ret); |
665 | return ret; | ||
630 | } | 666 | } |
631 | 667 | ||
632 | int f2fs_inode_dirtied(struct inode *inode, bool sync) | 668 | int f2fs_inode_dirtied(struct inode *inode, bool sync) |
@@ -750,6 +786,9 @@ static void f2fs_put_super(struct super_block *sb) | |||
750 | write_checkpoint(sbi, &cpc); | 786 | write_checkpoint(sbi, &cpc); |
751 | } | 787 | } |
752 | 788 | ||
789 | /* be sure to wait for any on-going discard commands */ | ||
790 | f2fs_wait_discard_bio(sbi, NULL_ADDR); | ||
791 | |||
753 | /* write_checkpoint can update stat informaion */ | 792 | /* write_checkpoint can update stat informaion */ |
754 | f2fs_destroy_stats(sbi); | 793 | f2fs_destroy_stats(sbi); |
755 | 794 | ||
@@ -782,7 +821,7 @@ static void f2fs_put_super(struct super_block *sb) | |||
782 | kfree(sbi->raw_super); | 821 | kfree(sbi->raw_super); |
783 | 822 | ||
784 | destroy_device_list(sbi); | 823 | destroy_device_list(sbi); |
785 | 824 | mempool_destroy(sbi->write_io_dummy); | |
786 | destroy_percpu_info(sbi); | 825 | destroy_percpu_info(sbi); |
787 | kfree(sbi); | 826 | kfree(sbi); |
788 | } | 827 | } |
@@ -882,6 +921,8 @@ static int f2fs_show_options(struct seq_file *seq, struct dentry *root) | |||
882 | seq_puts(seq, ",nouser_xattr"); | 921 | seq_puts(seq, ",nouser_xattr"); |
883 | if (test_opt(sbi, INLINE_XATTR)) | 922 | if (test_opt(sbi, INLINE_XATTR)) |
884 | seq_puts(seq, ",inline_xattr"); | 923 | seq_puts(seq, ",inline_xattr"); |
924 | else | ||
925 | seq_puts(seq, ",noinline_xattr"); | ||
885 | #endif | 926 | #endif |
886 | #ifdef CONFIG_F2FS_FS_POSIX_ACL | 927 | #ifdef CONFIG_F2FS_FS_POSIX_ACL |
887 | if (test_opt(sbi, POSIX_ACL)) | 928 | if (test_opt(sbi, POSIX_ACL)) |
@@ -918,6 +959,12 @@ static int f2fs_show_options(struct seq_file *seq, struct dentry *root) | |||
918 | else if (test_opt(sbi, LFS)) | 959 | else if (test_opt(sbi, LFS)) |
919 | seq_puts(seq, "lfs"); | 960 | seq_puts(seq, "lfs"); |
920 | seq_printf(seq, ",active_logs=%u", sbi->active_logs); | 961 | seq_printf(seq, ",active_logs=%u", sbi->active_logs); |
962 | if (F2FS_IO_SIZE_BITS(sbi)) | ||
963 | seq_printf(seq, ",io_size=%uKB", F2FS_IO_SIZE_KB(sbi)); | ||
964 | #ifdef CONFIG_F2FS_FAULT_INJECTION | ||
965 | if (test_opt(sbi, FAULT_INJECTION)) | ||
966 | seq_puts(seq, ",fault_injection"); | ||
967 | #endif | ||
921 | 968 | ||
922 | return 0; | 969 | return 0; |
923 | } | 970 | } |
@@ -995,6 +1042,7 @@ static void default_options(struct f2fs_sb_info *sbi) | |||
995 | sbi->active_logs = NR_CURSEG_TYPE; | 1042 | sbi->active_logs = NR_CURSEG_TYPE; |
996 | 1043 | ||
997 | set_opt(sbi, BG_GC); | 1044 | set_opt(sbi, BG_GC); |
1045 | set_opt(sbi, INLINE_XATTR); | ||
998 | set_opt(sbi, INLINE_DATA); | 1046 | set_opt(sbi, INLINE_DATA); |
999 | set_opt(sbi, INLINE_DENTRY); | 1047 | set_opt(sbi, INLINE_DENTRY); |
1000 | set_opt(sbi, EXTENT_CACHE); | 1048 | set_opt(sbi, EXTENT_CACHE); |
@@ -1686,36 +1734,55 @@ int f2fs_commit_super(struct f2fs_sb_info *sbi, bool recover) | |||
1686 | static int f2fs_scan_devices(struct f2fs_sb_info *sbi) | 1734 | static int f2fs_scan_devices(struct f2fs_sb_info *sbi) |
1687 | { | 1735 | { |
1688 | struct f2fs_super_block *raw_super = F2FS_RAW_SUPER(sbi); | 1736 | struct f2fs_super_block *raw_super = F2FS_RAW_SUPER(sbi); |
1737 | unsigned int max_devices = MAX_DEVICES; | ||
1689 | int i; | 1738 | int i; |
1690 | 1739 | ||
1691 | for (i = 0; i < MAX_DEVICES; i++) { | 1740 | /* Initialize single device information */ |
1692 | if (!RDEV(i).path[0]) | 1741 | if (!RDEV(0).path[0]) { |
1742 | if (!bdev_is_zoned(sbi->sb->s_bdev)) | ||
1693 | return 0; | 1743 | return 0; |
1744 | max_devices = 1; | ||
1745 | } | ||
1694 | 1746 | ||
1695 | if (i == 0) { | 1747 | /* |
1696 | sbi->devs = kzalloc(sizeof(struct f2fs_dev_info) * | 1748 | * Initialize multiple devices information, or single |
1697 | MAX_DEVICES, GFP_KERNEL); | 1749 | * zoned block device information. |
1698 | if (!sbi->devs) | 1750 | */ |
1699 | return -ENOMEM; | 1751 | sbi->devs = kcalloc(max_devices, sizeof(struct f2fs_dev_info), |
1700 | } | 1752 | GFP_KERNEL); |
1753 | if (!sbi->devs) | ||
1754 | return -ENOMEM; | ||
1701 | 1755 | ||
1702 | memcpy(FDEV(i).path, RDEV(i).path, MAX_PATH_LEN); | 1756 | for (i = 0; i < max_devices; i++) { |
1703 | FDEV(i).total_segments = le32_to_cpu(RDEV(i).total_segments); | ||
1704 | if (i == 0) { | ||
1705 | FDEV(i).start_blk = 0; | ||
1706 | FDEV(i).end_blk = FDEV(i).start_blk + | ||
1707 | (FDEV(i).total_segments << | ||
1708 | sbi->log_blocks_per_seg) - 1 + | ||
1709 | le32_to_cpu(raw_super->segment0_blkaddr); | ||
1710 | } else { | ||
1711 | FDEV(i).start_blk = FDEV(i - 1).end_blk + 1; | ||
1712 | FDEV(i).end_blk = FDEV(i).start_blk + | ||
1713 | (FDEV(i).total_segments << | ||
1714 | sbi->log_blocks_per_seg) - 1; | ||
1715 | } | ||
1716 | 1757 | ||
1717 | FDEV(i).bdev = blkdev_get_by_path(FDEV(i).path, | 1758 | if (i > 0 && !RDEV(i).path[0]) |
1759 | break; | ||
1760 | |||
1761 | if (max_devices == 1) { | ||
1762 | /* Single zoned block device mount */ | ||
1763 | FDEV(0).bdev = | ||
1764 | blkdev_get_by_dev(sbi->sb->s_bdev->bd_dev, | ||
1765 | sbi->sb->s_mode, sbi->sb->s_type); | ||
1766 | } else { | ||
1767 | /* Multi-device mount */ | ||
1768 | memcpy(FDEV(i).path, RDEV(i).path, MAX_PATH_LEN); | ||
1769 | FDEV(i).total_segments = | ||
1770 | le32_to_cpu(RDEV(i).total_segments); | ||
1771 | if (i == 0) { | ||
1772 | FDEV(i).start_blk = 0; | ||
1773 | FDEV(i).end_blk = FDEV(i).start_blk + | ||
1774 | (FDEV(i).total_segments << | ||
1775 | sbi->log_blocks_per_seg) - 1 + | ||
1776 | le32_to_cpu(raw_super->segment0_blkaddr); | ||
1777 | } else { | ||
1778 | FDEV(i).start_blk = FDEV(i - 1).end_blk + 1; | ||
1779 | FDEV(i).end_blk = FDEV(i).start_blk + | ||
1780 | (FDEV(i).total_segments << | ||
1781 | sbi->log_blocks_per_seg) - 1; | ||
1782 | } | ||
1783 | FDEV(i).bdev = blkdev_get_by_path(FDEV(i).path, | ||
1718 | sbi->sb->s_mode, sbi->sb->s_type); | 1784 | sbi->sb->s_mode, sbi->sb->s_type); |
1785 | } | ||
1719 | if (IS_ERR(FDEV(i).bdev)) | 1786 | if (IS_ERR(FDEV(i).bdev)) |
1720 | return PTR_ERR(FDEV(i).bdev); | 1787 | return PTR_ERR(FDEV(i).bdev); |
1721 | 1788 | ||
@@ -1735,6 +1802,8 @@ static int f2fs_scan_devices(struct f2fs_sb_info *sbi) | |||
1735 | "Failed to initialize F2FS blkzone information"); | 1802 | "Failed to initialize F2FS blkzone information"); |
1736 | return -EINVAL; | 1803 | return -EINVAL; |
1737 | } | 1804 | } |
1805 | if (max_devices == 1) | ||
1806 | break; | ||
1738 | f2fs_msg(sbi->sb, KERN_INFO, | 1807 | f2fs_msg(sbi->sb, KERN_INFO, |
1739 | "Mount Device [%2d]: %20s, %8u, %8x - %8x (zone: %s)", | 1808 | "Mount Device [%2d]: %20s, %8u, %8x - %8x (zone: %s)", |
1740 | i, FDEV(i).path, | 1809 | i, FDEV(i).path, |
@@ -1751,6 +1820,8 @@ static int f2fs_scan_devices(struct f2fs_sb_info *sbi) | |||
1751 | FDEV(i).total_segments, | 1820 | FDEV(i).total_segments, |
1752 | FDEV(i).start_blk, FDEV(i).end_blk); | 1821 | FDEV(i).start_blk, FDEV(i).end_blk); |
1753 | } | 1822 | } |
1823 | f2fs_msg(sbi->sb, KERN_INFO, | ||
1824 | "IO Block Size: %8d KB", F2FS_IO_SIZE_KB(sbi)); | ||
1754 | return 0; | 1825 | return 0; |
1755 | } | 1826 | } |
1756 | 1827 | ||
@@ -1868,12 +1939,19 @@ try_onemore: | |||
1868 | if (err) | 1939 | if (err) |
1869 | goto free_options; | 1940 | goto free_options; |
1870 | 1941 | ||
1942 | if (F2FS_IO_SIZE(sbi) > 1) { | ||
1943 | sbi->write_io_dummy = | ||
1944 | mempool_create_page_pool(2 * (F2FS_IO_SIZE(sbi) - 1), 0); | ||
1945 | if (!sbi->write_io_dummy) | ||
1946 | goto free_options; | ||
1947 | } | ||
1948 | |||
1871 | /* get an inode for meta space */ | 1949 | /* get an inode for meta space */ |
1872 | sbi->meta_inode = f2fs_iget(sb, F2FS_META_INO(sbi)); | 1950 | sbi->meta_inode = f2fs_iget(sb, F2FS_META_INO(sbi)); |
1873 | if (IS_ERR(sbi->meta_inode)) { | 1951 | if (IS_ERR(sbi->meta_inode)) { |
1874 | f2fs_msg(sb, KERN_ERR, "Failed to read F2FS meta data inode"); | 1952 | f2fs_msg(sb, KERN_ERR, "Failed to read F2FS meta data inode"); |
1875 | err = PTR_ERR(sbi->meta_inode); | 1953 | err = PTR_ERR(sbi->meta_inode); |
1876 | goto free_options; | 1954 | goto free_io_dummy; |
1877 | } | 1955 | } |
1878 | 1956 | ||
1879 | err = get_valid_checkpoint(sbi); | 1957 | err = get_valid_checkpoint(sbi); |
@@ -2048,6 +2126,8 @@ skip_recovery: | |||
2048 | sbi->valid_super_block ? 1 : 2, err); | 2126 | sbi->valid_super_block ? 1 : 2, err); |
2049 | } | 2127 | } |
2050 | 2128 | ||
2129 | f2fs_msg(sbi->sb, KERN_NOTICE, "Mounted with checkpoint version = %llx", | ||
2130 | cur_cp_version(F2FS_CKPT(sbi))); | ||
2051 | f2fs_update_time(sbi, CP_TIME); | 2131 | f2fs_update_time(sbi, CP_TIME); |
2052 | f2fs_update_time(sbi, REQ_TIME); | 2132 | f2fs_update_time(sbi, REQ_TIME); |
2053 | return 0; | 2133 | return 0; |
@@ -2091,6 +2171,8 @@ free_devices: | |||
2091 | free_meta_inode: | 2171 | free_meta_inode: |
2092 | make_bad_inode(sbi->meta_inode); | 2172 | make_bad_inode(sbi->meta_inode); |
2093 | iput(sbi->meta_inode); | 2173 | iput(sbi->meta_inode); |
2174 | free_io_dummy: | ||
2175 | mempool_destroy(sbi->write_io_dummy); | ||
2094 | free_options: | 2176 | free_options: |
2095 | destroy_percpu_info(sbi); | 2177 | destroy_percpu_info(sbi); |
2096 | kfree(options); | 2178 | kfree(options); |
diff --git a/fs/f2fs/xattr.c b/fs/f2fs/xattr.c index c47ce2f330a1..7298a4488f7f 100644 --- a/fs/f2fs/xattr.c +++ b/fs/f2fs/xattr.c | |||
@@ -217,6 +217,112 @@ static struct f2fs_xattr_entry *__find_xattr(void *base_addr, int index, | |||
217 | return entry; | 217 | return entry; |
218 | } | 218 | } |
219 | 219 | ||
220 | static struct f2fs_xattr_entry *__find_inline_xattr(void *base_addr, | ||
221 | void **last_addr, int index, | ||
222 | size_t len, const char *name) | ||
223 | { | ||
224 | struct f2fs_xattr_entry *entry; | ||
225 | unsigned int inline_size = F2FS_INLINE_XATTR_ADDRS << 2; | ||
226 | |||
227 | list_for_each_xattr(entry, base_addr) { | ||
228 | if ((void *)entry + sizeof(__u32) > base_addr + inline_size || | ||
229 | (void *)XATTR_NEXT_ENTRY(entry) + sizeof(__u32) > | ||
230 | base_addr + inline_size) { | ||
231 | *last_addr = entry; | ||
232 | return NULL; | ||
233 | } | ||
234 | if (entry->e_name_index != index) | ||
235 | continue; | ||
236 | if (entry->e_name_len != len) | ||
237 | continue; | ||
238 | if (!memcmp(entry->e_name, name, len)) | ||
239 | break; | ||
240 | } | ||
241 | return entry; | ||
242 | } | ||
243 | |||
244 | static int lookup_all_xattrs(struct inode *inode, struct page *ipage, | ||
245 | unsigned int index, unsigned int len, | ||
246 | const char *name, struct f2fs_xattr_entry **xe, | ||
247 | void **base_addr) | ||
248 | { | ||
249 | struct f2fs_sb_info *sbi = F2FS_I_SB(inode); | ||
250 | void *cur_addr, *txattr_addr, *last_addr = NULL; | ||
251 | nid_t xnid = F2FS_I(inode)->i_xattr_nid; | ||
252 | unsigned int size = xnid ? VALID_XATTR_BLOCK_SIZE : 0; | ||
253 | unsigned int inline_size = 0; | ||
254 | int err = 0; | ||
255 | |||
256 | inline_size = inline_xattr_size(inode); | ||
257 | |||
258 | if (!size && !inline_size) | ||
259 | return -ENODATA; | ||
260 | |||
261 | txattr_addr = kzalloc(inline_size + size + sizeof(__u32), | ||
262 | GFP_F2FS_ZERO); | ||
263 | if (!txattr_addr) | ||
264 | return -ENOMEM; | ||
265 | |||
266 | /* read from inline xattr */ | ||
267 | if (inline_size) { | ||
268 | struct page *page = NULL; | ||
269 | void *inline_addr; | ||
270 | |||
271 | if (ipage) { | ||
272 | inline_addr = inline_xattr_addr(ipage); | ||
273 | } else { | ||
274 | page = get_node_page(sbi, inode->i_ino); | ||
275 | if (IS_ERR(page)) { | ||
276 | err = PTR_ERR(page); | ||
277 | goto out; | ||
278 | } | ||
279 | inline_addr = inline_xattr_addr(page); | ||
280 | } | ||
281 | memcpy(txattr_addr, inline_addr, inline_size); | ||
282 | f2fs_put_page(page, 1); | ||
283 | |||
284 | *xe = __find_inline_xattr(txattr_addr, &last_addr, | ||
285 | index, len, name); | ||
286 | if (*xe) | ||
287 | goto check; | ||
288 | } | ||
289 | |||
290 | /* read from xattr node block */ | ||
291 | if (xnid) { | ||
292 | struct page *xpage; | ||
293 | void *xattr_addr; | ||
294 | |||
295 | /* The inode already has an extended attribute block. */ | ||
296 | xpage = get_node_page(sbi, xnid); | ||
297 | if (IS_ERR(xpage)) { | ||
298 | err = PTR_ERR(xpage); | ||
299 | goto out; | ||
300 | } | ||
301 | |||
302 | xattr_addr = page_address(xpage); | ||
303 | memcpy(txattr_addr + inline_size, xattr_addr, size); | ||
304 | f2fs_put_page(xpage, 1); | ||
305 | } | ||
306 | |||
307 | if (last_addr) | ||
308 | cur_addr = XATTR_HDR(last_addr) - 1; | ||
309 | else | ||
310 | cur_addr = txattr_addr; | ||
311 | |||
312 | *xe = __find_xattr(cur_addr, index, len, name); | ||
313 | check: | ||
314 | if (IS_XATTR_LAST_ENTRY(*xe)) { | ||
315 | err = -ENODATA; | ||
316 | goto out; | ||
317 | } | ||
318 | |||
319 | *base_addr = txattr_addr; | ||
320 | return 0; | ||
321 | out: | ||
322 | kzfree(txattr_addr); | ||
323 | return err; | ||
324 | } | ||
325 | |||
220 | static int read_all_xattrs(struct inode *inode, struct page *ipage, | 326 | static int read_all_xattrs(struct inode *inode, struct page *ipage, |
221 | void **base_addr) | 327 | void **base_addr) |
222 | { | 328 | { |
@@ -348,23 +454,20 @@ static inline int write_all_xattrs(struct inode *inode, __u32 hsize, | |||
348 | } | 454 | } |
349 | 455 | ||
350 | xattr_addr = page_address(xpage); | 456 | xattr_addr = page_address(xpage); |
351 | memcpy(xattr_addr, txattr_addr + inline_size, PAGE_SIZE - | 457 | memcpy(xattr_addr, txattr_addr + inline_size, MAX_XATTR_BLOCK_SIZE); |
352 | sizeof(struct node_footer)); | ||
353 | set_page_dirty(xpage); | 458 | set_page_dirty(xpage); |
354 | f2fs_put_page(xpage, 1); | 459 | f2fs_put_page(xpage, 1); |
355 | 460 | ||
356 | /* need to checkpoint during fsync */ | ||
357 | F2FS_I(inode)->xattr_ver = cur_cp_version(F2FS_CKPT(sbi)); | ||
358 | return 0; | 461 | return 0; |
359 | } | 462 | } |
360 | 463 | ||
361 | int f2fs_getxattr(struct inode *inode, int index, const char *name, | 464 | int f2fs_getxattr(struct inode *inode, int index, const char *name, |
362 | void *buffer, size_t buffer_size, struct page *ipage) | 465 | void *buffer, size_t buffer_size, struct page *ipage) |
363 | { | 466 | { |
364 | struct f2fs_xattr_entry *entry; | 467 | struct f2fs_xattr_entry *entry = NULL; |
365 | void *base_addr; | ||
366 | int error = 0; | 468 | int error = 0; |
367 | size_t size, len; | 469 | unsigned int size, len; |
470 | void *base_addr = NULL; | ||
368 | 471 | ||
369 | if (name == NULL) | 472 | if (name == NULL) |
370 | return -EINVAL; | 473 | return -EINVAL; |
@@ -373,21 +476,16 @@ int f2fs_getxattr(struct inode *inode, int index, const char *name, | |||
373 | if (len > F2FS_NAME_LEN) | 476 | if (len > F2FS_NAME_LEN) |
374 | return -ERANGE; | 477 | return -ERANGE; |
375 | 478 | ||
376 | error = read_all_xattrs(inode, ipage, &base_addr); | 479 | error = lookup_all_xattrs(inode, ipage, index, len, name, |
480 | &entry, &base_addr); | ||
377 | if (error) | 481 | if (error) |
378 | return error; | 482 | return error; |
379 | 483 | ||
380 | entry = __find_xattr(base_addr, index, len, name); | ||
381 | if (IS_XATTR_LAST_ENTRY(entry)) { | ||
382 | error = -ENODATA; | ||
383 | goto cleanup; | ||
384 | } | ||
385 | |||
386 | size = le16_to_cpu(entry->e_value_size); | 484 | size = le16_to_cpu(entry->e_value_size); |
387 | 485 | ||
388 | if (buffer && size > buffer_size) { | 486 | if (buffer && size > buffer_size) { |
389 | error = -ERANGE; | 487 | error = -ERANGE; |
390 | goto cleanup; | 488 | goto out; |
391 | } | 489 | } |
392 | 490 | ||
393 | if (buffer) { | 491 | if (buffer) { |
@@ -395,8 +493,7 @@ int f2fs_getxattr(struct inode *inode, int index, const char *name, | |||
395 | memcpy(buffer, pval, size); | 493 | memcpy(buffer, pval, size); |
396 | } | 494 | } |
397 | error = size; | 495 | error = size; |
398 | 496 | out: | |
399 | cleanup: | ||
400 | kzfree(base_addr); | 497 | kzfree(base_addr); |
401 | return error; | 498 | return error; |
402 | } | 499 | } |
@@ -445,6 +542,13 @@ cleanup: | |||
445 | return error; | 542 | return error; |
446 | } | 543 | } |
447 | 544 | ||
545 | static bool f2fs_xattr_value_same(struct f2fs_xattr_entry *entry, | ||
546 | const void *value, size_t size) | ||
547 | { | ||
548 | void *pval = entry->e_name + entry->e_name_len; | ||
549 | return (entry->e_value_size == size) && !memcmp(pval, value, size); | ||
550 | } | ||
551 | |||
448 | static int __f2fs_setxattr(struct inode *inode, int index, | 552 | static int __f2fs_setxattr(struct inode *inode, int index, |
449 | const char *name, const void *value, size_t size, | 553 | const char *name, const void *value, size_t size, |
450 | struct page *ipage, int flags) | 554 | struct page *ipage, int flags) |
@@ -479,12 +583,17 @@ static int __f2fs_setxattr(struct inode *inode, int index, | |||
479 | 583 | ||
480 | found = IS_XATTR_LAST_ENTRY(here) ? 0 : 1; | 584 | found = IS_XATTR_LAST_ENTRY(here) ? 0 : 1; |
481 | 585 | ||
482 | if ((flags & XATTR_REPLACE) && !found) { | 586 | if (found) { |
587 | if ((flags & XATTR_CREATE)) { | ||
588 | error = -EEXIST; | ||
589 | goto exit; | ||
590 | } | ||
591 | |||
592 | if (f2fs_xattr_value_same(here, value, size)) | ||
593 | goto exit; | ||
594 | } else if ((flags & XATTR_REPLACE)) { | ||
483 | error = -ENODATA; | 595 | error = -ENODATA; |
484 | goto exit; | 596 | goto exit; |
485 | } else if ((flags & XATTR_CREATE) && found) { | ||
486 | error = -EEXIST; | ||
487 | goto exit; | ||
488 | } | 597 | } |
489 | 598 | ||
490 | last = here; | 599 | last = here; |
diff --git a/fs/f2fs/xattr.h b/fs/f2fs/xattr.h index f990de20cdcd..d5a94928c116 100644 --- a/fs/f2fs/xattr.h +++ b/fs/f2fs/xattr.h | |||
@@ -72,9 +72,10 @@ struct f2fs_xattr_entry { | |||
72 | for (entry = XATTR_FIRST_ENTRY(addr);\ | 72 | for (entry = XATTR_FIRST_ENTRY(addr);\ |
73 | !IS_XATTR_LAST_ENTRY(entry);\ | 73 | !IS_XATTR_LAST_ENTRY(entry);\ |
74 | entry = XATTR_NEXT_ENTRY(entry)) | 74 | entry = XATTR_NEXT_ENTRY(entry)) |
75 | 75 | #define MAX_XATTR_BLOCK_SIZE (PAGE_SIZE - sizeof(struct node_footer)) | |
76 | #define MIN_OFFSET(i) XATTR_ALIGN(inline_xattr_size(i) + PAGE_SIZE - \ | 76 | #define VALID_XATTR_BLOCK_SIZE (MAX_XATTR_BLOCK_SIZE - sizeof(__u32)) |
77 | sizeof(struct node_footer) - sizeof(__u32)) | 77 | #define MIN_OFFSET(i) XATTR_ALIGN(inline_xattr_size(i) + \ |
78 | VALID_XATTR_BLOCK_SIZE) | ||
78 | 79 | ||
79 | #define MAX_VALUE_LEN(i) (MIN_OFFSET(i) - \ | 80 | #define MAX_VALUE_LEN(i) (MIN_OFFSET(i) - \ |
80 | sizeof(struct f2fs_xattr_header) - \ | 81 | sizeof(struct f2fs_xattr_header) - \ |
diff --git a/fs/nfs/cache_lib.c b/fs/nfs/cache_lib.c index 6de15709d024..2ae676f93e6b 100644 --- a/fs/nfs/cache_lib.c +++ b/fs/nfs/cache_lib.c | |||
@@ -141,8 +141,7 @@ int nfs_cache_register_net(struct net *net, struct cache_detail *cd) | |||
141 | 141 | ||
142 | void nfs_cache_unregister_sb(struct super_block *sb, struct cache_detail *cd) | 142 | void nfs_cache_unregister_sb(struct super_block *sb, struct cache_detail *cd) |
143 | { | 143 | { |
144 | if (cd->u.pipefs.dir) | 144 | sunrpc_cache_unregister_pipefs(cd); |
145 | sunrpc_cache_unregister_pipefs(cd); | ||
146 | } | 145 | } |
147 | 146 | ||
148 | void nfs_cache_unregister_net(struct net *net, struct cache_detail *cd) | 147 | void nfs_cache_unregister_net(struct net *net, struct cache_detail *cd) |
diff --git a/fs/nfs/callback_xdr.c b/fs/nfs/callback_xdr.c index fd0284c1dc32..d051fc3583a9 100644 --- a/fs/nfs/callback_xdr.c +++ b/fs/nfs/callback_xdr.c | |||
@@ -83,23 +83,15 @@ static __be32 *read_buf(struct xdr_stream *xdr, size_t nbytes) | |||
83 | return p; | 83 | return p; |
84 | } | 84 | } |
85 | 85 | ||
86 | static __be32 decode_string(struct xdr_stream *xdr, unsigned int *len, const char **str) | 86 | static __be32 decode_string(struct xdr_stream *xdr, unsigned int *len, |
87 | const char **str, size_t maxlen) | ||
87 | { | 88 | { |
88 | __be32 *p; | 89 | ssize_t err; |
89 | |||
90 | p = read_buf(xdr, 4); | ||
91 | if (unlikely(p == NULL)) | ||
92 | return htonl(NFS4ERR_RESOURCE); | ||
93 | *len = ntohl(*p); | ||
94 | |||
95 | if (*len != 0) { | ||
96 | p = read_buf(xdr, *len); | ||
97 | if (unlikely(p == NULL)) | ||
98 | return htonl(NFS4ERR_RESOURCE); | ||
99 | *str = (const char *)p; | ||
100 | } else | ||
101 | *str = NULL; | ||
102 | 90 | ||
91 | err = xdr_stream_decode_opaque_inline(xdr, (void **)str, maxlen); | ||
92 | if (err < 0) | ||
93 | return cpu_to_be32(NFS4ERR_RESOURCE); | ||
94 | *len = err; | ||
103 | return 0; | 95 | return 0; |
104 | } | 96 | } |
105 | 97 | ||
@@ -162,15 +154,9 @@ static __be32 decode_compound_hdr_arg(struct xdr_stream *xdr, struct cb_compound | |||
162 | __be32 *p; | 154 | __be32 *p; |
163 | __be32 status; | 155 | __be32 status; |
164 | 156 | ||
165 | status = decode_string(xdr, &hdr->taglen, &hdr->tag); | 157 | status = decode_string(xdr, &hdr->taglen, &hdr->tag, CB_OP_TAGLEN_MAXSZ); |
166 | if (unlikely(status != 0)) | 158 | if (unlikely(status != 0)) |
167 | return status; | 159 | return status; |
168 | /* We do not like overly long tags! */ | ||
169 | if (hdr->taglen > CB_OP_TAGLEN_MAXSZ) { | ||
170 | printk("NFS: NFSv4 CALLBACK %s: client sent tag of length %u\n", | ||
171 | __func__, hdr->taglen); | ||
172 | return htonl(NFS4ERR_RESOURCE); | ||
173 | } | ||
174 | p = read_buf(xdr, 12); | 160 | p = read_buf(xdr, 12); |
175 | if (unlikely(p == NULL)) | 161 | if (unlikely(p == NULL)) |
176 | return htonl(NFS4ERR_RESOURCE); | 162 | return htonl(NFS4ERR_RESOURCE); |
@@ -582,12 +568,8 @@ out: | |||
582 | 568 | ||
583 | static __be32 encode_string(struct xdr_stream *xdr, unsigned int len, const char *str) | 569 | static __be32 encode_string(struct xdr_stream *xdr, unsigned int len, const char *str) |
584 | { | 570 | { |
585 | __be32 *p; | 571 | if (unlikely(xdr_stream_encode_opaque(xdr, str, len) < 0)) |
586 | 572 | return cpu_to_be32(NFS4ERR_RESOURCE); | |
587 | p = xdr_reserve_space(xdr, 4 + len); | ||
588 | if (unlikely(p == NULL)) | ||
589 | return htonl(NFS4ERR_RESOURCE); | ||
590 | xdr_encode_opaque(p, str, len); | ||
591 | return 0; | 573 | return 0; |
592 | } | 574 | } |
593 | 575 | ||
diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c index fad81041f5ab..fb499a3f21b5 100644 --- a/fs/nfs/dir.c +++ b/fs/nfs/dir.c | |||
@@ -2002,6 +2002,29 @@ nfs_link(struct dentry *old_dentry, struct inode *dir, struct dentry *dentry) | |||
2002 | } | 2002 | } |
2003 | EXPORT_SYMBOL_GPL(nfs_link); | 2003 | EXPORT_SYMBOL_GPL(nfs_link); |
2004 | 2004 | ||
2005 | static void | ||
2006 | nfs_complete_rename(struct rpc_task *task, struct nfs_renamedata *data) | ||
2007 | { | ||
2008 | struct dentry *old_dentry = data->old_dentry; | ||
2009 | struct dentry *new_dentry = data->new_dentry; | ||
2010 | struct inode *old_inode = d_inode(old_dentry); | ||
2011 | struct inode *new_inode = d_inode(new_dentry); | ||
2012 | |||
2013 | nfs_mark_for_revalidate(old_inode); | ||
2014 | |||
2015 | switch (task->tk_status) { | ||
2016 | case 0: | ||
2017 | if (new_inode != NULL) | ||
2018 | nfs_drop_nlink(new_inode); | ||
2019 | d_move(old_dentry, new_dentry); | ||
2020 | nfs_set_verifier(new_dentry, | ||
2021 | nfs_save_change_attribute(data->new_dir)); | ||
2022 | break; | ||
2023 | case -ENOENT: | ||
2024 | nfs_dentry_handle_enoent(old_dentry); | ||
2025 | } | ||
2026 | } | ||
2027 | |||
2005 | /* | 2028 | /* |
2006 | * RENAME | 2029 | * RENAME |
2007 | * FIXME: Some nfsds, like the Linux user space nfsd, may generate a | 2030 | * FIXME: Some nfsds, like the Linux user space nfsd, may generate a |
@@ -2084,7 +2107,8 @@ int nfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
2084 | if (new_inode != NULL) | 2107 | if (new_inode != NULL) |
2085 | NFS_PROTO(new_inode)->return_delegation(new_inode); | 2108 | NFS_PROTO(new_inode)->return_delegation(new_inode); |
2086 | 2109 | ||
2087 | task = nfs_async_rename(old_dir, new_dir, old_dentry, new_dentry, NULL); | 2110 | task = nfs_async_rename(old_dir, new_dir, old_dentry, new_dentry, |
2111 | nfs_complete_rename); | ||
2088 | if (IS_ERR(task)) { | 2112 | if (IS_ERR(task)) { |
2089 | error = PTR_ERR(task); | 2113 | error = PTR_ERR(task); |
2090 | goto out; | 2114 | goto out; |
@@ -2094,21 +2118,11 @@ int nfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
2094 | if (error == 0) | 2118 | if (error == 0) |
2095 | error = task->tk_status; | 2119 | error = task->tk_status; |
2096 | rpc_put_task(task); | 2120 | rpc_put_task(task); |
2097 | nfs_mark_for_revalidate(old_inode); | ||
2098 | out: | 2121 | out: |
2099 | if (rehash) | 2122 | if (rehash) |
2100 | d_rehash(rehash); | 2123 | d_rehash(rehash); |
2101 | trace_nfs_rename_exit(old_dir, old_dentry, | 2124 | trace_nfs_rename_exit(old_dir, old_dentry, |
2102 | new_dir, new_dentry, error); | 2125 | new_dir, new_dentry, error); |
2103 | if (!error) { | ||
2104 | if (new_inode != NULL) | ||
2105 | nfs_drop_nlink(new_inode); | ||
2106 | d_move(old_dentry, new_dentry); | ||
2107 | nfs_set_verifier(new_dentry, | ||
2108 | nfs_save_change_attribute(new_dir)); | ||
2109 | } else if (error == -ENOENT) | ||
2110 | nfs_dentry_handle_enoent(old_dentry); | ||
2111 | |||
2112 | /* new dentry created? */ | 2126 | /* new dentry created? */ |
2113 | if (dentry) | 2127 | if (dentry) |
2114 | dput(dentry); | 2128 | dput(dentry); |
diff --git a/fs/nfs/filelayout/filelayout.c b/fs/nfs/filelayout/filelayout.c index 18f98e08544d..44347f4bdc15 100644 --- a/fs/nfs/filelayout/filelayout.c +++ b/fs/nfs/filelayout/filelayout.c | |||
@@ -305,7 +305,7 @@ static void filelayout_read_prepare(struct rpc_task *task, void *data) | |||
305 | } | 305 | } |
306 | hdr->pgio_done_cb = filelayout_read_done_cb; | 306 | hdr->pgio_done_cb = filelayout_read_done_cb; |
307 | 307 | ||
308 | if (nfs41_setup_sequence(hdr->ds_clp->cl_session, | 308 | if (nfs4_setup_sequence(hdr->ds_clp, |
309 | &hdr->args.seq_args, | 309 | &hdr->args.seq_args, |
310 | &hdr->res.seq_res, | 310 | &hdr->res.seq_res, |
311 | task)) | 311 | task)) |
@@ -403,7 +403,7 @@ static void filelayout_write_prepare(struct rpc_task *task, void *data) | |||
403 | rpc_exit(task, 0); | 403 | rpc_exit(task, 0); |
404 | return; | 404 | return; |
405 | } | 405 | } |
406 | if (nfs41_setup_sequence(hdr->ds_clp->cl_session, | 406 | if (nfs4_setup_sequence(hdr->ds_clp, |
407 | &hdr->args.seq_args, | 407 | &hdr->args.seq_args, |
408 | &hdr->res.seq_res, | 408 | &hdr->res.seq_res, |
409 | task)) | 409 | task)) |
@@ -438,7 +438,7 @@ static void filelayout_commit_prepare(struct rpc_task *task, void *data) | |||
438 | { | 438 | { |
439 | struct nfs_commit_data *wdata = data; | 439 | struct nfs_commit_data *wdata = data; |
440 | 440 | ||
441 | nfs41_setup_sequence(wdata->ds_clp->cl_session, | 441 | nfs4_setup_sequence(wdata->ds_clp, |
442 | &wdata->args.seq_args, | 442 | &wdata->args.seq_args, |
443 | &wdata->res.seq_res, | 443 | &wdata->res.seq_res, |
444 | task); | 444 | task); |
diff --git a/fs/nfs/flexfilelayout/flexfilelayout.c b/fs/nfs/flexfilelayout/flexfilelayout.c index d6acc688df7e..42dedf2d625f 100644 --- a/fs/nfs/flexfilelayout/flexfilelayout.c +++ b/fs/nfs/flexfilelayout/flexfilelayout.c | |||
@@ -1053,9 +1053,6 @@ static int ff_layout_async_handle_error_v4(struct rpc_task *task, | |||
1053 | struct nfs_client *mds_client = mds_server->nfs_client; | 1053 | struct nfs_client *mds_client = mds_server->nfs_client; |
1054 | struct nfs4_slot_table *tbl = &clp->cl_session->fc_slot_table; | 1054 | struct nfs4_slot_table *tbl = &clp->cl_session->fc_slot_table; |
1055 | 1055 | ||
1056 | if (task->tk_status >= 0) | ||
1057 | return 0; | ||
1058 | |||
1059 | switch (task->tk_status) { | 1056 | switch (task->tk_status) { |
1060 | /* MDS state errors */ | 1057 | /* MDS state errors */ |
1061 | case -NFS4ERR_DELEG_REVOKED: | 1058 | case -NFS4ERR_DELEG_REVOKED: |
@@ -1157,9 +1154,6 @@ static int ff_layout_async_handle_error_v3(struct rpc_task *task, | |||
1157 | { | 1154 | { |
1158 | struct nfs4_deviceid_node *devid = FF_LAYOUT_DEVID_NODE(lseg, idx); | 1155 | struct nfs4_deviceid_node *devid = FF_LAYOUT_DEVID_NODE(lseg, idx); |
1159 | 1156 | ||
1160 | if (task->tk_status >= 0) | ||
1161 | return 0; | ||
1162 | |||
1163 | switch (task->tk_status) { | 1157 | switch (task->tk_status) { |
1164 | /* File access problems. Don't mark the device as unavailable */ | 1158 | /* File access problems. Don't mark the device as unavailable */ |
1165 | case -EACCES: | 1159 | case -EACCES: |
@@ -1195,6 +1189,13 @@ static int ff_layout_async_handle_error(struct rpc_task *task, | |||
1195 | { | 1189 | { |
1196 | int vers = clp->cl_nfs_mod->rpc_vers->number; | 1190 | int vers = clp->cl_nfs_mod->rpc_vers->number; |
1197 | 1191 | ||
1192 | if (task->tk_status >= 0) | ||
1193 | return 0; | ||
1194 | |||
1195 | /* Handle the case of an invalid layout segment */ | ||
1196 | if (!pnfs_is_valid_lseg(lseg)) | ||
1197 | return -NFS4ERR_RESET_TO_PNFS; | ||
1198 | |||
1198 | switch (vers) { | 1199 | switch (vers) { |
1199 | case 3: | 1200 | case 3: |
1200 | return ff_layout_async_handle_error_v3(task, lseg, idx); | 1201 | return ff_layout_async_handle_error_v3(task, lseg, idx); |
@@ -1384,30 +1385,14 @@ static void ff_layout_read_prepare_v3(struct rpc_task *task, void *data) | |||
1384 | rpc_call_start(task); | 1385 | rpc_call_start(task); |
1385 | } | 1386 | } |
1386 | 1387 | ||
1387 | static int ff_layout_setup_sequence(struct nfs_client *ds_clp, | ||
1388 | struct nfs4_sequence_args *args, | ||
1389 | struct nfs4_sequence_res *res, | ||
1390 | struct rpc_task *task) | ||
1391 | { | ||
1392 | if (ds_clp->cl_session) | ||
1393 | return nfs41_setup_sequence(ds_clp->cl_session, | ||
1394 | args, | ||
1395 | res, | ||
1396 | task); | ||
1397 | return nfs40_setup_sequence(ds_clp->cl_slot_tbl, | ||
1398 | args, | ||
1399 | res, | ||
1400 | task); | ||
1401 | } | ||
1402 | |||
1403 | static void ff_layout_read_prepare_v4(struct rpc_task *task, void *data) | 1388 | static void ff_layout_read_prepare_v4(struct rpc_task *task, void *data) |
1404 | { | 1389 | { |
1405 | struct nfs_pgio_header *hdr = data; | 1390 | struct nfs_pgio_header *hdr = data; |
1406 | 1391 | ||
1407 | if (ff_layout_setup_sequence(hdr->ds_clp, | 1392 | if (nfs4_setup_sequence(hdr->ds_clp, |
1408 | &hdr->args.seq_args, | 1393 | &hdr->args.seq_args, |
1409 | &hdr->res.seq_res, | 1394 | &hdr->res.seq_res, |
1410 | task)) | 1395 | task)) |
1411 | return; | 1396 | return; |
1412 | 1397 | ||
1413 | if (ff_layout_read_prepare_common(task, hdr)) | 1398 | if (ff_layout_read_prepare_common(task, hdr)) |
@@ -1578,10 +1563,10 @@ static void ff_layout_write_prepare_v4(struct rpc_task *task, void *data) | |||
1578 | { | 1563 | { |
1579 | struct nfs_pgio_header *hdr = data; | 1564 | struct nfs_pgio_header *hdr = data; |
1580 | 1565 | ||
1581 | if (ff_layout_setup_sequence(hdr->ds_clp, | 1566 | if (nfs4_setup_sequence(hdr->ds_clp, |
1582 | &hdr->args.seq_args, | 1567 | &hdr->args.seq_args, |
1583 | &hdr->res.seq_res, | 1568 | &hdr->res.seq_res, |
1584 | task)) | 1569 | task)) |
1585 | return; | 1570 | return; |
1586 | 1571 | ||
1587 | if (ff_layout_write_prepare_common(task, hdr)) | 1572 | if (ff_layout_write_prepare_common(task, hdr)) |
@@ -1667,10 +1652,10 @@ static void ff_layout_commit_prepare_v4(struct rpc_task *task, void *data) | |||
1667 | { | 1652 | { |
1668 | struct nfs_commit_data *wdata = data; | 1653 | struct nfs_commit_data *wdata = data; |
1669 | 1654 | ||
1670 | if (ff_layout_setup_sequence(wdata->ds_clp, | 1655 | if (nfs4_setup_sequence(wdata->ds_clp, |
1671 | &wdata->args.seq_args, | 1656 | &wdata->args.seq_args, |
1672 | &wdata->res.seq_res, | 1657 | &wdata->res.seq_res, |
1673 | task)) | 1658 | task)) |
1674 | return; | 1659 | return; |
1675 | ff_layout_commit_prepare_common(task, data); | 1660 | ff_layout_commit_prepare_common(task, data); |
1676 | } | 1661 | } |
@@ -1965,10 +1950,7 @@ static int ff_layout_encode_ioerr(struct xdr_stream *xdr, | |||
1965 | static void | 1950 | static void |
1966 | encode_opaque_fixed(struct xdr_stream *xdr, const void *buf, size_t len) | 1951 | encode_opaque_fixed(struct xdr_stream *xdr, const void *buf, size_t len) |
1967 | { | 1952 | { |
1968 | __be32 *p; | 1953 | WARN_ON_ONCE(xdr_stream_encode_opaque_fixed(xdr, buf, len) < 0); |
1969 | |||
1970 | p = xdr_reserve_space(xdr, len); | ||
1971 | xdr_encode_opaque_fixed(p, buf, len); | ||
1972 | } | 1954 | } |
1973 | 1955 | ||
1974 | static void | 1956 | static void |
@@ -2092,7 +2074,7 @@ ff_layout_free_layoutreturn(struct nfs4_xdr_opaque_data *args) | |||
2092 | kfree(ff_args); | 2074 | kfree(ff_args); |
2093 | } | 2075 | } |
2094 | 2076 | ||
2095 | const struct nfs4_xdr_opaque_ops layoutreturn_ops = { | 2077 | static const struct nfs4_xdr_opaque_ops layoutreturn_ops = { |
2096 | .encode = ff_layout_encode_layoutreturn, | 2078 | .encode = ff_layout_encode_layoutreturn, |
2097 | .free = ff_layout_free_layoutreturn, | 2079 | .free = ff_layout_free_layoutreturn, |
2098 | }; | 2080 | }; |
diff --git a/fs/nfs/nfs42proc.c b/fs/nfs/nfs42proc.c index d12ff9385f49..1e486c73ec94 100644 --- a/fs/nfs/nfs42proc.c +++ b/fs/nfs/nfs42proc.c | |||
@@ -12,6 +12,7 @@ | |||
12 | #include "nfs42.h" | 12 | #include "nfs42.h" |
13 | #include "iostat.h" | 13 | #include "iostat.h" |
14 | #include "pnfs.h" | 14 | #include "pnfs.h" |
15 | #include "nfs4session.h" | ||
15 | #include "internal.h" | 16 | #include "internal.h" |
16 | 17 | ||
17 | #define NFSDBG_FACILITY NFSDBG_PROC | 18 | #define NFSDBG_FACILITY NFSDBG_PROC |
@@ -128,30 +129,26 @@ out_unlock: | |||
128 | return err; | 129 | return err; |
129 | } | 130 | } |
130 | 131 | ||
131 | static ssize_t _nfs42_proc_copy(struct file *src, loff_t pos_src, | 132 | static ssize_t _nfs42_proc_copy(struct file *src, |
132 | struct nfs_lock_context *src_lock, | 133 | struct nfs_lock_context *src_lock, |
133 | struct file *dst, loff_t pos_dst, | 134 | struct file *dst, |
134 | struct nfs_lock_context *dst_lock, | 135 | struct nfs_lock_context *dst_lock, |
135 | size_t count) | 136 | struct nfs42_copy_args *args, |
137 | struct nfs42_copy_res *res) | ||
136 | { | 138 | { |
137 | struct nfs42_copy_args args = { | ||
138 | .src_fh = NFS_FH(file_inode(src)), | ||
139 | .src_pos = pos_src, | ||
140 | .dst_fh = NFS_FH(file_inode(dst)), | ||
141 | .dst_pos = pos_dst, | ||
142 | .count = count, | ||
143 | }; | ||
144 | struct nfs42_copy_res res; | ||
145 | struct rpc_message msg = { | 139 | struct rpc_message msg = { |
146 | .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_COPY], | 140 | .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_COPY], |
147 | .rpc_argp = &args, | 141 | .rpc_argp = args, |
148 | .rpc_resp = &res, | 142 | .rpc_resp = res, |
149 | }; | 143 | }; |
150 | struct inode *dst_inode = file_inode(dst); | 144 | struct inode *dst_inode = file_inode(dst); |
151 | struct nfs_server *server = NFS_SERVER(dst_inode); | 145 | struct nfs_server *server = NFS_SERVER(dst_inode); |
146 | loff_t pos_src = args->src_pos; | ||
147 | loff_t pos_dst = args->dst_pos; | ||
148 | size_t count = args->count; | ||
152 | int status; | 149 | int status; |
153 | 150 | ||
154 | status = nfs4_set_rw_stateid(&args.src_stateid, src_lock->open_context, | 151 | status = nfs4_set_rw_stateid(&args->src_stateid, src_lock->open_context, |
155 | src_lock, FMODE_READ); | 152 | src_lock, FMODE_READ); |
156 | if (status) | 153 | if (status) |
157 | return status; | 154 | return status; |
@@ -161,7 +158,7 @@ static ssize_t _nfs42_proc_copy(struct file *src, loff_t pos_src, | |||
161 | if (status) | 158 | if (status) |
162 | return status; | 159 | return status; |
163 | 160 | ||
164 | status = nfs4_set_rw_stateid(&args.dst_stateid, dst_lock->open_context, | 161 | status = nfs4_set_rw_stateid(&args->dst_stateid, dst_lock->open_context, |
165 | dst_lock, FMODE_WRITE); | 162 | dst_lock, FMODE_WRITE); |
166 | if (status) | 163 | if (status) |
167 | return status; | 164 | return status; |
@@ -171,22 +168,22 @@ static ssize_t _nfs42_proc_copy(struct file *src, loff_t pos_src, | |||
171 | return status; | 168 | return status; |
172 | 169 | ||
173 | status = nfs4_call_sync(server->client, server, &msg, | 170 | status = nfs4_call_sync(server->client, server, &msg, |
174 | &args.seq_args, &res.seq_res, 0); | 171 | &args->seq_args, &res->seq_res, 0); |
175 | if (status == -ENOTSUPP) | 172 | if (status == -ENOTSUPP) |
176 | server->caps &= ~NFS_CAP_COPY; | 173 | server->caps &= ~NFS_CAP_COPY; |
177 | if (status) | 174 | if (status) |
178 | return status; | 175 | return status; |
179 | 176 | ||
180 | if (res.write_res.verifier.committed != NFS_FILE_SYNC) { | 177 | if (res->write_res.verifier.committed != NFS_FILE_SYNC) { |
181 | status = nfs_commit_file(dst, &res.write_res.verifier.verifier); | 178 | status = nfs_commit_file(dst, &res->write_res.verifier.verifier); |
182 | if (status) | 179 | if (status) |
183 | return status; | 180 | return status; |
184 | } | 181 | } |
185 | 182 | ||
186 | truncate_pagecache_range(dst_inode, pos_dst, | 183 | truncate_pagecache_range(dst_inode, pos_dst, |
187 | pos_dst + res.write_res.count); | 184 | pos_dst + res->write_res.count); |
188 | 185 | ||
189 | return res.write_res.count; | 186 | return res->write_res.count; |
190 | } | 187 | } |
191 | 188 | ||
192 | ssize_t nfs42_proc_copy(struct file *src, loff_t pos_src, | 189 | ssize_t nfs42_proc_copy(struct file *src, loff_t pos_src, |
@@ -196,8 +193,22 @@ ssize_t nfs42_proc_copy(struct file *src, loff_t pos_src, | |||
196 | struct nfs_server *server = NFS_SERVER(file_inode(dst)); | 193 | struct nfs_server *server = NFS_SERVER(file_inode(dst)); |
197 | struct nfs_lock_context *src_lock; | 194 | struct nfs_lock_context *src_lock; |
198 | struct nfs_lock_context *dst_lock; | 195 | struct nfs_lock_context *dst_lock; |
199 | struct nfs4_exception src_exception = { }; | 196 | struct nfs42_copy_args args = { |
200 | struct nfs4_exception dst_exception = { }; | 197 | .src_fh = NFS_FH(file_inode(src)), |
198 | .src_pos = pos_src, | ||
199 | .dst_fh = NFS_FH(file_inode(dst)), | ||
200 | .dst_pos = pos_dst, | ||
201 | .count = count, | ||
202 | }; | ||
203 | struct nfs42_copy_res res; | ||
204 | struct nfs4_exception src_exception = { | ||
205 | .inode = file_inode(src), | ||
206 | .stateid = &args.src_stateid, | ||
207 | }; | ||
208 | struct nfs4_exception dst_exception = { | ||
209 | .inode = file_inode(dst), | ||
210 | .stateid = &args.dst_stateid, | ||
211 | }; | ||
201 | ssize_t err, err2; | 212 | ssize_t err, err2; |
202 | 213 | ||
203 | if (!nfs_server_capable(file_inode(dst), NFS_CAP_COPY)) | 214 | if (!nfs_server_capable(file_inode(dst), NFS_CAP_COPY)) |
@@ -207,7 +218,6 @@ ssize_t nfs42_proc_copy(struct file *src, loff_t pos_src, | |||
207 | if (IS_ERR(src_lock)) | 218 | if (IS_ERR(src_lock)) |
208 | return PTR_ERR(src_lock); | 219 | return PTR_ERR(src_lock); |
209 | 220 | ||
210 | src_exception.inode = file_inode(src); | ||
211 | src_exception.state = src_lock->open_context->state; | 221 | src_exception.state = src_lock->open_context->state; |
212 | 222 | ||
213 | dst_lock = nfs_get_lock_context(nfs_file_open_context(dst)); | 223 | dst_lock = nfs_get_lock_context(nfs_file_open_context(dst)); |
@@ -216,15 +226,17 @@ ssize_t nfs42_proc_copy(struct file *src, loff_t pos_src, | |||
216 | goto out_put_src_lock; | 226 | goto out_put_src_lock; |
217 | } | 227 | } |
218 | 228 | ||
219 | dst_exception.inode = file_inode(dst); | ||
220 | dst_exception.state = dst_lock->open_context->state; | 229 | dst_exception.state = dst_lock->open_context->state; |
221 | 230 | ||
222 | do { | 231 | do { |
223 | inode_lock(file_inode(dst)); | 232 | inode_lock(file_inode(dst)); |
224 | err = _nfs42_proc_copy(src, pos_src, src_lock, | 233 | err = _nfs42_proc_copy(src, src_lock, |
225 | dst, pos_dst, dst_lock, count); | 234 | dst, dst_lock, |
235 | &args, &res); | ||
226 | inode_unlock(file_inode(dst)); | 236 | inode_unlock(file_inode(dst)); |
227 | 237 | ||
238 | if (err >= 0) | ||
239 | break; | ||
228 | if (err == -ENOTSUPP) { | 240 | if (err == -ENOTSUPP) { |
229 | err = -EOPNOTSUPP; | 241 | err = -EOPNOTSUPP; |
230 | break; | 242 | break; |
@@ -331,9 +343,8 @@ nfs42_layoutstat_prepare(struct rpc_task *task, void *calldata) | |||
331 | } | 343 | } |
332 | nfs4_stateid_copy(&data->args.stateid, &lo->plh_stateid); | 344 | nfs4_stateid_copy(&data->args.stateid, &lo->plh_stateid); |
333 | spin_unlock(&inode->i_lock); | 345 | spin_unlock(&inode->i_lock); |
334 | nfs41_setup_sequence(nfs4_get_session(server), &data->args.seq_args, | 346 | nfs4_setup_sequence(server->nfs_client, &data->args.seq_args, |
335 | &data->res.seq_res, task); | 347 | &data->res.seq_res, task); |
336 | |||
337 | } | 348 | } |
338 | 349 | ||
339 | static void | 350 | static void |
diff --git a/fs/nfs/nfs4_fs.h b/fs/nfs/nfs4_fs.h index 665165833660..af285cc27ccf 100644 --- a/fs/nfs/nfs4_fs.h +++ b/fs/nfs/nfs4_fs.h | |||
@@ -273,14 +273,6 @@ extern int nfs4_set_rw_stateid(nfs4_stateid *stateid, | |||
273 | fmode_t fmode); | 273 | fmode_t fmode); |
274 | 274 | ||
275 | #if defined(CONFIG_NFS_V4_1) | 275 | #if defined(CONFIG_NFS_V4_1) |
276 | static inline struct nfs4_session *nfs4_get_session(const struct nfs_server *server) | ||
277 | { | ||
278 | return server->nfs_client->cl_session; | ||
279 | } | ||
280 | |||
281 | extern int nfs41_setup_sequence(struct nfs4_session *session, | ||
282 | struct nfs4_sequence_args *args, struct nfs4_sequence_res *res, | ||
283 | struct rpc_task *task); | ||
284 | extern int nfs41_sequence_done(struct rpc_task *, struct nfs4_sequence_res *); | 276 | extern int nfs41_sequence_done(struct rpc_task *, struct nfs4_sequence_res *); |
285 | extern int nfs4_proc_create_session(struct nfs_client *, struct rpc_cred *); | 277 | extern int nfs4_proc_create_session(struct nfs_client *, struct rpc_cred *); |
286 | extern int nfs4_proc_destroy_session(struct nfs4_session *, struct rpc_cred *); | 278 | extern int nfs4_proc_destroy_session(struct nfs4_session *, struct rpc_cred *); |
@@ -357,11 +349,6 @@ nfs4_state_protect_write(struct nfs_client *clp, struct rpc_clnt **clntp, | |||
357 | hdr->args.stable = NFS_FILE_SYNC; | 349 | hdr->args.stable = NFS_FILE_SYNC; |
358 | } | 350 | } |
359 | #else /* CONFIG_NFS_v4_1 */ | 351 | #else /* CONFIG_NFS_v4_1 */ |
360 | static inline struct nfs4_session *nfs4_get_session(const struct nfs_server *server) | ||
361 | { | ||
362 | return NULL; | ||
363 | } | ||
364 | |||
365 | static inline bool | 352 | static inline bool |
366 | is_ds_only_client(struct nfs_client *clp) | 353 | is_ds_only_client(struct nfs_client *clp) |
367 | { | 354 | { |
@@ -466,7 +453,7 @@ extern void nfs_increment_open_seqid(int status, struct nfs_seqid *seqid); | |||
466 | extern void nfs_increment_lock_seqid(int status, struct nfs_seqid *seqid); | 453 | extern void nfs_increment_lock_seqid(int status, struct nfs_seqid *seqid); |
467 | extern void nfs_release_seqid(struct nfs_seqid *seqid); | 454 | extern void nfs_release_seqid(struct nfs_seqid *seqid); |
468 | extern void nfs_free_seqid(struct nfs_seqid *seqid); | 455 | extern void nfs_free_seqid(struct nfs_seqid *seqid); |
469 | extern int nfs40_setup_sequence(struct nfs4_slot_table *tbl, | 456 | extern int nfs4_setup_sequence(const struct nfs_client *client, |
470 | struct nfs4_sequence_args *args, | 457 | struct nfs4_sequence_args *args, |
471 | struct nfs4_sequence_res *res, | 458 | struct nfs4_sequence_res *res, |
472 | struct rpc_task *task); | 459 | struct rpc_task *task); |
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index 0a0eaecf9676..1b183686c6d4 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c | |||
@@ -577,12 +577,7 @@ nfs4_async_handle_error(struct rpc_task *task, struct nfs_server *server, | |||
577 | static bool _nfs4_is_integrity_protected(struct nfs_client *clp) | 577 | static bool _nfs4_is_integrity_protected(struct nfs_client *clp) |
578 | { | 578 | { |
579 | rpc_authflavor_t flavor = clp->cl_rpcclient->cl_auth->au_flavor; | 579 | rpc_authflavor_t flavor = clp->cl_rpcclient->cl_auth->au_flavor; |
580 | 580 | return (flavor == RPC_AUTH_GSS_KRB5I) || (flavor == RPC_AUTH_GSS_KRB5P); | |
581 | if (flavor == RPC_AUTH_GSS_KRB5I || | ||
582 | flavor == RPC_AUTH_GSS_KRB5P) | ||
583 | return true; | ||
584 | |||
585 | return false; | ||
586 | } | 581 | } |
587 | 582 | ||
588 | static void do_renew_lease(struct nfs_client *clp, unsigned long timestamp) | 583 | static void do_renew_lease(struct nfs_client *clp, unsigned long timestamp) |
@@ -622,48 +617,6 @@ static void nfs4_set_sequence_privileged(struct nfs4_sequence_args *args) | |||
622 | args->sa_privileged = 1; | 617 | args->sa_privileged = 1; |
623 | } | 618 | } |
624 | 619 | ||
625 | int nfs40_setup_sequence(struct nfs4_slot_table *tbl, | ||
626 | struct nfs4_sequence_args *args, | ||
627 | struct nfs4_sequence_res *res, | ||
628 | struct rpc_task *task) | ||
629 | { | ||
630 | struct nfs4_slot *slot; | ||
631 | |||
632 | /* slot already allocated? */ | ||
633 | if (res->sr_slot != NULL) | ||
634 | goto out_start; | ||
635 | |||
636 | spin_lock(&tbl->slot_tbl_lock); | ||
637 | if (nfs4_slot_tbl_draining(tbl) && !args->sa_privileged) | ||
638 | goto out_sleep; | ||
639 | |||
640 | slot = nfs4_alloc_slot(tbl); | ||
641 | if (IS_ERR(slot)) { | ||
642 | if (slot == ERR_PTR(-ENOMEM)) | ||
643 | task->tk_timeout = HZ >> 2; | ||
644 | goto out_sleep; | ||
645 | } | ||
646 | spin_unlock(&tbl->slot_tbl_lock); | ||
647 | |||
648 | slot->privileged = args->sa_privileged ? 1 : 0; | ||
649 | args->sa_slot = slot; | ||
650 | res->sr_slot = slot; | ||
651 | |||
652 | out_start: | ||
653 | rpc_call_start(task); | ||
654 | return 0; | ||
655 | |||
656 | out_sleep: | ||
657 | if (args->sa_privileged) | ||
658 | rpc_sleep_on_priority(&tbl->slot_tbl_waitq, task, | ||
659 | NULL, RPC_PRIORITY_PRIVILEGED); | ||
660 | else | ||
661 | rpc_sleep_on(&tbl->slot_tbl_waitq, task, NULL); | ||
662 | spin_unlock(&tbl->slot_tbl_lock); | ||
663 | return -EAGAIN; | ||
664 | } | ||
665 | EXPORT_SYMBOL_GPL(nfs40_setup_sequence); | ||
666 | |||
667 | static void nfs40_sequence_free_slot(struct nfs4_sequence_res *res) | 620 | static void nfs40_sequence_free_slot(struct nfs4_sequence_res *res) |
668 | { | 621 | { |
669 | struct nfs4_slot *slot = res->sr_slot; | 622 | struct nfs4_slot *slot = res->sr_slot; |
@@ -815,10 +768,6 @@ static int nfs41_sequence_process(struct rpc_task *task, | |||
815 | case -NFS4ERR_SEQ_FALSE_RETRY: | 768 | case -NFS4ERR_SEQ_FALSE_RETRY: |
816 | ++slot->seq_nr; | 769 | ++slot->seq_nr; |
817 | goto retry_nowait; | 770 | goto retry_nowait; |
818 | case -NFS4ERR_DEADSESSION: | ||
819 | case -NFS4ERR_BADSESSION: | ||
820 | nfs4_schedule_session_recovery(session, res->sr_status); | ||
821 | goto retry_nowait; | ||
822 | default: | 771 | default: |
823 | /* Just update the slot sequence no. */ | 772 | /* Just update the slot sequence no. */ |
824 | slot->seq_done = 1; | 773 | slot->seq_done = 1; |
@@ -882,101 +831,14 @@ int nfs4_sequence_done(struct rpc_task *task, struct nfs4_sequence_res *res) | |||
882 | } | 831 | } |
883 | EXPORT_SYMBOL_GPL(nfs4_sequence_done); | 832 | EXPORT_SYMBOL_GPL(nfs4_sequence_done); |
884 | 833 | ||
885 | int nfs41_setup_sequence(struct nfs4_session *session, | ||
886 | struct nfs4_sequence_args *args, | ||
887 | struct nfs4_sequence_res *res, | ||
888 | struct rpc_task *task) | ||
889 | { | ||
890 | struct nfs4_slot *slot; | ||
891 | struct nfs4_slot_table *tbl; | ||
892 | |||
893 | dprintk("--> %s\n", __func__); | ||
894 | /* slot already allocated? */ | ||
895 | if (res->sr_slot != NULL) | ||
896 | goto out_success; | ||
897 | |||
898 | tbl = &session->fc_slot_table; | ||
899 | |||
900 | task->tk_timeout = 0; | ||
901 | |||
902 | spin_lock(&tbl->slot_tbl_lock); | ||
903 | if (test_bit(NFS4_SLOT_TBL_DRAINING, &tbl->slot_tbl_state) && | ||
904 | !args->sa_privileged) { | ||
905 | /* The state manager will wait until the slot table is empty */ | ||
906 | dprintk("%s session is draining\n", __func__); | ||
907 | goto out_sleep; | ||
908 | } | ||
909 | |||
910 | slot = nfs4_alloc_slot(tbl); | ||
911 | if (IS_ERR(slot)) { | ||
912 | /* If out of memory, try again in 1/4 second */ | ||
913 | if (slot == ERR_PTR(-ENOMEM)) | ||
914 | task->tk_timeout = HZ >> 2; | ||
915 | dprintk("<-- %s: no free slots\n", __func__); | ||
916 | goto out_sleep; | ||
917 | } | ||
918 | spin_unlock(&tbl->slot_tbl_lock); | ||
919 | |||
920 | slot->privileged = args->sa_privileged ? 1 : 0; | ||
921 | args->sa_slot = slot; | ||
922 | |||
923 | dprintk("<-- %s slotid=%u seqid=%u\n", __func__, | ||
924 | slot->slot_nr, slot->seq_nr); | ||
925 | |||
926 | res->sr_slot = slot; | ||
927 | res->sr_timestamp = jiffies; | ||
928 | res->sr_status_flags = 0; | ||
929 | /* | ||
930 | * sr_status is only set in decode_sequence, and so will remain | ||
931 | * set to 1 if an rpc level failure occurs. | ||
932 | */ | ||
933 | res->sr_status = 1; | ||
934 | trace_nfs4_setup_sequence(session, args); | ||
935 | out_success: | ||
936 | rpc_call_start(task); | ||
937 | return 0; | ||
938 | out_sleep: | ||
939 | /* Privileged tasks are queued with top priority */ | ||
940 | if (args->sa_privileged) | ||
941 | rpc_sleep_on_priority(&tbl->slot_tbl_waitq, task, | ||
942 | NULL, RPC_PRIORITY_PRIVILEGED); | ||
943 | else | ||
944 | rpc_sleep_on(&tbl->slot_tbl_waitq, task, NULL); | ||
945 | spin_unlock(&tbl->slot_tbl_lock); | ||
946 | return -EAGAIN; | ||
947 | } | ||
948 | EXPORT_SYMBOL_GPL(nfs41_setup_sequence); | ||
949 | |||
950 | static int nfs4_setup_sequence(const struct nfs_server *server, | ||
951 | struct nfs4_sequence_args *args, | ||
952 | struct nfs4_sequence_res *res, | ||
953 | struct rpc_task *task) | ||
954 | { | ||
955 | struct nfs4_session *session = nfs4_get_session(server); | ||
956 | int ret = 0; | ||
957 | |||
958 | if (!session) | ||
959 | return nfs40_setup_sequence(server->nfs_client->cl_slot_tbl, | ||
960 | args, res, task); | ||
961 | |||
962 | dprintk("--> %s clp %p session %p sr_slot %u\n", | ||
963 | __func__, session->clp, session, res->sr_slot ? | ||
964 | res->sr_slot->slot_nr : NFS4_NO_SLOT); | ||
965 | |||
966 | ret = nfs41_setup_sequence(session, args, res, task); | ||
967 | |||
968 | dprintk("<-- %s status=%d\n", __func__, ret); | ||
969 | return ret; | ||
970 | } | ||
971 | |||
972 | static void nfs41_call_sync_prepare(struct rpc_task *task, void *calldata) | 834 | static void nfs41_call_sync_prepare(struct rpc_task *task, void *calldata) |
973 | { | 835 | { |
974 | struct nfs4_call_sync_data *data = calldata; | 836 | struct nfs4_call_sync_data *data = calldata; |
975 | struct nfs4_session *session = nfs4_get_session(data->seq_server); | ||
976 | 837 | ||
977 | dprintk("--> %s data->seq_server %p\n", __func__, data->seq_server); | 838 | dprintk("--> %s data->seq_server %p\n", __func__, data->seq_server); |
978 | 839 | ||
979 | nfs41_setup_sequence(session, data->seq_args, data->seq_res, task); | 840 | nfs4_setup_sequence(data->seq_server->nfs_client, |
841 | data->seq_args, data->seq_res, task); | ||
980 | } | 842 | } |
981 | 843 | ||
982 | static void nfs41_call_sync_done(struct rpc_task *task, void *calldata) | 844 | static void nfs41_call_sync_done(struct rpc_task *task, void *calldata) |
@@ -993,15 +855,6 @@ static const struct rpc_call_ops nfs41_call_sync_ops = { | |||
993 | 855 | ||
994 | #else /* !CONFIG_NFS_V4_1 */ | 856 | #else /* !CONFIG_NFS_V4_1 */ |
995 | 857 | ||
996 | static int nfs4_setup_sequence(const struct nfs_server *server, | ||
997 | struct nfs4_sequence_args *args, | ||
998 | struct nfs4_sequence_res *res, | ||
999 | struct rpc_task *task) | ||
1000 | { | ||
1001 | return nfs40_setup_sequence(server->nfs_client->cl_slot_tbl, | ||
1002 | args, res, task); | ||
1003 | } | ||
1004 | |||
1005 | static int nfs4_sequence_process(struct rpc_task *task, struct nfs4_sequence_res *res) | 858 | static int nfs4_sequence_process(struct rpc_task *task, struct nfs4_sequence_res *res) |
1006 | { | 859 | { |
1007 | return nfs40_sequence_done(task, res); | 860 | return nfs40_sequence_done(task, res); |
@@ -1022,10 +875,68 @@ EXPORT_SYMBOL_GPL(nfs4_sequence_done); | |||
1022 | 875 | ||
1023 | #endif /* !CONFIG_NFS_V4_1 */ | 876 | #endif /* !CONFIG_NFS_V4_1 */ |
1024 | 877 | ||
878 | int nfs4_setup_sequence(const struct nfs_client *client, | ||
879 | struct nfs4_sequence_args *args, | ||
880 | struct nfs4_sequence_res *res, | ||
881 | struct rpc_task *task) | ||
882 | { | ||
883 | struct nfs4_session *session = nfs4_get_session(client); | ||
884 | struct nfs4_slot_table *tbl = client->cl_slot_tbl; | ||
885 | struct nfs4_slot *slot; | ||
886 | |||
887 | /* slot already allocated? */ | ||
888 | if (res->sr_slot != NULL) | ||
889 | goto out_start; | ||
890 | |||
891 | if (session) { | ||
892 | tbl = &session->fc_slot_table; | ||
893 | task->tk_timeout = 0; | ||
894 | } | ||
895 | |||
896 | spin_lock(&tbl->slot_tbl_lock); | ||
897 | /* The state manager will wait until the slot table is empty */ | ||
898 | if (nfs4_slot_tbl_draining(tbl) && !args->sa_privileged) | ||
899 | goto out_sleep; | ||
900 | |||
901 | slot = nfs4_alloc_slot(tbl); | ||
902 | if (IS_ERR(slot)) { | ||
903 | /* Try again in 1/4 second */ | ||
904 | if (slot == ERR_PTR(-ENOMEM)) | ||
905 | task->tk_timeout = HZ >> 2; | ||
906 | goto out_sleep; | ||
907 | } | ||
908 | spin_unlock(&tbl->slot_tbl_lock); | ||
909 | |||
910 | slot->privileged = args->sa_privileged ? 1 : 0; | ||
911 | args->sa_slot = slot; | ||
912 | |||
913 | res->sr_slot = slot; | ||
914 | if (session) { | ||
915 | res->sr_timestamp = jiffies; | ||
916 | res->sr_status_flags = 0; | ||
917 | res->sr_status = 1; | ||
918 | } | ||
919 | |||
920 | trace_nfs4_setup_sequence(session, args); | ||
921 | out_start: | ||
922 | rpc_call_start(task); | ||
923 | return 0; | ||
924 | |||
925 | out_sleep: | ||
926 | if (args->sa_privileged) | ||
927 | rpc_sleep_on_priority(&tbl->slot_tbl_waitq, task, | ||
928 | NULL, RPC_PRIORITY_PRIVILEGED); | ||
929 | else | ||
930 | rpc_sleep_on(&tbl->slot_tbl_waitq, task, NULL); | ||
931 | spin_unlock(&tbl->slot_tbl_lock); | ||
932 | return -EAGAIN; | ||
933 | } | ||
934 | EXPORT_SYMBOL_GPL(nfs4_setup_sequence); | ||
935 | |||
1025 | static void nfs40_call_sync_prepare(struct rpc_task *task, void *calldata) | 936 | static void nfs40_call_sync_prepare(struct rpc_task *task, void *calldata) |
1026 | { | 937 | { |
1027 | struct nfs4_call_sync_data *data = calldata; | 938 | struct nfs4_call_sync_data *data = calldata; |
1028 | nfs4_setup_sequence(data->seq_server, | 939 | nfs4_setup_sequence(data->seq_server->nfs_client, |
1029 | data->seq_args, data->seq_res, task); | 940 | data->seq_args, data->seq_res, task); |
1030 | } | 941 | } |
1031 | 942 | ||
@@ -1330,14 +1241,6 @@ static void nfs4_opendata_put(struct nfs4_opendata *p) | |||
1330 | kref_put(&p->kref, nfs4_opendata_free); | 1241 | kref_put(&p->kref, nfs4_opendata_free); |
1331 | } | 1242 | } |
1332 | 1243 | ||
1333 | static int nfs4_wait_for_completion_rpc_task(struct rpc_task *task) | ||
1334 | { | ||
1335 | int ret; | ||
1336 | |||
1337 | ret = rpc_wait_for_completion_task(task); | ||
1338 | return ret; | ||
1339 | } | ||
1340 | |||
1341 | static bool nfs4_mode_match_open_stateid(struct nfs4_state *state, | 1244 | static bool nfs4_mode_match_open_stateid(struct nfs4_state *state, |
1342 | fmode_t fmode) | 1245 | fmode_t fmode) |
1343 | { | 1246 | { |
@@ -1732,17 +1635,15 @@ _nfs4_opendata_reclaim_to_nfs4_state(struct nfs4_opendata *data) | |||
1732 | int ret; | 1635 | int ret; |
1733 | 1636 | ||
1734 | if (!data->rpc_done) { | 1637 | if (!data->rpc_done) { |
1735 | if (data->rpc_status) { | 1638 | if (data->rpc_status) |
1736 | ret = data->rpc_status; | 1639 | return ERR_PTR(data->rpc_status); |
1737 | goto err; | ||
1738 | } | ||
1739 | /* cached opens have already been processed */ | 1640 | /* cached opens have already been processed */ |
1740 | goto update; | 1641 | goto update; |
1741 | } | 1642 | } |
1742 | 1643 | ||
1743 | ret = nfs_refresh_inode(inode, &data->f_attr); | 1644 | ret = nfs_refresh_inode(inode, &data->f_attr); |
1744 | if (ret) | 1645 | if (ret) |
1745 | goto err; | 1646 | return ERR_PTR(ret); |
1746 | 1647 | ||
1747 | if (data->o_res.delegation_type != 0) | 1648 | if (data->o_res.delegation_type != 0) |
1748 | nfs4_opendata_check_deleg(data, state); | 1649 | nfs4_opendata_check_deleg(data, state); |
@@ -1752,9 +1653,6 @@ update: | |||
1752 | atomic_inc(&state->count); | 1653 | atomic_inc(&state->count); |
1753 | 1654 | ||
1754 | return state; | 1655 | return state; |
1755 | err: | ||
1756 | return ERR_PTR(ret); | ||
1757 | |||
1758 | } | 1656 | } |
1759 | 1657 | ||
1760 | static struct nfs4_state * | 1658 | static struct nfs4_state * |
@@ -2048,8 +1946,8 @@ static void nfs4_open_confirm_prepare(struct rpc_task *task, void *calldata) | |||
2048 | { | 1946 | { |
2049 | struct nfs4_opendata *data = calldata; | 1947 | struct nfs4_opendata *data = calldata; |
2050 | 1948 | ||
2051 | nfs40_setup_sequence(data->o_arg.server->nfs_client->cl_slot_tbl, | 1949 | nfs4_setup_sequence(data->o_arg.server->nfs_client, |
2052 | &data->c_arg.seq_args, &data->c_res.seq_res, task); | 1950 | &data->c_arg.seq_args, &data->c_res.seq_res, task); |
2053 | } | 1951 | } |
2054 | 1952 | ||
2055 | static void nfs4_open_confirm_done(struct rpc_task *task, void *calldata) | 1953 | static void nfs4_open_confirm_done(struct rpc_task *task, void *calldata) |
@@ -2124,7 +2022,7 @@ static int _nfs4_proc_open_confirm(struct nfs4_opendata *data) | |||
2124 | task = rpc_run_task(&task_setup_data); | 2022 | task = rpc_run_task(&task_setup_data); |
2125 | if (IS_ERR(task)) | 2023 | if (IS_ERR(task)) |
2126 | return PTR_ERR(task); | 2024 | return PTR_ERR(task); |
2127 | status = nfs4_wait_for_completion_rpc_task(task); | 2025 | status = rpc_wait_for_completion_task(task); |
2128 | if (status != 0) { | 2026 | if (status != 0) { |
2129 | data->cancelled = 1; | 2027 | data->cancelled = 1; |
2130 | smp_wmb(); | 2028 | smp_wmb(); |
@@ -2172,7 +2070,7 @@ static void nfs4_open_prepare(struct rpc_task *task, void *calldata) | |||
2172 | nfs_copy_fh(&data->o_res.fh, data->o_arg.fh); | 2070 | nfs_copy_fh(&data->o_res.fh, data->o_arg.fh); |
2173 | } | 2071 | } |
2174 | data->timestamp = jiffies; | 2072 | data->timestamp = jiffies; |
2175 | if (nfs4_setup_sequence(data->o_arg.server, | 2073 | if (nfs4_setup_sequence(data->o_arg.server->nfs_client, |
2176 | &data->o_arg.seq_args, | 2074 | &data->o_arg.seq_args, |
2177 | &data->o_res.seq_res, | 2075 | &data->o_res.seq_res, |
2178 | task) != 0) | 2076 | task) != 0) |
@@ -2289,15 +2187,15 @@ static int nfs4_run_open_task(struct nfs4_opendata *data, int isrecover) | |||
2289 | data->is_recover = 1; | 2187 | data->is_recover = 1; |
2290 | } | 2188 | } |
2291 | task = rpc_run_task(&task_setup_data); | 2189 | task = rpc_run_task(&task_setup_data); |
2292 | if (IS_ERR(task)) | 2190 | if (IS_ERR(task)) |
2293 | return PTR_ERR(task); | 2191 | return PTR_ERR(task); |
2294 | status = nfs4_wait_for_completion_rpc_task(task); | 2192 | status = rpc_wait_for_completion_task(task); |
2295 | if (status != 0) { | 2193 | if (status != 0) { |
2296 | data->cancelled = 1; | 2194 | data->cancelled = 1; |
2297 | smp_wmb(); | 2195 | smp_wmb(); |
2298 | } else | 2196 | } else |
2299 | status = data->rpc_status; | 2197 | status = data->rpc_status; |
2300 | rpc_put_task(task); | 2198 | rpc_put_task(task); |
2301 | 2199 | ||
2302 | return status; | 2200 | return status; |
2303 | } | 2201 | } |
@@ -2306,7 +2204,7 @@ static int _nfs4_recover_proc_open(struct nfs4_opendata *data) | |||
2306 | { | 2204 | { |
2307 | struct inode *dir = d_inode(data->dir); | 2205 | struct inode *dir = d_inode(data->dir); |
2308 | struct nfs_openres *o_res = &data->o_res; | 2206 | struct nfs_openres *o_res = &data->o_res; |
2309 | int status; | 2207 | int status; |
2310 | 2208 | ||
2311 | status = nfs4_run_open_task(data, 1); | 2209 | status = nfs4_run_open_task(data, 1); |
2312 | if (status != 0 || !data->rpc_done) | 2210 | if (status != 0 || !data->rpc_done) |
@@ -2314,11 +2212,8 @@ static int _nfs4_recover_proc_open(struct nfs4_opendata *data) | |||
2314 | 2212 | ||
2315 | nfs_fattr_map_and_free_names(NFS_SERVER(dir), &data->f_attr); | 2213 | nfs_fattr_map_and_free_names(NFS_SERVER(dir), &data->f_attr); |
2316 | 2214 | ||
2317 | if (o_res->rflags & NFS4_OPEN_RESULT_CONFIRM) { | 2215 | if (o_res->rflags & NFS4_OPEN_RESULT_CONFIRM) |
2318 | status = _nfs4_proc_open_confirm(data); | 2216 | status = _nfs4_proc_open_confirm(data); |
2319 | if (status != 0) | ||
2320 | return status; | ||
2321 | } | ||
2322 | 2217 | ||
2323 | return status; | 2218 | return status; |
2324 | } | 2219 | } |
@@ -2412,11 +2307,6 @@ static int _nfs4_proc_open(struct nfs4_opendata *data) | |||
2412 | return 0; | 2307 | return 0; |
2413 | } | 2308 | } |
2414 | 2309 | ||
2415 | static int nfs4_recover_expired_lease(struct nfs_server *server) | ||
2416 | { | ||
2417 | return nfs4_client_recover_expired_lease(server->nfs_client); | ||
2418 | } | ||
2419 | |||
2420 | /* | 2310 | /* |
2421 | * OPEN_EXPIRED: | 2311 | * OPEN_EXPIRED: |
2422 | * reclaim state on the server after a network partition. | 2312 | * reclaim state on the server after a network partition. |
@@ -2730,6 +2620,7 @@ static int _nfs4_open_and_get_state(struct nfs4_opendata *opendata, | |||
2730 | ret = PTR_ERR(state); | 2620 | ret = PTR_ERR(state); |
2731 | if (IS_ERR(state)) | 2621 | if (IS_ERR(state)) |
2732 | goto out; | 2622 | goto out; |
2623 | ctx->state = state; | ||
2733 | if (server->caps & NFS_CAP_POSIX_LOCK) | 2624 | if (server->caps & NFS_CAP_POSIX_LOCK) |
2734 | set_bit(NFS_STATE_POSIX_LOCKS, &state->flags); | 2625 | set_bit(NFS_STATE_POSIX_LOCKS, &state->flags); |
2735 | if (opendata->o_res.rflags & NFS4_OPEN_RESULT_MAY_NOTIFY_LOCK) | 2626 | if (opendata->o_res.rflags & NFS4_OPEN_RESULT_MAY_NOTIFY_LOCK) |
@@ -2755,7 +2646,6 @@ static int _nfs4_open_and_get_state(struct nfs4_opendata *opendata, | |||
2755 | if (ret != 0) | 2646 | if (ret != 0) |
2756 | goto out; | 2647 | goto out; |
2757 | 2648 | ||
2758 | ctx->state = state; | ||
2759 | if (d_inode(dentry) == state->inode) { | 2649 | if (d_inode(dentry) == state->inode) { |
2760 | nfs_inode_attach_open_context(ctx); | 2650 | nfs_inode_attach_open_context(ctx); |
2761 | if (read_seqcount_retry(&sp->so_reclaim_seqcount, seq)) | 2651 | if (read_seqcount_retry(&sp->so_reclaim_seqcount, seq)) |
@@ -2794,7 +2684,7 @@ static int _nfs4_do_open(struct inode *dir, | |||
2794 | dprintk("nfs4_do_open: nfs4_get_state_owner failed!\n"); | 2684 | dprintk("nfs4_do_open: nfs4_get_state_owner failed!\n"); |
2795 | goto out_err; | 2685 | goto out_err; |
2796 | } | 2686 | } |
2797 | status = nfs4_recover_expired_lease(server); | 2687 | status = nfs4_client_recover_expired_lease(server->nfs_client); |
2798 | if (status != 0) | 2688 | if (status != 0) |
2799 | goto err_put_state_owner; | 2689 | goto err_put_state_owner; |
2800 | if (d_really_is_positive(dentry)) | 2690 | if (d_really_is_positive(dentry)) |
@@ -2940,12 +2830,12 @@ static int _nfs4_do_setattr(struct inode *inode, | |||
2940 | struct nfs_open_context *ctx) | 2830 | struct nfs_open_context *ctx) |
2941 | { | 2831 | { |
2942 | struct nfs_server *server = NFS_SERVER(inode); | 2832 | struct nfs_server *server = NFS_SERVER(inode); |
2943 | struct rpc_message msg = { | 2833 | struct rpc_message msg = { |
2944 | .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SETATTR], | 2834 | .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SETATTR], |
2945 | .rpc_argp = arg, | 2835 | .rpc_argp = arg, |
2946 | .rpc_resp = res, | 2836 | .rpc_resp = res, |
2947 | .rpc_cred = cred, | 2837 | .rpc_cred = cred, |
2948 | }; | 2838 | }; |
2949 | struct rpc_cred *delegation_cred = NULL; | 2839 | struct rpc_cred *delegation_cred = NULL; |
2950 | unsigned long timestamp = jiffies; | 2840 | unsigned long timestamp = jiffies; |
2951 | fmode_t fmode; | 2841 | fmode_t fmode; |
@@ -2993,18 +2883,18 @@ static int nfs4_do_setattr(struct inode *inode, struct rpc_cred *cred, | |||
2993 | { | 2883 | { |
2994 | struct nfs_server *server = NFS_SERVER(inode); | 2884 | struct nfs_server *server = NFS_SERVER(inode); |
2995 | struct nfs4_state *state = ctx ? ctx->state : NULL; | 2885 | struct nfs4_state *state = ctx ? ctx->state : NULL; |
2996 | struct nfs_setattrargs arg = { | 2886 | struct nfs_setattrargs arg = { |
2997 | .fh = NFS_FH(inode), | 2887 | .fh = NFS_FH(inode), |
2998 | .iap = sattr, | 2888 | .iap = sattr, |
2999 | .server = server, | 2889 | .server = server, |
3000 | .bitmask = server->attr_bitmask, | 2890 | .bitmask = server->attr_bitmask, |
3001 | .label = ilabel, | 2891 | .label = ilabel, |
3002 | }; | 2892 | }; |
3003 | struct nfs_setattrres res = { | 2893 | struct nfs_setattrres res = { |
3004 | .fattr = fattr, | 2894 | .fattr = fattr, |
3005 | .label = olabel, | 2895 | .label = olabel, |
3006 | .server = server, | 2896 | .server = server, |
3007 | }; | 2897 | }; |
3008 | struct nfs4_exception exception = { | 2898 | struct nfs4_exception exception = { |
3009 | .state = state, | 2899 | .state = state, |
3010 | .inode = inode, | 2900 | .inode = inode, |
@@ -3118,7 +3008,7 @@ static void nfs4_close_done(struct rpc_task *task, void *data) | |||
3118 | } | 3008 | } |
3119 | } | 3009 | } |
3120 | 3010 | ||
3121 | /* hmm. we are done with the inode, and in the process of freeing | 3011 | /* hmm. we are done with the inode, and in the process of freeing |
3122 | * the state_owner. we keep this around to process errors | 3012 | * the state_owner. we keep this around to process errors |
3123 | */ | 3013 | */ |
3124 | switch (task->tk_status) { | 3014 | switch (task->tk_status) { |
@@ -3234,7 +3124,7 @@ static void nfs4_close_prepare(struct rpc_task *task, void *data) | |||
3234 | else if (calldata->arg.bitmask == NULL) | 3124 | else if (calldata->arg.bitmask == NULL) |
3235 | calldata->res.fattr = NULL; | 3125 | calldata->res.fattr = NULL; |
3236 | calldata->timestamp = jiffies; | 3126 | calldata->timestamp = jiffies; |
3237 | if (nfs4_setup_sequence(NFS_SERVER(inode), | 3127 | if (nfs4_setup_sequence(NFS_SERVER(inode)->nfs_client, |
3238 | &calldata->arg.seq_args, | 3128 | &calldata->arg.seq_args, |
3239 | &calldata->res.seq_res, | 3129 | &calldata->res.seq_res, |
3240 | task) != 0) | 3130 | task) != 0) |
@@ -3522,16 +3412,11 @@ static int nfs4_lookup_root_sec(struct nfs_server *server, struct nfs_fh *fhandl | |||
3522 | .pseudoflavor = flavor, | 3412 | .pseudoflavor = flavor, |
3523 | }; | 3413 | }; |
3524 | struct rpc_auth *auth; | 3414 | struct rpc_auth *auth; |
3525 | int ret; | ||
3526 | 3415 | ||
3527 | auth = rpcauth_create(&auth_args, server->client); | 3416 | auth = rpcauth_create(&auth_args, server->client); |
3528 | if (IS_ERR(auth)) { | 3417 | if (IS_ERR(auth)) |
3529 | ret = -EACCES; | 3418 | return -EACCES; |
3530 | goto out; | 3419 | return nfs4_lookup_root(server, fhandle, info); |
3531 | } | ||
3532 | ret = nfs4_lookup_root(server, fhandle, info); | ||
3533 | out: | ||
3534 | return ret; | ||
3535 | } | 3420 | } |
3536 | 3421 | ||
3537 | /* | 3422 | /* |
@@ -4114,7 +3999,7 @@ static void nfs4_proc_unlink_setup(struct rpc_message *msg, struct inode *dir) | |||
4114 | 3999 | ||
4115 | static void nfs4_proc_unlink_rpc_prepare(struct rpc_task *task, struct nfs_unlinkdata *data) | 4000 | static void nfs4_proc_unlink_rpc_prepare(struct rpc_task *task, struct nfs_unlinkdata *data) |
4116 | { | 4001 | { |
4117 | nfs4_setup_sequence(NFS_SB(data->dentry->d_sb), | 4002 | nfs4_setup_sequence(NFS_SB(data->dentry->d_sb)->nfs_client, |
4118 | &data->args.seq_args, | 4003 | &data->args.seq_args, |
4119 | &data->res.seq_res, | 4004 | &data->res.seq_res, |
4120 | task); | 4005 | task); |
@@ -4148,7 +4033,7 @@ static void nfs4_proc_rename_setup(struct rpc_message *msg, struct inode *dir) | |||
4148 | 4033 | ||
4149 | static void nfs4_proc_rename_rpc_prepare(struct rpc_task *task, struct nfs_renamedata *data) | 4034 | static void nfs4_proc_rename_rpc_prepare(struct rpc_task *task, struct nfs_renamedata *data) |
4150 | { | 4035 | { |
4151 | nfs4_setup_sequence(NFS_SERVER(data->old_dir), | 4036 | nfs4_setup_sequence(NFS_SERVER(data->old_dir)->nfs_client, |
4152 | &data->args.seq_args, | 4037 | &data->args.seq_args, |
4153 | &data->res.seq_res, | 4038 | &data->res.seq_res, |
4154 | task); | 4039 | task); |
@@ -4723,7 +4608,7 @@ static void nfs4_proc_read_setup(struct nfs_pgio_header *hdr, | |||
4723 | static int nfs4_proc_pgio_rpc_prepare(struct rpc_task *task, | 4608 | static int nfs4_proc_pgio_rpc_prepare(struct rpc_task *task, |
4724 | struct nfs_pgio_header *hdr) | 4609 | struct nfs_pgio_header *hdr) |
4725 | { | 4610 | { |
4726 | if (nfs4_setup_sequence(NFS_SERVER(hdr->inode), | 4611 | if (nfs4_setup_sequence(NFS_SERVER(hdr->inode)->nfs_client, |
4727 | &hdr->args.seq_args, | 4612 | &hdr->args.seq_args, |
4728 | &hdr->res.seq_res, | 4613 | &hdr->res.seq_res, |
4729 | task)) | 4614 | task)) |
@@ -4822,7 +4707,7 @@ static void nfs4_proc_write_setup(struct nfs_pgio_header *hdr, | |||
4822 | 4707 | ||
4823 | static void nfs4_proc_commit_rpc_prepare(struct rpc_task *task, struct nfs_commit_data *data) | 4708 | static void nfs4_proc_commit_rpc_prepare(struct rpc_task *task, struct nfs_commit_data *data) |
4824 | { | 4709 | { |
4825 | nfs4_setup_sequence(NFS_SERVER(data->inode), | 4710 | nfs4_setup_sequence(NFS_SERVER(data->inode)->nfs_client, |
4826 | &data->args.seq_args, | 4711 | &data->args.seq_args, |
4827 | &data->res.seq_res, | 4712 | &data->res.seq_res, |
4828 | task); | 4713 | task); |
@@ -4975,8 +4860,8 @@ static int buf_to_pages_noslab(const void *buf, size_t buflen, | |||
4975 | if (newpage == NULL) | 4860 | if (newpage == NULL) |
4976 | goto unwind; | 4861 | goto unwind; |
4977 | memcpy(page_address(newpage), buf, len); | 4862 | memcpy(page_address(newpage), buf, len); |
4978 | buf += len; | 4863 | buf += len; |
4979 | buflen -= len; | 4864 | buflen -= len; |
4980 | *pages++ = newpage; | 4865 | *pages++ = newpage; |
4981 | rc++; | 4866 | rc++; |
4982 | } while (buflen != 0); | 4867 | } while (buflen != 0); |
@@ -5069,7 +4954,7 @@ out: | |||
5069 | */ | 4954 | */ |
5070 | static ssize_t __nfs4_get_acl_uncached(struct inode *inode, void *buf, size_t buflen) | 4955 | static ssize_t __nfs4_get_acl_uncached(struct inode *inode, void *buf, size_t buflen) |
5071 | { | 4956 | { |
5072 | struct page *pages[NFS4ACL_MAXPAGES] = {NULL, }; | 4957 | struct page *pages[NFS4ACL_MAXPAGES + 1] = {NULL, }; |
5073 | struct nfs_getaclargs args = { | 4958 | struct nfs_getaclargs args = { |
5074 | .fh = NFS_FH(inode), | 4959 | .fh = NFS_FH(inode), |
5075 | .acl_pages = pages, | 4960 | .acl_pages = pages, |
@@ -5083,13 +4968,9 @@ static ssize_t __nfs4_get_acl_uncached(struct inode *inode, void *buf, size_t bu | |||
5083 | .rpc_argp = &args, | 4968 | .rpc_argp = &args, |
5084 | .rpc_resp = &res, | 4969 | .rpc_resp = &res, |
5085 | }; | 4970 | }; |
5086 | unsigned int npages = DIV_ROUND_UP(buflen, PAGE_SIZE); | 4971 | unsigned int npages = DIV_ROUND_UP(buflen, PAGE_SIZE) + 1; |
5087 | int ret = -ENOMEM, i; | 4972 | int ret = -ENOMEM, i; |
5088 | 4973 | ||
5089 | /* As long as we're doing a round trip to the server anyway, | ||
5090 | * let's be prepared for a page of acl data. */ | ||
5091 | if (npages == 0) | ||
5092 | npages = 1; | ||
5093 | if (npages > ARRAY_SIZE(pages)) | 4974 | if (npages > ARRAY_SIZE(pages)) |
5094 | return -ERANGE; | 4975 | return -ERANGE; |
5095 | 4976 | ||
@@ -5299,8 +5180,8 @@ static int _nfs4_do_set_security_label(struct inode *inode, | |||
5299 | struct nfs_server *server = NFS_SERVER(inode); | 5180 | struct nfs_server *server = NFS_SERVER(inode); |
5300 | const u32 bitmask[3] = { 0, 0, FATTR4_WORD2_SECURITY_LABEL }; | 5181 | const u32 bitmask[3] = { 0, 0, FATTR4_WORD2_SECURITY_LABEL }; |
5301 | struct nfs_setattrargs arg = { | 5182 | struct nfs_setattrargs arg = { |
5302 | .fh = NFS_FH(inode), | 5183 | .fh = NFS_FH(inode), |
5303 | .iap = &sattr, | 5184 | .iap = &sattr, |
5304 | .server = server, | 5185 | .server = server, |
5305 | .bitmask = bitmask, | 5186 | .bitmask = bitmask, |
5306 | .label = ilabel, | 5187 | .label = ilabel, |
@@ -5311,9 +5192,9 @@ static int _nfs4_do_set_security_label(struct inode *inode, | |||
5311 | .server = server, | 5192 | .server = server, |
5312 | }; | 5193 | }; |
5313 | struct rpc_message msg = { | 5194 | struct rpc_message msg = { |
5314 | .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SETATTR], | 5195 | .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_SETATTR], |
5315 | .rpc_argp = &arg, | 5196 | .rpc_argp = &arg, |
5316 | .rpc_resp = &res, | 5197 | .rpc_resp = &res, |
5317 | }; | 5198 | }; |
5318 | int status; | 5199 | int status; |
5319 | 5200 | ||
@@ -5747,7 +5628,7 @@ static void nfs4_delegreturn_prepare(struct rpc_task *task, void *data) | |||
5747 | if (!d_data->lr.roc && nfs4_wait_on_layoutreturn(d_data->inode, task)) | 5628 | if (!d_data->lr.roc && nfs4_wait_on_layoutreturn(d_data->inode, task)) |
5748 | return; | 5629 | return; |
5749 | 5630 | ||
5750 | nfs4_setup_sequence(d_data->res.server, | 5631 | nfs4_setup_sequence(d_data->res.server->nfs_client, |
5751 | &d_data->args.seq_args, | 5632 | &d_data->args.seq_args, |
5752 | &d_data->res.seq_res, | 5633 | &d_data->res.seq_res, |
5753 | task); | 5634 | task); |
@@ -5817,7 +5698,7 @@ static int _nfs4_proc_delegreturn(struct inode *inode, struct rpc_cred *cred, co | |||
5817 | return PTR_ERR(task); | 5698 | return PTR_ERR(task); |
5818 | if (!issync) | 5699 | if (!issync) |
5819 | goto out; | 5700 | goto out; |
5820 | status = nfs4_wait_for_completion_rpc_task(task); | 5701 | status = rpc_wait_for_completion_task(task); |
5821 | if (status != 0) | 5702 | if (status != 0) |
5822 | goto out; | 5703 | goto out; |
5823 | status = data->rpc_status; | 5704 | status = data->rpc_status; |
@@ -5859,8 +5740,8 @@ static int _nfs4_proc_getlk(struct nfs4_state *state, int cmd, struct file_lock | |||
5859 | }; | 5740 | }; |
5860 | struct rpc_message msg = { | 5741 | struct rpc_message msg = { |
5861 | .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LOCKT], | 5742 | .rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_LOCKT], |
5862 | .rpc_argp = &arg, | 5743 | .rpc_argp = &arg, |
5863 | .rpc_resp = &res, | 5744 | .rpc_resp = &res, |
5864 | .rpc_cred = state->owner->so_cred, | 5745 | .rpc_cred = state->owner->so_cred, |
5865 | }; | 5746 | }; |
5866 | struct nfs4_lock_state *lsp; | 5747 | struct nfs4_lock_state *lsp; |
@@ -5989,7 +5870,7 @@ static void nfs4_locku_prepare(struct rpc_task *task, void *data) | |||
5989 | goto out_no_action; | 5870 | goto out_no_action; |
5990 | } | 5871 | } |
5991 | calldata->timestamp = jiffies; | 5872 | calldata->timestamp = jiffies; |
5992 | if (nfs4_setup_sequence(calldata->server, | 5873 | if (nfs4_setup_sequence(calldata->server->nfs_client, |
5993 | &calldata->arg.seq_args, | 5874 | &calldata->arg.seq_args, |
5994 | &calldata->res.seq_res, | 5875 | &calldata->res.seq_res, |
5995 | task) != 0) | 5876 | task) != 0) |
@@ -6087,7 +5968,7 @@ static int nfs4_proc_unlck(struct nfs4_state *state, int cmd, struct file_lock * | |||
6087 | status = PTR_ERR(task); | 5968 | status = PTR_ERR(task); |
6088 | if (IS_ERR(task)) | 5969 | if (IS_ERR(task)) |
6089 | goto out; | 5970 | goto out; |
6090 | status = nfs4_wait_for_completion_rpc_task(task); | 5971 | status = rpc_wait_for_completion_task(task); |
6091 | rpc_put_task(task); | 5972 | rpc_put_task(task); |
6092 | out: | 5973 | out: |
6093 | request->fl_flags = fl_flags; | 5974 | request->fl_flags = fl_flags; |
@@ -6174,7 +6055,7 @@ static void nfs4_lock_prepare(struct rpc_task *task, void *calldata) | |||
6174 | goto out_release_open_seqid; | 6055 | goto out_release_open_seqid; |
6175 | } | 6056 | } |
6176 | data->timestamp = jiffies; | 6057 | data->timestamp = jiffies; |
6177 | if (nfs4_setup_sequence(data->server, | 6058 | if (nfs4_setup_sequence(data->server->nfs_client, |
6178 | &data->arg.seq_args, | 6059 | &data->arg.seq_args, |
6179 | &data->res.seq_res, | 6060 | &data->res.seq_res, |
6180 | task) == 0) | 6061 | task) == 0) |
@@ -6314,7 +6195,7 @@ static int _nfs4_do_setlk(struct nfs4_state *state, int cmd, struct file_lock *f | |||
6314 | task = rpc_run_task(&task_setup_data); | 6195 | task = rpc_run_task(&task_setup_data); |
6315 | if (IS_ERR(task)) | 6196 | if (IS_ERR(task)) |
6316 | return PTR_ERR(task); | 6197 | return PTR_ERR(task); |
6317 | ret = nfs4_wait_for_completion_rpc_task(task); | 6198 | ret = rpc_wait_for_completion_task(task); |
6318 | if (ret == 0) { | 6199 | if (ret == 0) { |
6319 | ret = data->rpc_status; | 6200 | ret = data->rpc_status; |
6320 | if (ret) | 6201 | if (ret) |
@@ -6393,8 +6274,7 @@ static int nfs41_lock_expired(struct nfs4_state *state, struct file_lock *reques | |||
6393 | if (test_bit(NFS_LOCK_INITIALIZED, &lsp->ls_flags) || | 6274 | if (test_bit(NFS_LOCK_INITIALIZED, &lsp->ls_flags) || |
6394 | test_bit(NFS_LOCK_LOST, &lsp->ls_flags)) | 6275 | test_bit(NFS_LOCK_LOST, &lsp->ls_flags)) |
6395 | return 0; | 6276 | return 0; |
6396 | status = nfs4_lock_expired(state, request); | 6277 | return nfs4_lock_expired(state, request); |
6397 | return status; | ||
6398 | } | 6278 | } |
6399 | #endif | 6279 | #endif |
6400 | 6280 | ||
@@ -6640,8 +6520,8 @@ static void nfs4_release_lockowner_prepare(struct rpc_task *task, void *calldata | |||
6640 | { | 6520 | { |
6641 | struct nfs_release_lockowner_data *data = calldata; | 6521 | struct nfs_release_lockowner_data *data = calldata; |
6642 | struct nfs_server *server = data->server; | 6522 | struct nfs_server *server = data->server; |
6643 | nfs40_setup_sequence(server->nfs_client->cl_slot_tbl, | 6523 | nfs4_setup_sequence(server->nfs_client, &data->args.seq_args, |
6644 | &data->args.seq_args, &data->res.seq_res, task); | 6524 | &data->res.seq_res, task); |
6645 | data->args.lock_owner.clientid = server->nfs_client->cl_clientid; | 6525 | data->args.lock_owner.clientid = server->nfs_client->cl_clientid; |
6646 | data->timestamp = jiffies; | 6526 | data->timestamp = jiffies; |
6647 | } | 6527 | } |
@@ -7232,11 +7112,9 @@ static bool | |||
7232 | nfs41_same_server_scope(struct nfs41_server_scope *a, | 7112 | nfs41_same_server_scope(struct nfs41_server_scope *a, |
7233 | struct nfs41_server_scope *b) | 7113 | struct nfs41_server_scope *b) |
7234 | { | 7114 | { |
7235 | if (a->server_scope_sz == b->server_scope_sz && | 7115 | if (a->server_scope_sz != b->server_scope_sz) |
7236 | memcmp(a->server_scope, b->server_scope, a->server_scope_sz) == 0) | 7116 | return false; |
7237 | return true; | 7117 | return memcmp(a->server_scope, b->server_scope, a->server_scope_sz) == 0; |
7238 | |||
7239 | return false; | ||
7240 | } | 7118 | } |
7241 | 7119 | ||
7242 | static void | 7120 | static void |
@@ -7831,7 +7709,7 @@ static void nfs4_get_lease_time_prepare(struct rpc_task *task, | |||
7831 | dprintk("--> %s\n", __func__); | 7709 | dprintk("--> %s\n", __func__); |
7832 | /* just setup sequence, do not trigger session recovery | 7710 | /* just setup sequence, do not trigger session recovery |
7833 | since we're invoked within one */ | 7711 | since we're invoked within one */ |
7834 | nfs41_setup_sequence(data->clp->cl_session, | 7712 | nfs4_setup_sequence(data->clp, |
7835 | &data->args->la_seq_args, | 7713 | &data->args->la_seq_args, |
7836 | &data->res->lr_seq_res, | 7714 | &data->res->lr_seq_res, |
7837 | task); | 7715 | task); |
@@ -8202,7 +8080,7 @@ static void nfs41_sequence_prepare(struct rpc_task *task, void *data) | |||
8202 | args = task->tk_msg.rpc_argp; | 8080 | args = task->tk_msg.rpc_argp; |
8203 | res = task->tk_msg.rpc_resp; | 8081 | res = task->tk_msg.rpc_resp; |
8204 | 8082 | ||
8205 | nfs41_setup_sequence(clp->cl_session, args, res, task); | 8083 | nfs4_setup_sequence(clp, args, res, task); |
8206 | } | 8084 | } |
8207 | 8085 | ||
8208 | static const struct rpc_call_ops nfs41_sequence_ops = { | 8086 | static const struct rpc_call_ops nfs41_sequence_ops = { |
@@ -8290,7 +8168,7 @@ static void nfs4_reclaim_complete_prepare(struct rpc_task *task, void *data) | |||
8290 | { | 8168 | { |
8291 | struct nfs4_reclaim_complete_data *calldata = data; | 8169 | struct nfs4_reclaim_complete_data *calldata = data; |
8292 | 8170 | ||
8293 | nfs41_setup_sequence(calldata->clp->cl_session, | 8171 | nfs4_setup_sequence(calldata->clp, |
8294 | &calldata->arg.seq_args, | 8172 | &calldata->arg.seq_args, |
8295 | &calldata->res.seq_res, | 8173 | &calldata->res.seq_res, |
8296 | task); | 8174 | task); |
@@ -8382,7 +8260,7 @@ static int nfs41_proc_reclaim_complete(struct nfs_client *clp, | |||
8382 | status = PTR_ERR(task); | 8260 | status = PTR_ERR(task); |
8383 | goto out; | 8261 | goto out; |
8384 | } | 8262 | } |
8385 | status = nfs4_wait_for_completion_rpc_task(task); | 8263 | status = rpc_wait_for_completion_task(task); |
8386 | if (status == 0) | 8264 | if (status == 0) |
8387 | status = task->tk_status; | 8265 | status = task->tk_status; |
8388 | rpc_put_task(task); | 8266 | rpc_put_task(task); |
@@ -8397,10 +8275,9 @@ nfs4_layoutget_prepare(struct rpc_task *task, void *calldata) | |||
8397 | { | 8275 | { |
8398 | struct nfs4_layoutget *lgp = calldata; | 8276 | struct nfs4_layoutget *lgp = calldata; |
8399 | struct nfs_server *server = NFS_SERVER(lgp->args.inode); | 8277 | struct nfs_server *server = NFS_SERVER(lgp->args.inode); |
8400 | struct nfs4_session *session = nfs4_get_session(server); | ||
8401 | 8278 | ||
8402 | dprintk("--> %s\n", __func__); | 8279 | dprintk("--> %s\n", __func__); |
8403 | nfs41_setup_sequence(session, &lgp->args.seq_args, | 8280 | nfs4_setup_sequence(server->nfs_client, &lgp->args.seq_args, |
8404 | &lgp->res.seq_res, task); | 8281 | &lgp->res.seq_res, task); |
8405 | dprintk("<-- %s\n", __func__); | 8282 | dprintk("<-- %s\n", __func__); |
8406 | } | 8283 | } |
@@ -8615,7 +8492,7 @@ nfs4_proc_layoutget(struct nfs4_layoutget *lgp, long *timeout, gfp_t gfp_flags) | |||
8615 | task = rpc_run_task(&task_setup_data); | 8492 | task = rpc_run_task(&task_setup_data); |
8616 | if (IS_ERR(task)) | 8493 | if (IS_ERR(task)) |
8617 | return ERR_CAST(task); | 8494 | return ERR_CAST(task); |
8618 | status = nfs4_wait_for_completion_rpc_task(task); | 8495 | status = rpc_wait_for_completion_task(task); |
8619 | if (status == 0) { | 8496 | if (status == 0) { |
8620 | status = nfs4_layoutget_handle_exception(task, lgp, &exception); | 8497 | status = nfs4_layoutget_handle_exception(task, lgp, &exception); |
8621 | *timeout = exception.timeout; | 8498 | *timeout = exception.timeout; |
@@ -8644,7 +8521,7 @@ nfs4_layoutreturn_prepare(struct rpc_task *task, void *calldata) | |||
8644 | struct nfs4_layoutreturn *lrp = calldata; | 8521 | struct nfs4_layoutreturn *lrp = calldata; |
8645 | 8522 | ||
8646 | dprintk("--> %s\n", __func__); | 8523 | dprintk("--> %s\n", __func__); |
8647 | nfs41_setup_sequence(lrp->clp->cl_session, | 8524 | nfs4_setup_sequence(lrp->clp, |
8648 | &lrp->args.seq_args, | 8525 | &lrp->args.seq_args, |
8649 | &lrp->res.seq_res, | 8526 | &lrp->res.seq_res, |
8650 | task); | 8527 | task); |
@@ -8794,9 +8671,8 @@ static void nfs4_layoutcommit_prepare(struct rpc_task *task, void *calldata) | |||
8794 | { | 8671 | { |
8795 | struct nfs4_layoutcommit_data *data = calldata; | 8672 | struct nfs4_layoutcommit_data *data = calldata; |
8796 | struct nfs_server *server = NFS_SERVER(data->args.inode); | 8673 | struct nfs_server *server = NFS_SERVER(data->args.inode); |
8797 | struct nfs4_session *session = nfs4_get_session(server); | ||
8798 | 8674 | ||
8799 | nfs41_setup_sequence(session, | 8675 | nfs4_setup_sequence(server->nfs_client, |
8800 | &data->args.seq_args, | 8676 | &data->args.seq_args, |
8801 | &data->res.seq_res, | 8677 | &data->res.seq_res, |
8802 | task); | 8678 | task); |
@@ -9120,7 +8996,7 @@ struct nfs_free_stateid_data { | |||
9120 | static void nfs41_free_stateid_prepare(struct rpc_task *task, void *calldata) | 8996 | static void nfs41_free_stateid_prepare(struct rpc_task *task, void *calldata) |
9121 | { | 8997 | { |
9122 | struct nfs_free_stateid_data *data = calldata; | 8998 | struct nfs_free_stateid_data *data = calldata; |
9123 | nfs41_setup_sequence(nfs4_get_session(data->server), | 8999 | nfs4_setup_sequence(data->server->nfs_client, |
9124 | &data->args.seq_args, | 9000 | &data->args.seq_args, |
9125 | &data->res.seq_res, | 9001 | &data->res.seq_res, |
9126 | task); | 9002 | task); |
@@ -9232,10 +9108,8 @@ static bool nfs41_match_stateid(const nfs4_stateid *s1, | |||
9232 | 9108 | ||
9233 | if (s1->seqid == s2->seqid) | 9109 | if (s1->seqid == s2->seqid) |
9234 | return true; | 9110 | return true; |
9235 | if (s1->seqid == 0 || s2->seqid == 0) | ||
9236 | return true; | ||
9237 | 9111 | ||
9238 | return false; | 9112 | return s1->seqid == 0 || s2->seqid == 0; |
9239 | } | 9113 | } |
9240 | 9114 | ||
9241 | #endif /* CONFIG_NFS_V4_1 */ | 9115 | #endif /* CONFIG_NFS_V4_1 */ |
diff --git a/fs/nfs/nfs4renewd.c b/fs/nfs/nfs4renewd.c index 82e77198d17e..1f8c2ae43a8d 100644 --- a/fs/nfs/nfs4renewd.c +++ b/fs/nfs/nfs4renewd.c | |||
@@ -153,7 +153,7 @@ void nfs4_set_lease_period(struct nfs_client *clp, | |||
153 | spin_unlock(&clp->cl_lock); | 153 | spin_unlock(&clp->cl_lock); |
154 | 154 | ||
155 | /* Cap maximum reconnect timeout at 1/2 lease period */ | 155 | /* Cap maximum reconnect timeout at 1/2 lease period */ |
156 | rpc_cap_max_reconnect_timeout(clp->cl_rpcclient, lease >> 1); | 156 | rpc_set_connect_timeout(clp->cl_rpcclient, lease, lease >> 1); |
157 | } | 157 | } |
158 | 158 | ||
159 | /* | 159 | /* |
diff --git a/fs/nfs/nfs4session.h b/fs/nfs/nfs4session.h index dae385500005..dfae4880eacb 100644 --- a/fs/nfs/nfs4session.h +++ b/fs/nfs/nfs4session.h | |||
@@ -103,6 +103,11 @@ static inline bool nfs4_test_locked_slot(const struct nfs4_slot_table *tbl, | |||
103 | return !!test_bit(slotid, tbl->used_slots); | 103 | return !!test_bit(slotid, tbl->used_slots); |
104 | } | 104 | } |
105 | 105 | ||
106 | static inline struct nfs4_session *nfs4_get_session(const struct nfs_client *clp) | ||
107 | { | ||
108 | return clp->cl_session; | ||
109 | } | ||
110 | |||
106 | #if defined(CONFIG_NFS_V4_1) | 111 | #if defined(CONFIG_NFS_V4_1) |
107 | extern void nfs41_set_target_slotid(struct nfs4_slot_table *tbl, | 112 | extern void nfs41_set_target_slotid(struct nfs4_slot_table *tbl, |
108 | u32 target_highest_slotid); | 113 | u32 target_highest_slotid); |
@@ -170,6 +175,8 @@ static inline int nfs4_has_persistent_session(const struct nfs_client *clp) | |||
170 | return 0; | 175 | return 0; |
171 | } | 176 | } |
172 | 177 | ||
178 | #define nfs_session_id_hash(session) (0) | ||
179 | |||
173 | #endif /* defined(CONFIG_NFS_V4_1) */ | 180 | #endif /* defined(CONFIG_NFS_V4_1) */ |
174 | #endif /* IS_ENABLED(CONFIG_NFS_V4) */ | 181 | #endif /* IS_ENABLED(CONFIG_NFS_V4) */ |
175 | #endif /* __LINUX_FS_NFS_NFS4SESSION_H */ | 182 | #endif /* __LINUX_FS_NFS_NFS4SESSION_H */ |
diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c index daeb94e3acd4..8156bad6b441 100644 --- a/fs/nfs/nfs4state.c +++ b/fs/nfs/nfs4state.c | |||
@@ -868,7 +868,7 @@ static struct nfs4_lock_state *nfs4_get_lock_state(struct nfs4_state *state, fl_ | |||
868 | 868 | ||
869 | for(;;) { | 869 | for(;;) { |
870 | spin_lock(&state->state_lock); | 870 | spin_lock(&state->state_lock); |
871 | lsp = __nfs4_find_lock_state(state, owner, 0); | 871 | lsp = __nfs4_find_lock_state(state, owner, NULL); |
872 | if (lsp != NULL) | 872 | if (lsp != NULL) |
873 | break; | 873 | break; |
874 | if (new != NULL) { | 874 | if (new != NULL) { |
diff --git a/fs/nfs/nfs4trace.h b/fs/nfs/nfs4trace.h index cfb8f7ce5cf6..845d0eadefc9 100644 --- a/fs/nfs/nfs4trace.h +++ b/fs/nfs/nfs4trace.h | |||
@@ -241,38 +241,6 @@ DEFINE_NFS4_CLIENTID_EVENT(nfs4_bind_conn_to_session); | |||
241 | DEFINE_NFS4_CLIENTID_EVENT(nfs4_sequence); | 241 | DEFINE_NFS4_CLIENTID_EVENT(nfs4_sequence); |
242 | DEFINE_NFS4_CLIENTID_EVENT(nfs4_reclaim_complete); | 242 | DEFINE_NFS4_CLIENTID_EVENT(nfs4_reclaim_complete); |
243 | 243 | ||
244 | TRACE_EVENT(nfs4_setup_sequence, | ||
245 | TP_PROTO( | ||
246 | const struct nfs4_session *session, | ||
247 | const struct nfs4_sequence_args *args | ||
248 | ), | ||
249 | TP_ARGS(session, args), | ||
250 | |||
251 | TP_STRUCT__entry( | ||
252 | __field(unsigned int, session) | ||
253 | __field(unsigned int, slot_nr) | ||
254 | __field(unsigned int, seq_nr) | ||
255 | __field(unsigned int, highest_used_slotid) | ||
256 | ), | ||
257 | |||
258 | TP_fast_assign( | ||
259 | const struct nfs4_slot *sa_slot = args->sa_slot; | ||
260 | __entry->session = nfs_session_id_hash(&session->sess_id); | ||
261 | __entry->slot_nr = sa_slot->slot_nr; | ||
262 | __entry->seq_nr = sa_slot->seq_nr; | ||
263 | __entry->highest_used_slotid = | ||
264 | sa_slot->table->highest_used_slotid; | ||
265 | ), | ||
266 | TP_printk( | ||
267 | "session=0x%08x slot_nr=%u seq_nr=%u " | ||
268 | "highest_used_slotid=%u", | ||
269 | __entry->session, | ||
270 | __entry->slot_nr, | ||
271 | __entry->seq_nr, | ||
272 | __entry->highest_used_slotid | ||
273 | ) | ||
274 | ); | ||
275 | |||
276 | #define show_nfs4_sequence_status_flags(status) \ | 244 | #define show_nfs4_sequence_status_flags(status) \ |
277 | __print_flags((unsigned long)status, "|", \ | 245 | __print_flags((unsigned long)status, "|", \ |
278 | { SEQ4_STATUS_CB_PATH_DOWN, "CB_PATH_DOWN" }, \ | 246 | { SEQ4_STATUS_CB_PATH_DOWN, "CB_PATH_DOWN" }, \ |
@@ -382,6 +350,38 @@ TRACE_EVENT(nfs4_cb_sequence, | |||
382 | ); | 350 | ); |
383 | #endif /* CONFIG_NFS_V4_1 */ | 351 | #endif /* CONFIG_NFS_V4_1 */ |
384 | 352 | ||
353 | TRACE_EVENT(nfs4_setup_sequence, | ||
354 | TP_PROTO( | ||
355 | const struct nfs4_session *session, | ||
356 | const struct nfs4_sequence_args *args | ||
357 | ), | ||
358 | TP_ARGS(session, args), | ||
359 | |||
360 | TP_STRUCT__entry( | ||
361 | __field(unsigned int, session) | ||
362 | __field(unsigned int, slot_nr) | ||
363 | __field(unsigned int, seq_nr) | ||
364 | __field(unsigned int, highest_used_slotid) | ||
365 | ), | ||
366 | |||
367 | TP_fast_assign( | ||
368 | const struct nfs4_slot *sa_slot = args->sa_slot; | ||
369 | __entry->session = session ? nfs_session_id_hash(&session->sess_id) : 0; | ||
370 | __entry->slot_nr = sa_slot->slot_nr; | ||
371 | __entry->seq_nr = sa_slot->seq_nr; | ||
372 | __entry->highest_used_slotid = | ||
373 | sa_slot->table->highest_used_slotid; | ||
374 | ), | ||
375 | TP_printk( | ||
376 | "session=0x%08x slot_nr=%u seq_nr=%u " | ||
377 | "highest_used_slotid=%u", | ||
378 | __entry->session, | ||
379 | __entry->slot_nr, | ||
380 | __entry->seq_nr, | ||
381 | __entry->highest_used_slotid | ||
382 | ) | ||
383 | ); | ||
384 | |||
385 | DECLARE_EVENT_CLASS(nfs4_open_event, | 385 | DECLARE_EVENT_CLASS(nfs4_open_event, |
386 | TP_PROTO( | 386 | TP_PROTO( |
387 | const struct nfs_open_context *ctx, | 387 | const struct nfs_open_context *ctx, |
diff --git a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c index e9255cb453e6..f0369e362753 100644 --- a/fs/nfs/nfs4xdr.c +++ b/fs/nfs/nfs4xdr.c | |||
@@ -169,8 +169,10 @@ static int nfs4_stat_to_errno(int); | |||
169 | open_owner_id_maxsz + \ | 169 | open_owner_id_maxsz + \ |
170 | encode_opentype_maxsz + \ | 170 | encode_opentype_maxsz + \ |
171 | encode_claim_null_maxsz) | 171 | encode_claim_null_maxsz) |
172 | #define decode_space_limit_maxsz (3) | ||
172 | #define decode_ace_maxsz (3 + nfs4_owner_maxsz) | 173 | #define decode_ace_maxsz (3 + nfs4_owner_maxsz) |
173 | #define decode_delegation_maxsz (1 + decode_stateid_maxsz + 1 + \ | 174 | #define decode_delegation_maxsz (1 + decode_stateid_maxsz + 1 + \ |
175 | decode_space_limit_maxsz + \ | ||
174 | decode_ace_maxsz) | 176 | decode_ace_maxsz) |
175 | #define decode_change_info_maxsz (5) | 177 | #define decode_change_info_maxsz (5) |
176 | #define decode_open_maxsz (op_decode_hdr_maxsz + \ | 178 | #define decode_open_maxsz (op_decode_hdr_maxsz + \ |
@@ -924,34 +926,22 @@ static __be32 *reserve_space(struct xdr_stream *xdr, size_t nbytes) | |||
924 | 926 | ||
925 | static void encode_opaque_fixed(struct xdr_stream *xdr, const void *buf, size_t len) | 927 | static void encode_opaque_fixed(struct xdr_stream *xdr, const void *buf, size_t len) |
926 | { | 928 | { |
927 | __be32 *p; | 929 | WARN_ON_ONCE(xdr_stream_encode_opaque_fixed(xdr, buf, len) < 0); |
928 | |||
929 | p = xdr_reserve_space(xdr, len); | ||
930 | xdr_encode_opaque_fixed(p, buf, len); | ||
931 | } | 930 | } |
932 | 931 | ||
933 | static void encode_string(struct xdr_stream *xdr, unsigned int len, const char *str) | 932 | static void encode_string(struct xdr_stream *xdr, unsigned int len, const char *str) |
934 | { | 933 | { |
935 | __be32 *p; | 934 | WARN_ON_ONCE(xdr_stream_encode_opaque(xdr, str, len) < 0); |
936 | |||
937 | p = reserve_space(xdr, 4 + len); | ||
938 | xdr_encode_opaque(p, str, len); | ||
939 | } | 935 | } |
940 | 936 | ||
941 | static void encode_uint32(struct xdr_stream *xdr, u32 n) | 937 | static void encode_uint32(struct xdr_stream *xdr, u32 n) |
942 | { | 938 | { |
943 | __be32 *p; | 939 | WARN_ON_ONCE(xdr_stream_encode_u32(xdr, n) < 0); |
944 | |||
945 | p = reserve_space(xdr, 4); | ||
946 | *p = cpu_to_be32(n); | ||
947 | } | 940 | } |
948 | 941 | ||
949 | static void encode_uint64(struct xdr_stream *xdr, u64 n) | 942 | static void encode_uint64(struct xdr_stream *xdr, u64 n) |
950 | { | 943 | { |
951 | __be32 *p; | 944 | WARN_ON_ONCE(xdr_stream_encode_u64(xdr, n) < 0); |
952 | |||
953 | p = reserve_space(xdr, 8); | ||
954 | xdr_encode_hyper(p, n); | ||
955 | } | 945 | } |
956 | 946 | ||
957 | static void encode_nfs4_seqid(struct xdr_stream *xdr, | 947 | static void encode_nfs4_seqid(struct xdr_stream *xdr, |
@@ -2524,7 +2514,7 @@ static void nfs4_xdr_enc_getacl(struct rpc_rqst *req, struct xdr_stream *xdr, | |||
2524 | encode_compound_hdr(xdr, req, &hdr); | 2514 | encode_compound_hdr(xdr, req, &hdr); |
2525 | encode_sequence(xdr, &args->seq_args, &hdr); | 2515 | encode_sequence(xdr, &args->seq_args, &hdr); |
2526 | encode_putfh(xdr, args->fh, &hdr); | 2516 | encode_putfh(xdr, args->fh, &hdr); |
2527 | replen = hdr.replen + op_decode_hdr_maxsz + 1; | 2517 | replen = hdr.replen + op_decode_hdr_maxsz; |
2528 | encode_getattr_two(xdr, FATTR4_WORD0_ACL, 0, &hdr); | 2518 | encode_getattr_two(xdr, FATTR4_WORD0_ACL, 0, &hdr); |
2529 | 2519 | ||
2530 | xdr_inline_pages(&req->rq_rcv_buf, replen << 2, | 2520 | xdr_inline_pages(&req->rq_rcv_buf, replen << 2, |
@@ -3062,20 +3052,15 @@ static void print_overflow_msg(const char *func, const struct xdr_stream *xdr) | |||
3062 | 3052 | ||
3063 | static int decode_opaque_inline(struct xdr_stream *xdr, unsigned int *len, char **string) | 3053 | static int decode_opaque_inline(struct xdr_stream *xdr, unsigned int *len, char **string) |
3064 | { | 3054 | { |
3065 | __be32 *p; | 3055 | ssize_t ret = xdr_stream_decode_opaque_inline(xdr, (void **)string, |
3066 | 3056 | NFS4_OPAQUE_LIMIT); | |
3067 | p = xdr_inline_decode(xdr, 4); | 3057 | if (unlikely(ret < 0)) { |
3068 | if (unlikely(!p)) | 3058 | if (ret == -EBADMSG) |
3069 | goto out_overflow; | 3059 | print_overflow_msg(__func__, xdr); |
3070 | *len = be32_to_cpup(p); | 3060 | return -EIO; |
3071 | p = xdr_inline_decode(xdr, *len); | 3061 | } |
3072 | if (unlikely(!p)) | 3062 | *len = ret; |
3073 | goto out_overflow; | ||
3074 | *string = (char *)p; | ||
3075 | return 0; | 3063 | return 0; |
3076 | out_overflow: | ||
3077 | print_overflow_msg(__func__, xdr); | ||
3078 | return -EIO; | ||
3079 | } | 3064 | } |
3080 | 3065 | ||
3081 | static int decode_compound_hdr(struct xdr_stream *xdr, struct compound_hdr *hdr) | 3066 | static int decode_compound_hdr(struct xdr_stream *xdr, struct compound_hdr *hdr) |
@@ -3142,7 +3127,7 @@ static int decode_op_hdr(struct xdr_stream *xdr, enum nfs_opnum4 expected) | |||
3142 | } | 3127 | } |
3143 | 3128 | ||
3144 | /* Dummy routine */ | 3129 | /* Dummy routine */ |
3145 | static int decode_ace(struct xdr_stream *xdr, void *ace, struct nfs_client *clp) | 3130 | static int decode_ace(struct xdr_stream *xdr, void *ace) |
3146 | { | 3131 | { |
3147 | __be32 *p; | 3132 | __be32 *p; |
3148 | unsigned int strlen; | 3133 | unsigned int strlen; |
@@ -3890,45 +3875,50 @@ out_overflow: | |||
3890 | return -EIO; | 3875 | return -EIO; |
3891 | } | 3876 | } |
3892 | 3877 | ||
3878 | static ssize_t decode_nfs4_string(struct xdr_stream *xdr, | ||
3879 | struct nfs4_string *name, gfp_t gfp_flags) | ||
3880 | { | ||
3881 | ssize_t ret; | ||
3882 | |||
3883 | ret = xdr_stream_decode_string_dup(xdr, &name->data, | ||
3884 | XDR_MAX_NETOBJ, gfp_flags); | ||
3885 | name->len = 0; | ||
3886 | if (ret > 0) | ||
3887 | name->len = ret; | ||
3888 | return ret; | ||
3889 | } | ||
3890 | |||
3893 | static int decode_attr_owner(struct xdr_stream *xdr, uint32_t *bitmap, | 3891 | static int decode_attr_owner(struct xdr_stream *xdr, uint32_t *bitmap, |
3894 | const struct nfs_server *server, kuid_t *uid, | 3892 | const struct nfs_server *server, kuid_t *uid, |
3895 | struct nfs4_string *owner_name) | 3893 | struct nfs4_string *owner_name) |
3896 | { | 3894 | { |
3897 | uint32_t len; | 3895 | ssize_t len; |
3898 | __be32 *p; | 3896 | char *p; |
3899 | int ret = 0; | ||
3900 | 3897 | ||
3901 | *uid = make_kuid(&init_user_ns, -2); | 3898 | *uid = make_kuid(&init_user_ns, -2); |
3902 | if (unlikely(bitmap[1] & (FATTR4_WORD1_OWNER - 1U))) | 3899 | if (unlikely(bitmap[1] & (FATTR4_WORD1_OWNER - 1U))) |
3903 | return -EIO; | 3900 | return -EIO; |
3904 | if (likely(bitmap[1] & FATTR4_WORD1_OWNER)) { | 3901 | if (!(bitmap[1] & FATTR4_WORD1_OWNER)) |
3905 | p = xdr_inline_decode(xdr, 4); | 3902 | return 0; |
3906 | if (unlikely(!p)) | 3903 | bitmap[1] &= ~FATTR4_WORD1_OWNER; |
3907 | goto out_overflow; | 3904 | |
3908 | len = be32_to_cpup(p); | 3905 | if (owner_name != NULL) { |
3909 | p = xdr_inline_decode(xdr, len); | 3906 | len = decode_nfs4_string(xdr, owner_name, GFP_NOWAIT); |
3910 | if (unlikely(!p)) | 3907 | if (len <= 0) |
3911 | goto out_overflow; | 3908 | goto out; |
3912 | if (owner_name != NULL) { | 3909 | dprintk("%s: name=%s\n", __func__, owner_name->data); |
3913 | owner_name->data = kmemdup(p, len, GFP_NOWAIT); | 3910 | return NFS_ATTR_FATTR_OWNER_NAME; |
3914 | if (owner_name->data != NULL) { | 3911 | } else { |
3915 | owner_name->len = len; | 3912 | len = xdr_stream_decode_opaque_inline(xdr, (void **)&p, |
3916 | ret = NFS_ATTR_FATTR_OWNER_NAME; | 3913 | XDR_MAX_NETOBJ); |
3917 | } | 3914 | if (len <= 0 || nfs_map_name_to_uid(server, p, len, uid) != 0) |
3918 | } else if (len < XDR_MAX_NETOBJ) { | 3915 | goto out; |
3919 | if (nfs_map_name_to_uid(server, (char *)p, len, uid) == 0) | 3916 | dprintk("%s: uid=%d\n", __func__, (int)from_kuid(&init_user_ns, *uid)); |
3920 | ret = NFS_ATTR_FATTR_OWNER; | 3917 | return NFS_ATTR_FATTR_OWNER; |
3921 | else | ||
3922 | dprintk("%s: nfs_map_name_to_uid failed!\n", | ||
3923 | __func__); | ||
3924 | } else | ||
3925 | dprintk("%s: name too long (%u)!\n", | ||
3926 | __func__, len); | ||
3927 | bitmap[1] &= ~FATTR4_WORD1_OWNER; | ||
3928 | } | 3918 | } |
3929 | dprintk("%s: uid=%d\n", __func__, (int)from_kuid(&init_user_ns, *uid)); | 3919 | out: |
3930 | return ret; | 3920 | if (len != -EBADMSG) |
3931 | out_overflow: | 3921 | return 0; |
3932 | print_overflow_msg(__func__, xdr); | 3922 | print_overflow_msg(__func__, xdr); |
3933 | return -EIO; | 3923 | return -EIO; |
3934 | } | 3924 | } |
@@ -3937,41 +3927,33 @@ static int decode_attr_group(struct xdr_stream *xdr, uint32_t *bitmap, | |||
3937 | const struct nfs_server *server, kgid_t *gid, | 3927 | const struct nfs_server *server, kgid_t *gid, |
3938 | struct nfs4_string *group_name) | 3928 | struct nfs4_string *group_name) |
3939 | { | 3929 | { |
3940 | uint32_t len; | 3930 | ssize_t len; |
3941 | __be32 *p; | 3931 | char *p; |
3942 | int ret = 0; | ||
3943 | 3932 | ||
3944 | *gid = make_kgid(&init_user_ns, -2); | 3933 | *gid = make_kgid(&init_user_ns, -2); |
3945 | if (unlikely(bitmap[1] & (FATTR4_WORD1_OWNER_GROUP - 1U))) | 3934 | if (unlikely(bitmap[1] & (FATTR4_WORD1_OWNER_GROUP - 1U))) |
3946 | return -EIO; | 3935 | return -EIO; |
3947 | if (likely(bitmap[1] & FATTR4_WORD1_OWNER_GROUP)) { | 3936 | if (!(bitmap[1] & FATTR4_WORD1_OWNER_GROUP)) |
3948 | p = xdr_inline_decode(xdr, 4); | 3937 | return 0; |
3949 | if (unlikely(!p)) | 3938 | bitmap[1] &= ~FATTR4_WORD1_OWNER_GROUP; |
3950 | goto out_overflow; | 3939 | |
3951 | len = be32_to_cpup(p); | 3940 | if (group_name != NULL) { |
3952 | p = xdr_inline_decode(xdr, len); | 3941 | len = decode_nfs4_string(xdr, group_name, GFP_NOWAIT); |
3953 | if (unlikely(!p)) | 3942 | if (len <= 0) |
3954 | goto out_overflow; | 3943 | goto out; |
3955 | if (group_name != NULL) { | 3944 | dprintk("%s: name=%s\n", __func__, group_name->data); |
3956 | group_name->data = kmemdup(p, len, GFP_NOWAIT); | 3945 | return NFS_ATTR_FATTR_OWNER_NAME; |
3957 | if (group_name->data != NULL) { | 3946 | } else { |
3958 | group_name->len = len; | 3947 | len = xdr_stream_decode_opaque_inline(xdr, (void **)&p, |
3959 | ret = NFS_ATTR_FATTR_GROUP_NAME; | 3948 | XDR_MAX_NETOBJ); |
3960 | } | 3949 | if (len <= 0 || nfs_map_group_to_gid(server, p, len, gid) != 0) |
3961 | } else if (len < XDR_MAX_NETOBJ) { | 3950 | goto out; |
3962 | if (nfs_map_group_to_gid(server, (char *)p, len, gid) == 0) | 3951 | dprintk("%s: gid=%d\n", __func__, (int)from_kgid(&init_user_ns, *gid)); |
3963 | ret = NFS_ATTR_FATTR_GROUP; | 3952 | return NFS_ATTR_FATTR_GROUP; |
3964 | else | ||
3965 | dprintk("%s: nfs_map_group_to_gid failed!\n", | ||
3966 | __func__); | ||
3967 | } else | ||
3968 | dprintk("%s: name too long (%u)!\n", | ||
3969 | __func__, len); | ||
3970 | bitmap[1] &= ~FATTR4_WORD1_OWNER_GROUP; | ||
3971 | } | 3953 | } |
3972 | dprintk("%s: gid=%d\n", __func__, (int)from_kgid(&init_user_ns, *gid)); | 3954 | out: |
3973 | return ret; | 3955 | if (len != -EBADMSG) |
3974 | out_overflow: | 3956 | return 0; |
3975 | print_overflow_msg(__func__, xdr); | 3957 | print_overflow_msg(__func__, xdr); |
3976 | return -EIO; | 3958 | return -EIO; |
3977 | } | 3959 | } |
@@ -4294,15 +4276,12 @@ out_overflow: | |||
4294 | 4276 | ||
4295 | static int decode_opaque_fixed(struct xdr_stream *xdr, void *buf, size_t len) | 4277 | static int decode_opaque_fixed(struct xdr_stream *xdr, void *buf, size_t len) |
4296 | { | 4278 | { |
4297 | __be32 *p; | 4279 | ssize_t ret = xdr_stream_decode_opaque_fixed(xdr, buf, len); |
4298 | 4280 | if (unlikely(ret < 0)) { | |
4299 | p = xdr_inline_decode(xdr, len); | 4281 | print_overflow_msg(__func__, xdr); |
4300 | if (likely(p)) { | 4282 | return -EIO; |
4301 | memcpy(buf, p, len); | ||
4302 | return 0; | ||
4303 | } | 4283 | } |
4304 | print_overflow_msg(__func__, xdr); | 4284 | return 0; |
4305 | return -EIO; | ||
4306 | } | 4285 | } |
4307 | 4286 | ||
4308 | static int decode_stateid(struct xdr_stream *xdr, nfs4_stateid *stateid) | 4287 | static int decode_stateid(struct xdr_stream *xdr, nfs4_stateid *stateid) |
@@ -5093,7 +5072,7 @@ static int decode_rw_delegation(struct xdr_stream *xdr, | |||
5093 | if (decode_space_limit(xdr, &res->pagemod_limit) < 0) | 5072 | if (decode_space_limit(xdr, &res->pagemod_limit) < 0) |
5094 | return -EIO; | 5073 | return -EIO; |
5095 | } | 5074 | } |
5096 | return decode_ace(xdr, NULL, res->server->nfs_client); | 5075 | return decode_ace(xdr, NULL); |
5097 | out_overflow: | 5076 | out_overflow: |
5098 | print_overflow_msg(__func__, xdr); | 5077 | print_overflow_msg(__func__, xdr); |
5099 | return -EIO; | 5078 | return -EIO; |
@@ -5660,8 +5639,6 @@ static int decode_exchange_id(struct xdr_stream *xdr, | |||
5660 | status = decode_opaque_inline(xdr, &dummy, &dummy_str); | 5639 | status = decode_opaque_inline(xdr, &dummy, &dummy_str); |
5661 | if (unlikely(status)) | 5640 | if (unlikely(status)) |
5662 | return status; | 5641 | return status; |
5663 | if (unlikely(dummy > NFS4_OPAQUE_LIMIT)) | ||
5664 | return -EIO; | ||
5665 | memcpy(res->server_owner->major_id, dummy_str, dummy); | 5642 | memcpy(res->server_owner->major_id, dummy_str, dummy); |
5666 | res->server_owner->major_id_sz = dummy; | 5643 | res->server_owner->major_id_sz = dummy; |
5667 | 5644 | ||
@@ -5669,8 +5646,6 @@ static int decode_exchange_id(struct xdr_stream *xdr, | |||
5669 | status = decode_opaque_inline(xdr, &dummy, &dummy_str); | 5646 | status = decode_opaque_inline(xdr, &dummy, &dummy_str); |
5670 | if (unlikely(status)) | 5647 | if (unlikely(status)) |
5671 | return status; | 5648 | return status; |
5672 | if (unlikely(dummy > NFS4_OPAQUE_LIMIT)) | ||
5673 | return -EIO; | ||
5674 | memcpy(res->server_scope->server_scope, dummy_str, dummy); | 5649 | memcpy(res->server_scope->server_scope, dummy_str, dummy); |
5675 | res->server_scope->server_scope_sz = dummy; | 5650 | res->server_scope->server_scope_sz = dummy; |
5676 | 5651 | ||
@@ -5685,16 +5660,12 @@ static int decode_exchange_id(struct xdr_stream *xdr, | |||
5685 | status = decode_opaque_inline(xdr, &dummy, &dummy_str); | 5660 | status = decode_opaque_inline(xdr, &dummy, &dummy_str); |
5686 | if (unlikely(status)) | 5661 | if (unlikely(status)) |
5687 | return status; | 5662 | return status; |
5688 | if (unlikely(dummy > NFS4_OPAQUE_LIMIT)) | ||
5689 | return -EIO; | ||
5690 | memcpy(res->impl_id->domain, dummy_str, dummy); | 5663 | memcpy(res->impl_id->domain, dummy_str, dummy); |
5691 | 5664 | ||
5692 | /* nii_name */ | 5665 | /* nii_name */ |
5693 | status = decode_opaque_inline(xdr, &dummy, &dummy_str); | 5666 | status = decode_opaque_inline(xdr, &dummy, &dummy_str); |
5694 | if (unlikely(status)) | 5667 | if (unlikely(status)) |
5695 | return status; | 5668 | return status; |
5696 | if (unlikely(dummy > NFS4_OPAQUE_LIMIT)) | ||
5697 | return -EIO; | ||
5698 | memcpy(res->impl_id->name, dummy_str, dummy); | 5669 | memcpy(res->impl_id->name, dummy_str, dummy); |
5699 | 5670 | ||
5700 | /* nii_date */ | 5671 | /* nii_date */ |
diff --git a/fs/nfs/super.c b/fs/nfs/super.c index 6bca17883b93..54e0f9f2dd94 100644 --- a/fs/nfs/super.c +++ b/fs/nfs/super.c | |||
@@ -531,39 +531,32 @@ static void nfs_show_mountd_netid(struct seq_file *m, struct nfs_server *nfss, | |||
531 | int showdefaults) | 531 | int showdefaults) |
532 | { | 532 | { |
533 | struct sockaddr *sap = (struct sockaddr *) &nfss->mountd_address; | 533 | struct sockaddr *sap = (struct sockaddr *) &nfss->mountd_address; |
534 | char *proto = NULL; | ||
534 | 535 | ||
535 | seq_printf(m, ",mountproto="); | ||
536 | switch (sap->sa_family) { | 536 | switch (sap->sa_family) { |
537 | case AF_INET: | 537 | case AF_INET: |
538 | switch (nfss->mountd_protocol) { | 538 | switch (nfss->mountd_protocol) { |
539 | case IPPROTO_UDP: | 539 | case IPPROTO_UDP: |
540 | seq_printf(m, RPCBIND_NETID_UDP); | 540 | proto = RPCBIND_NETID_UDP; |
541 | break; | 541 | break; |
542 | case IPPROTO_TCP: | 542 | case IPPROTO_TCP: |
543 | seq_printf(m, RPCBIND_NETID_TCP); | 543 | proto = RPCBIND_NETID_TCP; |
544 | break; | 544 | break; |
545 | default: | ||
546 | if (showdefaults) | ||
547 | seq_printf(m, "auto"); | ||
548 | } | 545 | } |
549 | break; | 546 | break; |
550 | case AF_INET6: | 547 | case AF_INET6: |
551 | switch (nfss->mountd_protocol) { | 548 | switch (nfss->mountd_protocol) { |
552 | case IPPROTO_UDP: | 549 | case IPPROTO_UDP: |
553 | seq_printf(m, RPCBIND_NETID_UDP6); | 550 | proto = RPCBIND_NETID_UDP6; |
554 | break; | 551 | break; |
555 | case IPPROTO_TCP: | 552 | case IPPROTO_TCP: |
556 | seq_printf(m, RPCBIND_NETID_TCP6); | 553 | proto = RPCBIND_NETID_TCP6; |
557 | break; | 554 | break; |
558 | default: | ||
559 | if (showdefaults) | ||
560 | seq_printf(m, "auto"); | ||
561 | } | 555 | } |
562 | break; | 556 | break; |
563 | default: | ||
564 | if (showdefaults) | ||
565 | seq_printf(m, "auto"); | ||
566 | } | 557 | } |
558 | if (proto || showdefaults) | ||
559 | seq_printf(m, ",mountproto=%s", proto ?: "auto"); | ||
567 | } | 560 | } |
568 | 561 | ||
569 | static void nfs_show_mountd_options(struct seq_file *m, struct nfs_server *nfss, | 562 | static void nfs_show_mountd_options(struct seq_file *m, struct nfs_server *nfss, |
diff --git a/fs/nfs/write.c b/fs/nfs/write.c index 006068526542..e75b056f46f4 100644 --- a/fs/nfs/write.c +++ b/fs/nfs/write.c | |||
@@ -1785,7 +1785,7 @@ static void nfs_commit_release_pages(struct nfs_commit_data *data) | |||
1785 | if (status < 0) { | 1785 | if (status < 0) { |
1786 | nfs_context_set_write_error(req->wb_context, status); | 1786 | nfs_context_set_write_error(req->wb_context, status); |
1787 | nfs_inode_remove_request(req); | 1787 | nfs_inode_remove_request(req); |
1788 | dprintk(", error = %d\n", status); | 1788 | dprintk_cont(", error = %d\n", status); |
1789 | goto next; | 1789 | goto next; |
1790 | } | 1790 | } |
1791 | 1791 | ||
@@ -1794,11 +1794,11 @@ static void nfs_commit_release_pages(struct nfs_commit_data *data) | |||
1794 | if (!nfs_write_verifier_cmp(&req->wb_verf, &data->verf.verifier)) { | 1794 | if (!nfs_write_verifier_cmp(&req->wb_verf, &data->verf.verifier)) { |
1795 | /* We have a match */ | 1795 | /* We have a match */ |
1796 | nfs_inode_remove_request(req); | 1796 | nfs_inode_remove_request(req); |
1797 | dprintk(" OK\n"); | 1797 | dprintk_cont(" OK\n"); |
1798 | goto next; | 1798 | goto next; |
1799 | } | 1799 | } |
1800 | /* We have a mismatch. Write the page again */ | 1800 | /* We have a mismatch. Write the page again */ |
1801 | dprintk(" mismatch\n"); | 1801 | dprintk_cont(" mismatch\n"); |
1802 | nfs_mark_request_dirty(req); | 1802 | nfs_mark_request_dirty(req); |
1803 | set_bit(NFS_CONTEXT_RESEND_WRITES, &req->wb_context->flags); | 1803 | set_bit(NFS_CONTEXT_RESEND_WRITES, &req->wb_context->flags); |
1804 | next: | 1804 | next: |
diff --git a/include/linux/compiler-gcc.h b/include/linux/compiler-gcc.h index 76e28c229805..0efef9cf014f 100644 --- a/include/linux/compiler-gcc.h +++ b/include/linux/compiler-gcc.h | |||
@@ -200,8 +200,8 @@ | |||
200 | #ifdef CONFIG_STACK_VALIDATION | 200 | #ifdef CONFIG_STACK_VALIDATION |
201 | #define annotate_unreachable() ({ \ | 201 | #define annotate_unreachable() ({ \ |
202 | asm("%c0:\t\n" \ | 202 | asm("%c0:\t\n" \ |
203 | ".pushsection __unreachable, \"a\"\t\n" \ | 203 | ".pushsection .discard.unreachable\t\n" \ |
204 | ".long %c0b\t\n" \ | 204 | ".long %c0b - .\t\n" \ |
205 | ".popsection\t\n" : : "i" (__LINE__)); \ | 205 | ".popsection\t\n" : : "i" (__LINE__)); \ |
206 | }) | 206 | }) |
207 | #else | 207 | #else |
diff --git a/include/linux/f2fs_fs.h b/include/linux/f2fs_fs.h index cea41a124a80..e2d239ed4c60 100644 --- a/include/linux/f2fs_fs.h +++ b/include/linux/f2fs_fs.h | |||
@@ -36,6 +36,12 @@ | |||
36 | #define F2FS_NODE_INO(sbi) (sbi->node_ino_num) | 36 | #define F2FS_NODE_INO(sbi) (sbi->node_ino_num) |
37 | #define F2FS_META_INO(sbi) (sbi->meta_ino_num) | 37 | #define F2FS_META_INO(sbi) (sbi->meta_ino_num) |
38 | 38 | ||
39 | #define F2FS_IO_SIZE(sbi) (1 << (sbi)->write_io_size_bits) /* Blocks */ | ||
40 | #define F2FS_IO_SIZE_KB(sbi) (1 << ((sbi)->write_io_size_bits + 2)) /* KB */ | ||
41 | #define F2FS_IO_SIZE_BYTES(sbi) (1 << ((sbi)->write_io_size_bits + 12)) /* B */ | ||
42 | #define F2FS_IO_SIZE_BITS(sbi) ((sbi)->write_io_size_bits) /* power of 2 */ | ||
43 | #define F2FS_IO_SIZE_MASK(sbi) (F2FS_IO_SIZE(sbi) - 1) | ||
44 | |||
39 | /* This flag is used by node and meta inodes, and by recovery */ | 45 | /* This flag is used by node and meta inodes, and by recovery */ |
40 | #define GFP_F2FS_ZERO (GFP_NOFS | __GFP_ZERO) | 46 | #define GFP_F2FS_ZERO (GFP_NOFS | __GFP_ZERO) |
41 | #define GFP_F2FS_HIGH_ZERO (GFP_NOFS | __GFP_ZERO | __GFP_HIGHMEM) | 47 | #define GFP_F2FS_HIGH_ZERO (GFP_NOFS | __GFP_ZERO | __GFP_HIGHMEM) |
@@ -108,6 +114,7 @@ struct f2fs_super_block { | |||
108 | /* | 114 | /* |
109 | * For checkpoint | 115 | * For checkpoint |
110 | */ | 116 | */ |
117 | #define CP_NAT_BITS_FLAG 0x00000080 | ||
111 | #define CP_CRC_RECOVERY_FLAG 0x00000040 | 118 | #define CP_CRC_RECOVERY_FLAG 0x00000040 |
112 | #define CP_FASTBOOT_FLAG 0x00000020 | 119 | #define CP_FASTBOOT_FLAG 0x00000020 |
113 | #define CP_FSCK_FLAG 0x00000010 | 120 | #define CP_FSCK_FLAG 0x00000010 |
@@ -272,6 +279,7 @@ struct f2fs_node { | |||
272 | * For NAT entries | 279 | * For NAT entries |
273 | */ | 280 | */ |
274 | #define NAT_ENTRY_PER_BLOCK (PAGE_SIZE / sizeof(struct f2fs_nat_entry)) | 281 | #define NAT_ENTRY_PER_BLOCK (PAGE_SIZE / sizeof(struct f2fs_nat_entry)) |
282 | #define NAT_ENTRY_BITMAP_SIZE ((NAT_ENTRY_PER_BLOCK + 7) / 8) | ||
275 | 283 | ||
276 | struct f2fs_nat_entry { | 284 | struct f2fs_nat_entry { |
277 | __u8 version; /* latest version of cached nat entry */ | 285 | __u8 version; /* latest version of cached nat entry */ |
diff --git a/include/linux/frame.h b/include/linux/frame.h index e6baaba3f1ae..d772c61c31da 100644 --- a/include/linux/frame.h +++ b/include/linux/frame.h | |||
@@ -11,7 +11,7 @@ | |||
11 | * For more information, see tools/objtool/Documentation/stack-validation.txt. | 11 | * For more information, see tools/objtool/Documentation/stack-validation.txt. |
12 | */ | 12 | */ |
13 | #define STACK_FRAME_NON_STANDARD(func) \ | 13 | #define STACK_FRAME_NON_STANDARD(func) \ |
14 | static void __used __section(__func_stack_frame_non_standard) \ | 14 | static void __used __section(.discard.func_stack_frame_non_standard) \ |
15 | *__func_stack_frame_non_standard_##func = func | 15 | *__func_stack_frame_non_standard_##func = func |
16 | 16 | ||
17 | #else /* !CONFIG_STACK_VALIDATION */ | 17 | #else /* !CONFIG_STACK_VALIDATION */ |
diff --git a/include/linux/lockd/lockd.h b/include/linux/lockd/lockd.h index c15373894a42..b37dee3acaba 100644 --- a/include/linux/lockd/lockd.h +++ b/include/linux/lockd/lockd.h | |||
@@ -355,7 +355,8 @@ static inline int nlm_privileged_requester(const struct svc_rqst *rqstp) | |||
355 | static inline int nlm_compare_locks(const struct file_lock *fl1, | 355 | static inline int nlm_compare_locks(const struct file_lock *fl1, |
356 | const struct file_lock *fl2) | 356 | const struct file_lock *fl2) |
357 | { | 357 | { |
358 | return fl1->fl_pid == fl2->fl_pid | 358 | return file_inode(fl1->fl_file) == file_inode(fl2->fl_file) |
359 | && fl1->fl_pid == fl2->fl_pid | ||
359 | && fl1->fl_owner == fl2->fl_owner | 360 | && fl1->fl_owner == fl2->fl_owner |
360 | && fl1->fl_start == fl2->fl_start | 361 | && fl1->fl_start == fl2->fl_start |
361 | && fl1->fl_end == fl2->fl_end | 362 | && fl1->fl_end == fl2->fl_end |
diff --git a/include/linux/pwm.h b/include/linux/pwm.h index 2c6c5114c089..08fad7c6a471 100644 --- a/include/linux/pwm.h +++ b/include/linux/pwm.h | |||
@@ -287,8 +287,6 @@ struct pwm_ops { | |||
287 | * @pwms: array of PWM devices allocated by the framework | 287 | * @pwms: array of PWM devices allocated by the framework |
288 | * @of_xlate: request a PWM device given a device tree PWM specifier | 288 | * @of_xlate: request a PWM device given a device tree PWM specifier |
289 | * @of_pwm_n_cells: number of cells expected in the device tree PWM specifier | 289 | * @of_pwm_n_cells: number of cells expected in the device tree PWM specifier |
290 | * @can_sleep: must be true if the .config(), .enable() or .disable() | ||
291 | * operations may sleep | ||
292 | */ | 290 | */ |
293 | struct pwm_chip { | 291 | struct pwm_chip { |
294 | struct device *dev; | 292 | struct device *dev; |
@@ -302,7 +300,6 @@ struct pwm_chip { | |||
302 | struct pwm_device * (*of_xlate)(struct pwm_chip *pc, | 300 | struct pwm_device * (*of_xlate)(struct pwm_chip *pc, |
303 | const struct of_phandle_args *args); | 301 | const struct of_phandle_args *args); |
304 | unsigned int of_pwm_n_cells; | 302 | unsigned int of_pwm_n_cells; |
305 | bool can_sleep; | ||
306 | }; | 303 | }; |
307 | 304 | ||
308 | /** | 305 | /** |
@@ -451,8 +448,6 @@ struct pwm_device *devm_pwm_get(struct device *dev, const char *con_id); | |||
451 | struct pwm_device *devm_of_pwm_get(struct device *dev, struct device_node *np, | 448 | struct pwm_device *devm_of_pwm_get(struct device *dev, struct device_node *np, |
452 | const char *con_id); | 449 | const char *con_id); |
453 | void devm_pwm_put(struct device *dev, struct pwm_device *pwm); | 450 | void devm_pwm_put(struct device *dev, struct pwm_device *pwm); |
454 | |||
455 | bool pwm_can_sleep(struct pwm_device *pwm); | ||
456 | #else | 451 | #else |
457 | static inline struct pwm_device *pwm_request(int pwm_id, const char *label) | 452 | static inline struct pwm_device *pwm_request(int pwm_id, const char *label) |
458 | { | 453 | { |
@@ -566,11 +561,6 @@ static inline struct pwm_device *devm_of_pwm_get(struct device *dev, | |||
566 | static inline void devm_pwm_put(struct device *dev, struct pwm_device *pwm) | 561 | static inline void devm_pwm_put(struct device *dev, struct pwm_device *pwm) |
567 | { | 562 | { |
568 | } | 563 | } |
569 | |||
570 | static inline bool pwm_can_sleep(struct pwm_device *pwm) | ||
571 | { | ||
572 | return false; | ||
573 | } | ||
574 | #endif | 564 | #endif |
575 | 565 | ||
576 | static inline void pwm_apply_args(struct pwm_device *pwm) | 566 | static inline void pwm_apply_args(struct pwm_device *pwm) |
@@ -613,18 +603,25 @@ struct pwm_lookup { | |||
613 | const char *con_id; | 603 | const char *con_id; |
614 | unsigned int period; | 604 | unsigned int period; |
615 | enum pwm_polarity polarity; | 605 | enum pwm_polarity polarity; |
606 | const char *module; /* optional, may be NULL */ | ||
616 | }; | 607 | }; |
617 | 608 | ||
618 | #define PWM_LOOKUP(_provider, _index, _dev_id, _con_id, _period, _polarity) \ | 609 | #define PWM_LOOKUP_WITH_MODULE(_provider, _index, _dev_id, _con_id, \ |
619 | { \ | 610 | _period, _polarity, _module) \ |
620 | .provider = _provider, \ | 611 | { \ |
621 | .index = _index, \ | 612 | .provider = _provider, \ |
622 | .dev_id = _dev_id, \ | 613 | .index = _index, \ |
623 | .con_id = _con_id, \ | 614 | .dev_id = _dev_id, \ |
624 | .period = _period, \ | 615 | .con_id = _con_id, \ |
625 | .polarity = _polarity \ | 616 | .period = _period, \ |
617 | .polarity = _polarity, \ | ||
618 | .module = _module, \ | ||
626 | } | 619 | } |
627 | 620 | ||
621 | #define PWM_LOOKUP(_provider, _index, _dev_id, _con_id, _period, _polarity) \ | ||
622 | PWM_LOOKUP_WITH_MODULE(_provider, _index, _dev_id, _con_id, _period, \ | ||
623 | _polarity, NULL) | ||
624 | |||
628 | #if IS_ENABLED(CONFIG_PWM) | 625 | #if IS_ENABLED(CONFIG_PWM) |
629 | void pwm_add_table(struct pwm_lookup *table, size_t num); | 626 | void pwm_add_table(struct pwm_lookup *table, size_t num); |
630 | void pwm_remove_table(struct pwm_lookup *table, size_t num); | 627 | void pwm_remove_table(struct pwm_lookup *table, size_t num); |
diff --git a/include/linux/sunrpc/auth.h b/include/linux/sunrpc/auth.h index b1bc62ba20a2..8fd3504946ad 100644 --- a/include/linux/sunrpc/auth.h +++ b/include/linux/sunrpc/auth.h | |||
@@ -32,6 +32,7 @@ | |||
32 | */ | 32 | */ |
33 | #define UNX_MAXNODENAME __NEW_UTS_LEN | 33 | #define UNX_MAXNODENAME __NEW_UTS_LEN |
34 | #define UNX_CALLSLACK (21 + XDR_QUADLEN(UNX_MAXNODENAME)) | 34 | #define UNX_CALLSLACK (21 + XDR_QUADLEN(UNX_MAXNODENAME)) |
35 | #define UNX_NGROUPS 16 | ||
35 | 36 | ||
36 | struct rpcsec_gss_info; | 37 | struct rpcsec_gss_info; |
37 | 38 | ||
@@ -63,9 +64,6 @@ struct rpc_cred { | |||
63 | struct rcu_head cr_rcu; | 64 | struct rcu_head cr_rcu; |
64 | struct rpc_auth * cr_auth; | 65 | struct rpc_auth * cr_auth; |
65 | const struct rpc_credops *cr_ops; | 66 | const struct rpc_credops *cr_ops; |
66 | #if IS_ENABLED(CONFIG_SUNRPC_DEBUG) | ||
67 | unsigned long cr_magic; /* 0x0f4aa4f0 */ | ||
68 | #endif | ||
69 | unsigned long cr_expire; /* when to gc */ | 67 | unsigned long cr_expire; /* when to gc */ |
70 | unsigned long cr_flags; /* various flags */ | 68 | unsigned long cr_flags; /* various flags */ |
71 | atomic_t cr_count; /* ref count */ | 69 | atomic_t cr_count; /* ref count */ |
@@ -79,8 +77,6 @@ struct rpc_cred { | |||
79 | #define RPCAUTH_CRED_HASHED 2 | 77 | #define RPCAUTH_CRED_HASHED 2 |
80 | #define RPCAUTH_CRED_NEGATIVE 3 | 78 | #define RPCAUTH_CRED_NEGATIVE 3 |
81 | 79 | ||
82 | #define RPCAUTH_CRED_MAGIC 0x0f4aa4f0 | ||
83 | |||
84 | /* rpc_auth au_flags */ | 80 | /* rpc_auth au_flags */ |
85 | #define RPCAUTH_AUTH_NO_CRKEY_TIMEOUT 0x0001 /* underlying cred has no key timeout */ | 81 | #define RPCAUTH_AUTH_NO_CRKEY_TIMEOUT 0x0001 /* underlying cred has no key timeout */ |
86 | 82 | ||
diff --git a/include/linux/sunrpc/cache.h b/include/linux/sunrpc/cache.h index 20d157a518a7..270bad0e1bed 100644 --- a/include/linux/sunrpc/cache.h +++ b/include/linux/sunrpc/cache.h | |||
@@ -63,15 +63,6 @@ struct cache_head { | |||
63 | 63 | ||
64 | #define CACHE_NEW_EXPIRY 120 /* keep new things pending confirmation for 120 seconds */ | 64 | #define CACHE_NEW_EXPIRY 120 /* keep new things pending confirmation for 120 seconds */ |
65 | 65 | ||
66 | struct cache_detail_procfs { | ||
67 | struct proc_dir_entry *proc_ent; | ||
68 | struct proc_dir_entry *flush_ent, *channel_ent, *content_ent; | ||
69 | }; | ||
70 | |||
71 | struct cache_detail_pipefs { | ||
72 | struct dentry *dir; | ||
73 | }; | ||
74 | |||
75 | struct cache_detail { | 66 | struct cache_detail { |
76 | struct module * owner; | 67 | struct module * owner; |
77 | int hash_size; | 68 | int hash_size; |
@@ -123,9 +114,9 @@ struct cache_detail { | |||
123 | time_t last_warn; /* when we last warned about no readers */ | 114 | time_t last_warn; /* when we last warned about no readers */ |
124 | 115 | ||
125 | union { | 116 | union { |
126 | struct cache_detail_procfs procfs; | 117 | struct proc_dir_entry *procfs; |
127 | struct cache_detail_pipefs pipefs; | 118 | struct dentry *pipefs; |
128 | } u; | 119 | }; |
129 | struct net *net; | 120 | struct net *net; |
130 | }; | 121 | }; |
131 | 122 | ||
diff --git a/include/linux/sunrpc/clnt.h b/include/linux/sunrpc/clnt.h index 333ad11b3dd9..6095ecba0dde 100644 --- a/include/linux/sunrpc/clnt.h +++ b/include/linux/sunrpc/clnt.h | |||
@@ -182,7 +182,6 @@ int rpc_protocol(struct rpc_clnt *); | |||
182 | struct net * rpc_net_ns(struct rpc_clnt *); | 182 | struct net * rpc_net_ns(struct rpc_clnt *); |
183 | size_t rpc_max_payload(struct rpc_clnt *); | 183 | size_t rpc_max_payload(struct rpc_clnt *); |
184 | size_t rpc_max_bc_payload(struct rpc_clnt *); | 184 | size_t rpc_max_bc_payload(struct rpc_clnt *); |
185 | unsigned long rpc_get_timeout(struct rpc_clnt *clnt); | ||
186 | void rpc_force_rebind(struct rpc_clnt *); | 185 | void rpc_force_rebind(struct rpc_clnt *); |
187 | size_t rpc_peeraddr(struct rpc_clnt *, struct sockaddr *, size_t); | 186 | size_t rpc_peeraddr(struct rpc_clnt *, struct sockaddr *, size_t); |
188 | const char *rpc_peeraddr2str(struct rpc_clnt *, enum rpc_display_format_t); | 187 | const char *rpc_peeraddr2str(struct rpc_clnt *, enum rpc_display_format_t); |
@@ -202,8 +201,9 @@ int rpc_clnt_add_xprt(struct rpc_clnt *, struct xprt_create *, | |||
202 | struct rpc_xprt *, | 201 | struct rpc_xprt *, |
203 | void *), | 202 | void *), |
204 | void *data); | 203 | void *data); |
205 | void rpc_cap_max_reconnect_timeout(struct rpc_clnt *clnt, | 204 | void rpc_set_connect_timeout(struct rpc_clnt *clnt, |
206 | unsigned long timeo); | 205 | unsigned long connect_timeout, |
206 | unsigned long reconnect_timeout); | ||
207 | 207 | ||
208 | int rpc_clnt_setup_test_and_add_xprt(struct rpc_clnt *, | 208 | int rpc_clnt_setup_test_and_add_xprt(struct rpc_clnt *, |
209 | struct rpc_xprt_switch *, | 209 | struct rpc_xprt_switch *, |
diff --git a/include/linux/sunrpc/debug.h b/include/linux/sunrpc/debug.h index 59a7889e15db..8da0f37f3bdc 100644 --- a/include/linux/sunrpc/debug.h +++ b/include/linux/sunrpc/debug.h | |||
@@ -20,33 +20,55 @@ extern unsigned int nfsd_debug; | |||
20 | extern unsigned int nlm_debug; | 20 | extern unsigned int nlm_debug; |
21 | #endif | 21 | #endif |
22 | 22 | ||
23 | #define dprintk(args...) dfprintk(FACILITY, ## args) | 23 | #define dprintk(fmt, ...) \ |
24 | #define dprintk_rcu(args...) dfprintk_rcu(FACILITY, ## args) | 24 | dfprintk(FACILITY, fmt, ##__VA_ARGS__) |
25 | #define dprintk_cont(fmt, ...) \ | ||
26 | dfprintk_cont(FACILITY, fmt, ##__VA_ARGS__) | ||
27 | #define dprintk_rcu(fmt, ...) \ | ||
28 | dfprintk_rcu(FACILITY, fmt, ##__VA_ARGS__) | ||
29 | #define dprintk_rcu_cont(fmt, ...) \ | ||
30 | dfprintk_rcu_cont(FACILITY, fmt, ##__VA_ARGS__) | ||
25 | 31 | ||
26 | #undef ifdebug | 32 | #undef ifdebug |
27 | #if IS_ENABLED(CONFIG_SUNRPC_DEBUG) | 33 | #if IS_ENABLED(CONFIG_SUNRPC_DEBUG) |
28 | # define ifdebug(fac) if (unlikely(rpc_debug & RPCDBG_##fac)) | 34 | # define ifdebug(fac) if (unlikely(rpc_debug & RPCDBG_##fac)) |
29 | 35 | ||
30 | # define dfprintk(fac, args...) \ | 36 | # define dfprintk(fac, fmt, ...) \ |
31 | do { \ | 37 | do { \ |
32 | ifdebug(fac) \ | 38 | ifdebug(fac) \ |
33 | printk(KERN_DEFAULT args); \ | 39 | printk(KERN_DEFAULT fmt, ##__VA_ARGS__); \ |
34 | } while (0) | 40 | } while (0) |
35 | 41 | ||
36 | # define dfprintk_rcu(fac, args...) \ | 42 | # define dfprintk_cont(fac, fmt, ...) \ |
37 | do { \ | 43 | do { \ |
38 | ifdebug(fac) { \ | 44 | ifdebug(fac) \ |
39 | rcu_read_lock(); \ | 45 | printk(KERN_CONT fmt, ##__VA_ARGS__); \ |
40 | printk(KERN_DEFAULT args); \ | 46 | } while (0) |
41 | rcu_read_unlock(); \ | 47 | |
42 | } \ | 48 | # define dfprintk_rcu(fac, fmt, ...) \ |
43 | } while (0) | 49 | do { \ |
50 | ifdebug(fac) { \ | ||
51 | rcu_read_lock(); \ | ||
52 | printk(KERN_DEFAULT fmt, ##__VA_ARGS__); \ | ||
53 | rcu_read_unlock(); \ | ||
54 | } \ | ||
55 | } while (0) | ||
56 | |||
57 | # define dfprintk_rcu_cont(fac, fmt, ...) \ | ||
58 | do { \ | ||
59 | ifdebug(fac) { \ | ||
60 | rcu_read_lock(); \ | ||
61 | printk(KERN_CONT fmt, ##__VA_ARGS__); \ | ||
62 | rcu_read_unlock(); \ | ||
63 | } \ | ||
64 | } while (0) | ||
44 | 65 | ||
45 | # define RPC_IFDEBUG(x) x | 66 | # define RPC_IFDEBUG(x) x |
46 | #else | 67 | #else |
47 | # define ifdebug(fac) if (0) | 68 | # define ifdebug(fac) if (0) |
48 | # define dfprintk(fac, args...) do {} while (0) | 69 | # define dfprintk(fac, fmt, ...) do {} while (0) |
49 | # define dfprintk_rcu(fac, args...) do {} while (0) | 70 | # define dfprintk_cont(fac, fmt, ...) do {} while (0) |
71 | # define dfprintk_rcu(fac, fmt, ...) do {} while (0) | ||
50 | # define RPC_IFDEBUG(x) | 72 | # define RPC_IFDEBUG(x) |
51 | #endif | 73 | #endif |
52 | 74 | ||
diff --git a/include/linux/sunrpc/xdr.h b/include/linux/sunrpc/xdr.h index 56c48c884a24..054c8cde18f3 100644 --- a/include/linux/sunrpc/xdr.h +++ b/include/linux/sunrpc/xdr.h | |||
@@ -242,6 +242,185 @@ extern unsigned int xdr_read_pages(struct xdr_stream *xdr, unsigned int len); | |||
242 | extern void xdr_enter_page(struct xdr_stream *xdr, unsigned int len); | 242 | extern void xdr_enter_page(struct xdr_stream *xdr, unsigned int len); |
243 | extern int xdr_process_buf(struct xdr_buf *buf, unsigned int offset, unsigned int len, int (*actor)(struct scatterlist *, void *), void *data); | 243 | extern int xdr_process_buf(struct xdr_buf *buf, unsigned int offset, unsigned int len, int (*actor)(struct scatterlist *, void *), void *data); |
244 | 244 | ||
245 | ssize_t xdr_stream_decode_string_dup(struct xdr_stream *xdr, char **str, | ||
246 | size_t maxlen, gfp_t gfp_flags); | ||
247 | /** | ||
248 | * xdr_align_size - Calculate padded size of an object | ||
249 | * @n: Size of an object being XDR encoded (in bytes) | ||
250 | * | ||
251 | * Return value: | ||
252 | * Size (in bytes) of the object including xdr padding | ||
253 | */ | ||
254 | static inline size_t | ||
255 | xdr_align_size(size_t n) | ||
256 | { | ||
257 | const size_t mask = sizeof(__u32) - 1; | ||
258 | |||
259 | return (n + mask) & ~mask; | ||
260 | } | ||
261 | |||
262 | /** | ||
263 | * xdr_stream_encode_u32 - Encode a 32-bit integer | ||
264 | * @xdr: pointer to xdr_stream | ||
265 | * @n: integer to encode | ||
266 | * | ||
267 | * Return values: | ||
268 | * On success, returns length in bytes of XDR buffer consumed | ||
269 | * %-EMSGSIZE on XDR buffer overflow | ||
270 | */ | ||
271 | static inline ssize_t | ||
272 | xdr_stream_encode_u32(struct xdr_stream *xdr, __u32 n) | ||
273 | { | ||
274 | const size_t len = sizeof(n); | ||
275 | __be32 *p = xdr_reserve_space(xdr, len); | ||
276 | |||
277 | if (unlikely(!p)) | ||
278 | return -EMSGSIZE; | ||
279 | *p = cpu_to_be32(n); | ||
280 | return len; | ||
281 | } | ||
282 | |||
283 | /** | ||
284 | * xdr_stream_encode_u64 - Encode a 64-bit integer | ||
285 | * @xdr: pointer to xdr_stream | ||
286 | * @n: 64-bit integer to encode | ||
287 | * | ||
288 | * Return values: | ||
289 | * On success, returns length in bytes of XDR buffer consumed | ||
290 | * %-EMSGSIZE on XDR buffer overflow | ||
291 | */ | ||
292 | static inline ssize_t | ||
293 | xdr_stream_encode_u64(struct xdr_stream *xdr, __u64 n) | ||
294 | { | ||
295 | const size_t len = sizeof(n); | ||
296 | __be32 *p = xdr_reserve_space(xdr, len); | ||
297 | |||
298 | if (unlikely(!p)) | ||
299 | return -EMSGSIZE; | ||
300 | xdr_encode_hyper(p, n); | ||
301 | return len; | ||
302 | } | ||
303 | |||
304 | /** | ||
305 | * xdr_stream_encode_opaque_fixed - Encode fixed length opaque xdr data | ||
306 | * @xdr: pointer to xdr_stream | ||
307 | * @ptr: pointer to opaque data object | ||
308 | * @len: size of object pointed to by @ptr | ||
309 | * | ||
310 | * Return values: | ||
311 | * On success, returns length in bytes of XDR buffer consumed | ||
312 | * %-EMSGSIZE on XDR buffer overflow | ||
313 | */ | ||
314 | static inline ssize_t | ||
315 | xdr_stream_encode_opaque_fixed(struct xdr_stream *xdr, const void *ptr, size_t len) | ||
316 | { | ||
317 | __be32 *p = xdr_reserve_space(xdr, len); | ||
318 | |||
319 | if (unlikely(!p)) | ||
320 | return -EMSGSIZE; | ||
321 | xdr_encode_opaque_fixed(p, ptr, len); | ||
322 | return xdr_align_size(len); | ||
323 | } | ||
324 | |||
325 | /** | ||
326 | * xdr_stream_encode_opaque - Encode variable length opaque xdr data | ||
327 | * @xdr: pointer to xdr_stream | ||
328 | * @ptr: pointer to opaque data object | ||
329 | * @len: size of object pointed to by @ptr | ||
330 | * | ||
331 | * Return values: | ||
332 | * On success, returns length in bytes of XDR buffer consumed | ||
333 | * %-EMSGSIZE on XDR buffer overflow | ||
334 | */ | ||
335 | static inline ssize_t | ||
336 | xdr_stream_encode_opaque(struct xdr_stream *xdr, const void *ptr, size_t len) | ||
337 | { | ||
338 | size_t count = sizeof(__u32) + xdr_align_size(len); | ||
339 | __be32 *p = xdr_reserve_space(xdr, count); | ||
340 | |||
341 | if (unlikely(!p)) | ||
342 | return -EMSGSIZE; | ||
343 | xdr_encode_opaque(p, ptr, len); | ||
344 | return count; | ||
345 | } | ||
346 | |||
347 | /** | ||
348 | * xdr_stream_decode_u32 - Decode a 32-bit integer | ||
349 | * @xdr: pointer to xdr_stream | ||
350 | * @ptr: location to store integer | ||
351 | * | ||
352 | * Return values: | ||
353 | * %0 on success | ||
354 | * %-EBADMSG on XDR buffer overflow | ||
355 | */ | ||
356 | static inline ssize_t | ||
357 | xdr_stream_decode_u32(struct xdr_stream *xdr, __u32 *ptr) | ||
358 | { | ||
359 | const size_t count = sizeof(*ptr); | ||
360 | __be32 *p = xdr_inline_decode(xdr, count); | ||
361 | |||
362 | if (unlikely(!p)) | ||
363 | return -EBADMSG; | ||
364 | *ptr = be32_to_cpup(p); | ||
365 | return 0; | ||
366 | } | ||
367 | |||
368 | /** | ||
369 | * xdr_stream_decode_opaque_fixed - Decode fixed length opaque xdr data | ||
370 | * @xdr: pointer to xdr_stream | ||
371 | * @ptr: location to store data | ||
372 | * @len: size of buffer pointed to by @ptr | ||
373 | * | ||
374 | * Return values: | ||
375 | * On success, returns size of object stored in @ptr | ||
376 | * %-EBADMSG on XDR buffer overflow | ||
377 | */ | ||
378 | static inline ssize_t | ||
379 | xdr_stream_decode_opaque_fixed(struct xdr_stream *xdr, void *ptr, size_t len) | ||
380 | { | ||
381 | __be32 *p = xdr_inline_decode(xdr, len); | ||
382 | |||
383 | if (unlikely(!p)) | ||
384 | return -EBADMSG; | ||
385 | xdr_decode_opaque_fixed(p, ptr, len); | ||
386 | return len; | ||
387 | } | ||
388 | |||
389 | /** | ||
390 | * xdr_stream_decode_opaque_inline - Decode variable length opaque xdr data | ||
391 | * @xdr: pointer to xdr_stream | ||
392 | * @ptr: location to store pointer to opaque data | ||
393 | * @maxlen: maximum acceptable object size | ||
394 | * | ||
395 | * Note: the pointer stored in @ptr cannot be assumed valid after the XDR | ||
396 | * buffer has been destroyed, or even after calling xdr_inline_decode() | ||
397 | * on @xdr. It is therefore expected that the object it points to should | ||
398 | * be processed immediately. | ||
399 | * | ||
400 | * Return values: | ||
401 | * On success, returns size of object stored in *@ptr | ||
402 | * %-EBADMSG on XDR buffer overflow | ||
403 | * %-EMSGSIZE if the size of the object would exceed @maxlen | ||
404 | */ | ||
405 | static inline ssize_t | ||
406 | xdr_stream_decode_opaque_inline(struct xdr_stream *xdr, void **ptr, size_t maxlen) | ||
407 | { | ||
408 | __be32 *p; | ||
409 | __u32 len; | ||
410 | |||
411 | *ptr = NULL; | ||
412 | if (unlikely(xdr_stream_decode_u32(xdr, &len) < 0)) | ||
413 | return -EBADMSG; | ||
414 | if (len != 0) { | ||
415 | p = xdr_inline_decode(xdr, len); | ||
416 | if (unlikely(!p)) | ||
417 | return -EBADMSG; | ||
418 | if (unlikely(len > maxlen)) | ||
419 | return -EMSGSIZE; | ||
420 | *ptr = p; | ||
421 | } | ||
422 | return len; | ||
423 | } | ||
245 | #endif /* __KERNEL__ */ | 424 | #endif /* __KERNEL__ */ |
246 | 425 | ||
247 | #endif /* _SUNRPC_XDR_H_ */ | 426 | #endif /* _SUNRPC_XDR_H_ */ |
diff --git a/include/linux/sunrpc/xprt.h b/include/linux/sunrpc/xprt.h index a5da60b24d83..eab1c749e192 100644 --- a/include/linux/sunrpc/xprt.h +++ b/include/linux/sunrpc/xprt.h | |||
@@ -137,6 +137,9 @@ struct rpc_xprt_ops { | |||
137 | void (*release_request)(struct rpc_task *task); | 137 | void (*release_request)(struct rpc_task *task); |
138 | void (*close)(struct rpc_xprt *xprt); | 138 | void (*close)(struct rpc_xprt *xprt); |
139 | void (*destroy)(struct rpc_xprt *xprt); | 139 | void (*destroy)(struct rpc_xprt *xprt); |
140 | void (*set_connect_timeout)(struct rpc_xprt *xprt, | ||
141 | unsigned long connect_timeout, | ||
142 | unsigned long reconnect_timeout); | ||
140 | void (*print_stats)(struct rpc_xprt *xprt, struct seq_file *seq); | 143 | void (*print_stats)(struct rpc_xprt *xprt, struct seq_file *seq); |
141 | int (*enable_swap)(struct rpc_xprt *xprt); | 144 | int (*enable_swap)(struct rpc_xprt *xprt); |
142 | void (*disable_swap)(struct rpc_xprt *xprt); | 145 | void (*disable_swap)(struct rpc_xprt *xprt); |
@@ -221,6 +224,7 @@ struct rpc_xprt { | |||
221 | struct timer_list timer; | 224 | struct timer_list timer; |
222 | unsigned long last_used, | 225 | unsigned long last_used, |
223 | idle_timeout, | 226 | idle_timeout, |
227 | connect_timeout, | ||
224 | max_reconnect_timeout; | 228 | max_reconnect_timeout; |
225 | 229 | ||
226 | /* | 230 | /* |
diff --git a/include/linux/sunrpc/xprtsock.h b/include/linux/sunrpc/xprtsock.h index bef3fb0abb8f..c9959d7e3579 100644 --- a/include/linux/sunrpc/xprtsock.h +++ b/include/linux/sunrpc/xprtsock.h | |||
@@ -55,6 +55,8 @@ struct sock_xprt { | |||
55 | size_t rcvsize, | 55 | size_t rcvsize, |
56 | sndsize; | 56 | sndsize; |
57 | 57 | ||
58 | struct rpc_timeout tcp_timeout; | ||
59 | |||
58 | /* | 60 | /* |
59 | * Saved socket callback addresses | 61 | * Saved socket callback addresses |
60 | */ | 62 | */ |
@@ -81,6 +83,7 @@ struct sock_xprt { | |||
81 | 83 | ||
82 | #define XPRT_SOCK_CONNECTING 1U | 84 | #define XPRT_SOCK_CONNECTING 1U |
83 | #define XPRT_SOCK_DATA_READY (2) | 85 | #define XPRT_SOCK_DATA_READY (2) |
86 | #define XPRT_SOCK_UPD_TIMEOUT (3) | ||
84 | 87 | ||
85 | #endif /* __KERNEL__ */ | 88 | #endif /* __KERNEL__ */ |
86 | 89 | ||
diff --git a/include/linux/thermal.h b/include/linux/thermal.h index e275e98bdceb..dab11f97e1c6 100644 --- a/include/linux/thermal.h +++ b/include/linux/thermal.h | |||
@@ -194,7 +194,7 @@ struct thermal_attr { | |||
194 | * @governor: pointer to the governor for this thermal zone | 194 | * @governor: pointer to the governor for this thermal zone |
195 | * @governor_data: private pointer for governor data | 195 | * @governor_data: private pointer for governor data |
196 | * @thermal_instances: list of &struct thermal_instance of this thermal zone | 196 | * @thermal_instances: list of &struct thermal_instance of this thermal zone |
197 | * @idr: &struct idr to generate unique id for this zone's cooling | 197 | * @ida: &struct ida to generate unique id for this zone's cooling |
198 | * devices | 198 | * devices |
199 | * @lock: lock to protect thermal_instances list | 199 | * @lock: lock to protect thermal_instances list |
200 | * @node: node in thermal_tz_list (in thermal_core.c) | 200 | * @node: node in thermal_tz_list (in thermal_core.c) |
@@ -227,7 +227,7 @@ struct thermal_zone_device { | |||
227 | struct thermal_governor *governor; | 227 | struct thermal_governor *governor; |
228 | void *governor_data; | 228 | void *governor_data; |
229 | struct list_head thermal_instances; | 229 | struct list_head thermal_instances; |
230 | struct idr idr; | 230 | struct ida ida; |
231 | struct mutex lock; | 231 | struct mutex lock; |
232 | struct list_head node; | 232 | struct list_head node; |
233 | struct delayed_work poll_queue; | 233 | struct delayed_work poll_queue; |
diff --git a/include/trace/events/f2fs.h b/include/trace/events/f2fs.h index 01b3c9869a0d..c80fcad0a6c9 100644 --- a/include/trace/events/f2fs.h +++ b/include/trace/events/f2fs.h | |||
@@ -6,8 +6,8 @@ | |||
6 | 6 | ||
7 | #include <linux/tracepoint.h> | 7 | #include <linux/tracepoint.h> |
8 | 8 | ||
9 | #define show_dev(entry) MAJOR(entry->dev), MINOR(entry->dev) | 9 | #define show_dev(dev) MAJOR(dev), MINOR(dev) |
10 | #define show_dev_ino(entry) show_dev(entry), (unsigned long)entry->ino | 10 | #define show_dev_ino(entry) show_dev(entry->dev), (unsigned long)entry->ino |
11 | 11 | ||
12 | TRACE_DEFINE_ENUM(NODE); | 12 | TRACE_DEFINE_ENUM(NODE); |
13 | TRACE_DEFINE_ENUM(DATA); | 13 | TRACE_DEFINE_ENUM(DATA); |
@@ -55,25 +55,35 @@ TRACE_DEFINE_ENUM(CP_DISCARD); | |||
55 | { IPU, "IN-PLACE" }, \ | 55 | { IPU, "IN-PLACE" }, \ |
56 | { OPU, "OUT-OF-PLACE" }) | 56 | { OPU, "OUT-OF-PLACE" }) |
57 | 57 | ||
58 | #define F2FS_BIO_FLAG_MASK(t) (t & (REQ_RAHEAD | REQ_PREFLUSH | REQ_FUA)) | 58 | #define F2FS_OP_FLAGS (REQ_RAHEAD | REQ_SYNC | REQ_PREFLUSH | REQ_META |\ |
59 | #define F2FS_BIO_EXTRA_MASK(t) (t & (REQ_META | REQ_PRIO)) | 59 | REQ_PRIO) |
60 | 60 | #define F2FS_BIO_FLAG_MASK(t) (t & F2FS_OP_FLAGS) | |
61 | #define show_bio_type(op_flags) show_bio_op_flags(op_flags), \ | 61 | |
62 | show_bio_extra(op_flags) | 62 | #define show_bio_type(op,op_flags) show_bio_op(op), \ |
63 | show_bio_op_flags(op_flags) | ||
64 | |||
65 | #define show_bio_op(op) \ | ||
66 | __print_symbolic(op, \ | ||
67 | { REQ_OP_READ, "READ" }, \ | ||
68 | { REQ_OP_WRITE, "WRITE" }, \ | ||
69 | { REQ_OP_FLUSH, "FLUSH" }, \ | ||
70 | { REQ_OP_DISCARD, "DISCARD" }, \ | ||
71 | { REQ_OP_ZONE_REPORT, "ZONE_REPORT" }, \ | ||
72 | { REQ_OP_SECURE_ERASE, "SECURE_ERASE" }, \ | ||
73 | { REQ_OP_ZONE_RESET, "ZONE_RESET" }, \ | ||
74 | { REQ_OP_WRITE_SAME, "WRITE_SAME" }, \ | ||
75 | { REQ_OP_WRITE_ZEROES, "WRITE_ZEROES" }) | ||
63 | 76 | ||
64 | #define show_bio_op_flags(flags) \ | 77 | #define show_bio_op_flags(flags) \ |
65 | __print_symbolic(F2FS_BIO_FLAG_MASK(flags), \ | 78 | __print_symbolic(F2FS_BIO_FLAG_MASK(flags), \ |
66 | { 0, "WRITE" }, \ | 79 | { REQ_RAHEAD, "(RA)" }, \ |
67 | { REQ_RAHEAD, "READAHEAD" }, \ | 80 | { REQ_SYNC, "(S)" }, \ |
68 | { REQ_SYNC, "REQ_SYNC" }, \ | 81 | { REQ_SYNC | REQ_PRIO, "(SP)" }, \ |
69 | { REQ_PREFLUSH, "REQ_PREFLUSH" }, \ | ||
70 | { REQ_FUA, "REQ_FUA" }) | ||
71 | |||
72 | #define show_bio_extra(type) \ | ||
73 | __print_symbolic(F2FS_BIO_EXTRA_MASK(type), \ | ||
74 | { REQ_META, "(M)" }, \ | 82 | { REQ_META, "(M)" }, \ |
75 | { REQ_PRIO, "(P)" }, \ | ||
76 | { REQ_META | REQ_PRIO, "(MP)" }, \ | 83 | { REQ_META | REQ_PRIO, "(MP)" }, \ |
84 | { REQ_SYNC | REQ_PREFLUSH , "(SF)" }, \ | ||
85 | { REQ_SYNC | REQ_META | REQ_PRIO, "(SMP)" }, \ | ||
86 | { REQ_PREFLUSH | REQ_META | REQ_PRIO, "(FMP)" }, \ | ||
77 | { 0, " \b" }) | 87 | { 0, " \b" }) |
78 | 88 | ||
79 | #define show_data_type(type) \ | 89 | #define show_data_type(type) \ |
@@ -235,7 +245,7 @@ TRACE_EVENT(f2fs_sync_fs, | |||
235 | ), | 245 | ), |
236 | 246 | ||
237 | TP_printk("dev = (%d,%d), superblock is %s, wait = %d", | 247 | TP_printk("dev = (%d,%d), superblock is %s, wait = %d", |
238 | show_dev(__entry), | 248 | show_dev(__entry->dev), |
239 | __entry->dirty ? "dirty" : "not dirty", | 249 | __entry->dirty ? "dirty" : "not dirty", |
240 | __entry->wait) | 250 | __entry->wait) |
241 | ); | 251 | ); |
@@ -305,6 +315,13 @@ DEFINE_EVENT(f2fs__inode_exit, f2fs_unlink_exit, | |||
305 | TP_ARGS(inode, ret) | 315 | TP_ARGS(inode, ret) |
306 | ); | 316 | ); |
307 | 317 | ||
318 | DEFINE_EVENT(f2fs__inode_exit, f2fs_drop_inode, | ||
319 | |||
320 | TP_PROTO(struct inode *inode, int ret), | ||
321 | |||
322 | TP_ARGS(inode, ret) | ||
323 | ); | ||
324 | |||
308 | DEFINE_EVENT(f2fs__inode, f2fs_truncate, | 325 | DEFINE_EVENT(f2fs__inode, f2fs_truncate, |
309 | 326 | ||
310 | TP_PROTO(struct inode *inode), | 327 | TP_PROTO(struct inode *inode), |
@@ -534,7 +551,7 @@ TRACE_EVENT(f2fs_background_gc, | |||
534 | ), | 551 | ), |
535 | 552 | ||
536 | TP_printk("dev = (%d,%d), wait_ms = %ld, prefree = %u, free = %u", | 553 | TP_printk("dev = (%d,%d), wait_ms = %ld, prefree = %u, free = %u", |
537 | show_dev(__entry), | 554 | show_dev(__entry->dev), |
538 | __entry->wait_ms, | 555 | __entry->wait_ms, |
539 | __entry->prefree, | 556 | __entry->prefree, |
540 | __entry->free) | 557 | __entry->free) |
@@ -555,6 +572,7 @@ TRACE_EVENT(f2fs_get_victim, | |||
555 | __field(int, alloc_mode) | 572 | __field(int, alloc_mode) |
556 | __field(int, gc_mode) | 573 | __field(int, gc_mode) |
557 | __field(unsigned int, victim) | 574 | __field(unsigned int, victim) |
575 | __field(unsigned int, cost) | ||
558 | __field(unsigned int, ofs_unit) | 576 | __field(unsigned int, ofs_unit) |
559 | __field(unsigned int, pre_victim) | 577 | __field(unsigned int, pre_victim) |
560 | __field(unsigned int, prefree) | 578 | __field(unsigned int, prefree) |
@@ -568,20 +586,23 @@ TRACE_EVENT(f2fs_get_victim, | |||
568 | __entry->alloc_mode = p->alloc_mode; | 586 | __entry->alloc_mode = p->alloc_mode; |
569 | __entry->gc_mode = p->gc_mode; | 587 | __entry->gc_mode = p->gc_mode; |
570 | __entry->victim = p->min_segno; | 588 | __entry->victim = p->min_segno; |
589 | __entry->cost = p->min_cost; | ||
571 | __entry->ofs_unit = p->ofs_unit; | 590 | __entry->ofs_unit = p->ofs_unit; |
572 | __entry->pre_victim = pre_victim; | 591 | __entry->pre_victim = pre_victim; |
573 | __entry->prefree = prefree; | 592 | __entry->prefree = prefree; |
574 | __entry->free = free; | 593 | __entry->free = free; |
575 | ), | 594 | ), |
576 | 595 | ||
577 | TP_printk("dev = (%d,%d), type = %s, policy = (%s, %s, %s), victim = %u " | 596 | TP_printk("dev = (%d,%d), type = %s, policy = (%s, %s, %s), " |
578 | "ofs_unit = %u, pre_victim_secno = %d, prefree = %u, free = %u", | 597 | "victim = %u, cost = %u, ofs_unit = %u, " |
579 | show_dev(__entry), | 598 | "pre_victim_secno = %d, prefree = %u, free = %u", |
599 | show_dev(__entry->dev), | ||
580 | show_data_type(__entry->type), | 600 | show_data_type(__entry->type), |
581 | show_gc_type(__entry->gc_type), | 601 | show_gc_type(__entry->gc_type), |
582 | show_alloc_mode(__entry->alloc_mode), | 602 | show_alloc_mode(__entry->alloc_mode), |
583 | show_victim_policy(__entry->gc_mode), | 603 | show_victim_policy(__entry->gc_mode), |
584 | __entry->victim, | 604 | __entry->victim, |
605 | __entry->cost, | ||
585 | __entry->ofs_unit, | 606 | __entry->ofs_unit, |
586 | (int)__entry->pre_victim, | 607 | (int)__entry->pre_victim, |
587 | __entry->prefree, | 608 | __entry->prefree, |
@@ -713,7 +734,7 @@ TRACE_EVENT(f2fs_reserve_new_blocks, | |||
713 | ), | 734 | ), |
714 | 735 | ||
715 | TP_printk("dev = (%d,%d), nid = %u, ofs_in_node = %u, count = %llu", | 736 | TP_printk("dev = (%d,%d), nid = %u, ofs_in_node = %u, count = %llu", |
716 | show_dev(__entry), | 737 | show_dev(__entry->dev), |
717 | (unsigned int)__entry->nid, | 738 | (unsigned int)__entry->nid, |
718 | __entry->ofs_in_node, | 739 | __entry->ofs_in_node, |
719 | (unsigned long long)__entry->count) | 740 | (unsigned long long)__entry->count) |
@@ -753,7 +774,7 @@ DECLARE_EVENT_CLASS(f2fs__submit_page_bio, | |||
753 | (unsigned long)__entry->index, | 774 | (unsigned long)__entry->index, |
754 | (unsigned long long)__entry->old_blkaddr, | 775 | (unsigned long long)__entry->old_blkaddr, |
755 | (unsigned long long)__entry->new_blkaddr, | 776 | (unsigned long long)__entry->new_blkaddr, |
756 | show_bio_type(__entry->op_flags), | 777 | show_bio_type(__entry->op, __entry->op_flags), |
757 | show_block_type(__entry->type)) | 778 | show_block_type(__entry->type)) |
758 | ); | 779 | ); |
759 | 780 | ||
@@ -775,15 +796,15 @@ DEFINE_EVENT_CONDITION(f2fs__submit_page_bio, f2fs_submit_page_mbio, | |||
775 | TP_CONDITION(page->mapping) | 796 | TP_CONDITION(page->mapping) |
776 | ); | 797 | ); |
777 | 798 | ||
778 | DECLARE_EVENT_CLASS(f2fs__submit_bio, | 799 | DECLARE_EVENT_CLASS(f2fs__bio, |
779 | 800 | ||
780 | TP_PROTO(struct super_block *sb, struct f2fs_io_info *fio, | 801 | TP_PROTO(struct super_block *sb, int type, struct bio *bio), |
781 | struct bio *bio), | ||
782 | 802 | ||
783 | TP_ARGS(sb, fio, bio), | 803 | TP_ARGS(sb, type, bio), |
784 | 804 | ||
785 | TP_STRUCT__entry( | 805 | TP_STRUCT__entry( |
786 | __field(dev_t, dev) | 806 | __field(dev_t, dev) |
807 | __field(dev_t, target) | ||
787 | __field(int, op) | 808 | __field(int, op) |
788 | __field(int, op_flags) | 809 | __field(int, op_flags) |
789 | __field(int, type) | 810 | __field(int, type) |
@@ -793,37 +814,55 @@ DECLARE_EVENT_CLASS(f2fs__submit_bio, | |||
793 | 814 | ||
794 | TP_fast_assign( | 815 | TP_fast_assign( |
795 | __entry->dev = sb->s_dev; | 816 | __entry->dev = sb->s_dev; |
796 | __entry->op = fio->op; | 817 | __entry->target = bio->bi_bdev->bd_dev; |
797 | __entry->op_flags = fio->op_flags; | 818 | __entry->op = bio_op(bio); |
798 | __entry->type = fio->type; | 819 | __entry->op_flags = bio->bi_opf; |
820 | __entry->type = type; | ||
799 | __entry->sector = bio->bi_iter.bi_sector; | 821 | __entry->sector = bio->bi_iter.bi_sector; |
800 | __entry->size = bio->bi_iter.bi_size; | 822 | __entry->size = bio->bi_iter.bi_size; |
801 | ), | 823 | ), |
802 | 824 | ||
803 | TP_printk("dev = (%d,%d), rw = %s%s, %s, sector = %lld, size = %u", | 825 | TP_printk("dev = (%d,%d)/(%d,%d), rw = %s%s, %s, sector = %lld, size = %u", |
804 | show_dev(__entry), | 826 | show_dev(__entry->target), |
805 | show_bio_type(__entry->op_flags), | 827 | show_dev(__entry->dev), |
828 | show_bio_type(__entry->op, __entry->op_flags), | ||
806 | show_block_type(__entry->type), | 829 | show_block_type(__entry->type), |
807 | (unsigned long long)__entry->sector, | 830 | (unsigned long long)__entry->sector, |
808 | __entry->size) | 831 | __entry->size) |
809 | ); | 832 | ); |
810 | 833 | ||
811 | DEFINE_EVENT_CONDITION(f2fs__submit_bio, f2fs_submit_write_bio, | 834 | DEFINE_EVENT_CONDITION(f2fs__bio, f2fs_prepare_write_bio, |
835 | |||
836 | TP_PROTO(struct super_block *sb, int type, struct bio *bio), | ||
837 | |||
838 | TP_ARGS(sb, type, bio), | ||
839 | |||
840 | TP_CONDITION(bio) | ||
841 | ); | ||
842 | |||
843 | DEFINE_EVENT_CONDITION(f2fs__bio, f2fs_prepare_read_bio, | ||
812 | 844 | ||
813 | TP_PROTO(struct super_block *sb, struct f2fs_io_info *fio, | 845 | TP_PROTO(struct super_block *sb, int type, struct bio *bio), |
814 | struct bio *bio), | ||
815 | 846 | ||
816 | TP_ARGS(sb, fio, bio), | 847 | TP_ARGS(sb, type, bio), |
817 | 848 | ||
818 | TP_CONDITION(bio) | 849 | TP_CONDITION(bio) |
819 | ); | 850 | ); |
820 | 851 | ||
821 | DEFINE_EVENT_CONDITION(f2fs__submit_bio, f2fs_submit_read_bio, | 852 | DEFINE_EVENT_CONDITION(f2fs__bio, f2fs_submit_read_bio, |
822 | 853 | ||
823 | TP_PROTO(struct super_block *sb, struct f2fs_io_info *fio, | 854 | TP_PROTO(struct super_block *sb, int type, struct bio *bio), |
824 | struct bio *bio), | ||
825 | 855 | ||
826 | TP_ARGS(sb, fio, bio), | 856 | TP_ARGS(sb, type, bio), |
857 | |||
858 | TP_CONDITION(bio) | ||
859 | ); | ||
860 | |||
861 | DEFINE_EVENT_CONDITION(f2fs__bio, f2fs_submit_write_bio, | ||
862 | |||
863 | TP_PROTO(struct super_block *sb, int type, struct bio *bio), | ||
864 | |||
865 | TP_ARGS(sb, type, bio), | ||
827 | 866 | ||
828 | TP_CONDITION(bio) | 867 | TP_CONDITION(bio) |
829 | ); | 868 | ); |
@@ -1082,16 +1121,16 @@ TRACE_EVENT(f2fs_write_checkpoint, | |||
1082 | ), | 1121 | ), |
1083 | 1122 | ||
1084 | TP_printk("dev = (%d,%d), checkpoint for %s, state = %s", | 1123 | TP_printk("dev = (%d,%d), checkpoint for %s, state = %s", |
1085 | show_dev(__entry), | 1124 | show_dev(__entry->dev), |
1086 | show_cpreason(__entry->reason), | 1125 | show_cpreason(__entry->reason), |
1087 | __entry->msg) | 1126 | __entry->msg) |
1088 | ); | 1127 | ); |
1089 | 1128 | ||
1090 | TRACE_EVENT(f2fs_issue_discard, | 1129 | TRACE_EVENT(f2fs_issue_discard, |
1091 | 1130 | ||
1092 | TP_PROTO(struct super_block *sb, block_t blkstart, block_t blklen), | 1131 | TP_PROTO(struct block_device *dev, block_t blkstart, block_t blklen), |
1093 | 1132 | ||
1094 | TP_ARGS(sb, blkstart, blklen), | 1133 | TP_ARGS(dev, blkstart, blklen), |
1095 | 1134 | ||
1096 | TP_STRUCT__entry( | 1135 | TP_STRUCT__entry( |
1097 | __field(dev_t, dev) | 1136 | __field(dev_t, dev) |
@@ -1100,22 +1139,22 @@ TRACE_EVENT(f2fs_issue_discard, | |||
1100 | ), | 1139 | ), |
1101 | 1140 | ||
1102 | TP_fast_assign( | 1141 | TP_fast_assign( |
1103 | __entry->dev = sb->s_dev; | 1142 | __entry->dev = dev->bd_dev; |
1104 | __entry->blkstart = blkstart; | 1143 | __entry->blkstart = blkstart; |
1105 | __entry->blklen = blklen; | 1144 | __entry->blklen = blklen; |
1106 | ), | 1145 | ), |
1107 | 1146 | ||
1108 | TP_printk("dev = (%d,%d), blkstart = 0x%llx, blklen = 0x%llx", | 1147 | TP_printk("dev = (%d,%d), blkstart = 0x%llx, blklen = 0x%llx", |
1109 | show_dev(__entry), | 1148 | show_dev(__entry->dev), |
1110 | (unsigned long long)__entry->blkstart, | 1149 | (unsigned long long)__entry->blkstart, |
1111 | (unsigned long long)__entry->blklen) | 1150 | (unsigned long long)__entry->blklen) |
1112 | ); | 1151 | ); |
1113 | 1152 | ||
1114 | TRACE_EVENT(f2fs_issue_reset_zone, | 1153 | TRACE_EVENT(f2fs_issue_reset_zone, |
1115 | 1154 | ||
1116 | TP_PROTO(struct super_block *sb, block_t blkstart), | 1155 | TP_PROTO(struct block_device *dev, block_t blkstart), |
1117 | 1156 | ||
1118 | TP_ARGS(sb, blkstart), | 1157 | TP_ARGS(dev, blkstart), |
1119 | 1158 | ||
1120 | TP_STRUCT__entry( | 1159 | TP_STRUCT__entry( |
1121 | __field(dev_t, dev) | 1160 | __field(dev_t, dev) |
@@ -1123,21 +1162,21 @@ TRACE_EVENT(f2fs_issue_reset_zone, | |||
1123 | ), | 1162 | ), |
1124 | 1163 | ||
1125 | TP_fast_assign( | 1164 | TP_fast_assign( |
1126 | __entry->dev = sb->s_dev; | 1165 | __entry->dev = dev->bd_dev; |
1127 | __entry->blkstart = blkstart; | 1166 | __entry->blkstart = blkstart; |
1128 | ), | 1167 | ), |
1129 | 1168 | ||
1130 | TP_printk("dev = (%d,%d), reset zone at block = 0x%llx", | 1169 | TP_printk("dev = (%d,%d), reset zone at block = 0x%llx", |
1131 | show_dev(__entry), | 1170 | show_dev(__entry->dev), |
1132 | (unsigned long long)__entry->blkstart) | 1171 | (unsigned long long)__entry->blkstart) |
1133 | ); | 1172 | ); |
1134 | 1173 | ||
1135 | TRACE_EVENT(f2fs_issue_flush, | 1174 | TRACE_EVENT(f2fs_issue_flush, |
1136 | 1175 | ||
1137 | TP_PROTO(struct super_block *sb, unsigned int nobarrier, | 1176 | TP_PROTO(struct block_device *dev, unsigned int nobarrier, |
1138 | unsigned int flush_merge), | 1177 | unsigned int flush_merge), |
1139 | 1178 | ||
1140 | TP_ARGS(sb, nobarrier, flush_merge), | 1179 | TP_ARGS(dev, nobarrier, flush_merge), |
1141 | 1180 | ||
1142 | TP_STRUCT__entry( | 1181 | TP_STRUCT__entry( |
1143 | __field(dev_t, dev) | 1182 | __field(dev_t, dev) |
@@ -1146,13 +1185,13 @@ TRACE_EVENT(f2fs_issue_flush, | |||
1146 | ), | 1185 | ), |
1147 | 1186 | ||
1148 | TP_fast_assign( | 1187 | TP_fast_assign( |
1149 | __entry->dev = sb->s_dev; | 1188 | __entry->dev = dev->bd_dev; |
1150 | __entry->nobarrier = nobarrier; | 1189 | __entry->nobarrier = nobarrier; |
1151 | __entry->flush_merge = flush_merge; | 1190 | __entry->flush_merge = flush_merge; |
1152 | ), | 1191 | ), |
1153 | 1192 | ||
1154 | TP_printk("dev = (%d,%d), %s %s", | 1193 | TP_printk("dev = (%d,%d), %s %s", |
1155 | show_dev(__entry), | 1194 | show_dev(__entry->dev), |
1156 | __entry->nobarrier ? "skip (nobarrier)" : "issue", | 1195 | __entry->nobarrier ? "skip (nobarrier)" : "issue", |
1157 | __entry->flush_merge ? " with flush_merge" : "") | 1196 | __entry->flush_merge ? " with flush_merge" : "") |
1158 | ); | 1197 | ); |
@@ -1267,7 +1306,7 @@ TRACE_EVENT(f2fs_shrink_extent_tree, | |||
1267 | ), | 1306 | ), |
1268 | 1307 | ||
1269 | TP_printk("dev = (%d,%d), shrunk: node_cnt = %u, tree_cnt = %u", | 1308 | TP_printk("dev = (%d,%d), shrunk: node_cnt = %u, tree_cnt = %u", |
1270 | show_dev(__entry), | 1309 | show_dev(__entry->dev), |
1271 | __entry->node_cnt, | 1310 | __entry->node_cnt, |
1272 | __entry->tree_cnt) | 1311 | __entry->tree_cnt) |
1273 | ); | 1312 | ); |
@@ -1314,7 +1353,7 @@ DECLARE_EVENT_CLASS(f2fs_sync_dirty_inodes, | |||
1314 | ), | 1353 | ), |
1315 | 1354 | ||
1316 | TP_printk("dev = (%d,%d), %s, dirty count = %lld", | 1355 | TP_printk("dev = (%d,%d), %s, dirty count = %lld", |
1317 | show_dev(__entry), | 1356 | show_dev(__entry->dev), |
1318 | show_file_type(__entry->type), | 1357 | show_file_type(__entry->type), |
1319 | __entry->count) | 1358 | __entry->count) |
1320 | ); | 1359 | ); |
diff --git a/net/sunrpc/auth.c b/net/sunrpc/auth.c index 2bff63a73cf8..a1ee933e3029 100644 --- a/net/sunrpc/auth.c +++ b/net/sunrpc/auth.c | |||
@@ -464,8 +464,10 @@ rpcauth_prune_expired(struct list_head *free, int nr_to_scan) | |||
464 | * Note that the cred_unused list must be time-ordered. | 464 | * Note that the cred_unused list must be time-ordered. |
465 | */ | 465 | */ |
466 | if (time_in_range(cred->cr_expire, expired, jiffies) && | 466 | if (time_in_range(cred->cr_expire, expired, jiffies) && |
467 | test_bit(RPCAUTH_CRED_HASHED, &cred->cr_flags) != 0) | 467 | test_bit(RPCAUTH_CRED_HASHED, &cred->cr_flags) != 0) { |
468 | freed = SHRINK_STOP; | ||
468 | break; | 469 | break; |
470 | } | ||
469 | 471 | ||
470 | list_del_init(&cred->cr_lru); | 472 | list_del_init(&cred->cr_lru); |
471 | number_cred_unused--; | 473 | number_cred_unused--; |
@@ -520,7 +522,7 @@ static unsigned long | |||
520 | rpcauth_cache_shrink_count(struct shrinker *shrink, struct shrink_control *sc) | 522 | rpcauth_cache_shrink_count(struct shrinker *shrink, struct shrink_control *sc) |
521 | 523 | ||
522 | { | 524 | { |
523 | return (number_cred_unused / 100) * sysctl_vfs_cache_pressure; | 525 | return number_cred_unused * sysctl_vfs_cache_pressure / 100; |
524 | } | 526 | } |
525 | 527 | ||
526 | static void | 528 | static void |
@@ -646,9 +648,6 @@ rpcauth_init_cred(struct rpc_cred *cred, const struct auth_cred *acred, | |||
646 | cred->cr_auth = auth; | 648 | cred->cr_auth = auth; |
647 | cred->cr_ops = ops; | 649 | cred->cr_ops = ops; |
648 | cred->cr_expire = jiffies; | 650 | cred->cr_expire = jiffies; |
649 | #if IS_ENABLED(CONFIG_SUNRPC_DEBUG) | ||
650 | cred->cr_magic = RPCAUTH_CRED_MAGIC; | ||
651 | #endif | ||
652 | cred->cr_uid = acred->uid; | 651 | cred->cr_uid = acred->uid; |
653 | } | 652 | } |
654 | EXPORT_SYMBOL_GPL(rpcauth_init_cred); | 653 | EXPORT_SYMBOL_GPL(rpcauth_init_cred); |
@@ -876,8 +875,12 @@ int __init rpcauth_init_module(void) | |||
876 | err = rpc_init_generic_auth(); | 875 | err = rpc_init_generic_auth(); |
877 | if (err < 0) | 876 | if (err < 0) |
878 | goto out2; | 877 | goto out2; |
879 | register_shrinker(&rpc_cred_shrinker); | 878 | err = register_shrinker(&rpc_cred_shrinker); |
879 | if (err < 0) | ||
880 | goto out3; | ||
880 | return 0; | 881 | return 0; |
882 | out3: | ||
883 | rpc_destroy_generic_auth(); | ||
881 | out2: | 884 | out2: |
882 | rpc_destroy_authunix(); | 885 | rpc_destroy_authunix(); |
883 | out1: | 886 | out1: |
diff --git a/net/sunrpc/auth_null.c b/net/sunrpc/auth_null.c index 4d17376b2acb..5f3d527dff65 100644 --- a/net/sunrpc/auth_null.c +++ b/net/sunrpc/auth_null.c | |||
@@ -139,7 +139,4 @@ struct rpc_cred null_cred = { | |||
139 | .cr_ops = &null_credops, | 139 | .cr_ops = &null_credops, |
140 | .cr_count = ATOMIC_INIT(1), | 140 | .cr_count = ATOMIC_INIT(1), |
141 | .cr_flags = 1UL << RPCAUTH_CRED_UPTODATE, | 141 | .cr_flags = 1UL << RPCAUTH_CRED_UPTODATE, |
142 | #if IS_ENABLED(CONFIG_SUNRPC_DEBUG) | ||
143 | .cr_magic = RPCAUTH_CRED_MAGIC, | ||
144 | #endif | ||
145 | }; | 142 | }; |
diff --git a/net/sunrpc/auth_unix.c b/net/sunrpc/auth_unix.c index 306fc0f54596..82337e1ec9cd 100644 --- a/net/sunrpc/auth_unix.c +++ b/net/sunrpc/auth_unix.c | |||
@@ -14,12 +14,10 @@ | |||
14 | #include <linux/sunrpc/auth.h> | 14 | #include <linux/sunrpc/auth.h> |
15 | #include <linux/user_namespace.h> | 15 | #include <linux/user_namespace.h> |
16 | 16 | ||
17 | #define NFS_NGROUPS 16 | ||
18 | |||
19 | struct unx_cred { | 17 | struct unx_cred { |
20 | struct rpc_cred uc_base; | 18 | struct rpc_cred uc_base; |
21 | kgid_t uc_gid; | 19 | kgid_t uc_gid; |
22 | kgid_t uc_gids[NFS_NGROUPS]; | 20 | kgid_t uc_gids[UNX_NGROUPS]; |
23 | }; | 21 | }; |
24 | #define uc_uid uc_base.cr_uid | 22 | #define uc_uid uc_base.cr_uid |
25 | 23 | ||
@@ -82,13 +80,13 @@ unx_create_cred(struct rpc_auth *auth, struct auth_cred *acred, int flags, gfp_t | |||
82 | 80 | ||
83 | if (acred->group_info != NULL) | 81 | if (acred->group_info != NULL) |
84 | groups = acred->group_info->ngroups; | 82 | groups = acred->group_info->ngroups; |
85 | if (groups > NFS_NGROUPS) | 83 | if (groups > UNX_NGROUPS) |
86 | groups = NFS_NGROUPS; | 84 | groups = UNX_NGROUPS; |
87 | 85 | ||
88 | cred->uc_gid = acred->gid; | 86 | cred->uc_gid = acred->gid; |
89 | for (i = 0; i < groups; i++) | 87 | for (i = 0; i < groups; i++) |
90 | cred->uc_gids[i] = acred->group_info->gid[i]; | 88 | cred->uc_gids[i] = acred->group_info->gid[i]; |
91 | if (i < NFS_NGROUPS) | 89 | if (i < UNX_NGROUPS) |
92 | cred->uc_gids[i] = INVALID_GID; | 90 | cred->uc_gids[i] = INVALID_GID; |
93 | 91 | ||
94 | return &cred->uc_base; | 92 | return &cred->uc_base; |
@@ -132,12 +130,12 @@ unx_match(struct auth_cred *acred, struct rpc_cred *rcred, int flags) | |||
132 | 130 | ||
133 | if (acred->group_info != NULL) | 131 | if (acred->group_info != NULL) |
134 | groups = acred->group_info->ngroups; | 132 | groups = acred->group_info->ngroups; |
135 | if (groups > NFS_NGROUPS) | 133 | if (groups > UNX_NGROUPS) |
136 | groups = NFS_NGROUPS; | 134 | groups = UNX_NGROUPS; |
137 | for (i = 0; i < groups ; i++) | 135 | for (i = 0; i < groups ; i++) |
138 | if (!gid_eq(cred->uc_gids[i], acred->group_info->gid[i])) | 136 | if (!gid_eq(cred->uc_gids[i], acred->group_info->gid[i])) |
139 | return 0; | 137 | return 0; |
140 | if (groups < NFS_NGROUPS && gid_valid(cred->uc_gids[groups])) | 138 | if (groups < UNX_NGROUPS && gid_valid(cred->uc_gids[groups])) |
141 | return 0; | 139 | return 0; |
142 | return 1; | 140 | return 1; |
143 | } | 141 | } |
@@ -166,7 +164,7 @@ unx_marshal(struct rpc_task *task, __be32 *p) | |||
166 | *p++ = htonl((u32) from_kuid(&init_user_ns, cred->uc_uid)); | 164 | *p++ = htonl((u32) from_kuid(&init_user_ns, cred->uc_uid)); |
167 | *p++ = htonl((u32) from_kgid(&init_user_ns, cred->uc_gid)); | 165 | *p++ = htonl((u32) from_kgid(&init_user_ns, cred->uc_gid)); |
168 | hold = p++; | 166 | hold = p++; |
169 | for (i = 0; i < 16 && gid_valid(cred->uc_gids[i]); i++) | 167 | for (i = 0; i < UNX_NGROUPS && gid_valid(cred->uc_gids[i]); i++) |
170 | *p++ = htonl((u32) from_kgid(&init_user_ns, cred->uc_gids[i])); | 168 | *p++ = htonl((u32) from_kgid(&init_user_ns, cred->uc_gids[i])); |
171 | *hold = htonl(p - hold - 1); /* gid array length */ | 169 | *hold = htonl(p - hold - 1); /* gid array length */ |
172 | *base = htonl((p - base - 1) << 2); /* cred length */ | 170 | *base = htonl((p - base - 1) << 2); /* cred length */ |
diff --git a/net/sunrpc/cache.c b/net/sunrpc/cache.c index d8639da06d9c..79d55d949d9a 100644 --- a/net/sunrpc/cache.c +++ b/net/sunrpc/cache.c | |||
@@ -728,7 +728,7 @@ void cache_clean_deferred(void *owner) | |||
728 | /* | 728 | /* |
729 | * communicate with user-space | 729 | * communicate with user-space |
730 | * | 730 | * |
731 | * We have a magic /proc file - /proc/sunrpc/<cachename>/channel. | 731 | * We have a magic /proc file - /proc/net/rpc/<cachename>/channel. |
732 | * On read, you get a full request, or block. | 732 | * On read, you get a full request, or block. |
733 | * On write, an update request is processed. | 733 | * On write, an update request is processed. |
734 | * Poll works if anything to read, and always allows write. | 734 | * Poll works if anything to read, and always allows write. |
@@ -1283,7 +1283,7 @@ EXPORT_SYMBOL_GPL(qword_get); | |||
1283 | 1283 | ||
1284 | 1284 | ||
1285 | /* | 1285 | /* |
1286 | * support /proc/sunrpc/cache/$CACHENAME/content | 1286 | * support /proc/net/rpc/$CACHENAME/content |
1287 | * as a seqfile. | 1287 | * as a seqfile. |
1288 | * We call ->cache_show passing NULL for the item to | 1288 | * We call ->cache_show passing NULL for the item to |
1289 | * get a header, then pass each real item in the cache | 1289 | * get a header, then pass each real item in the cache |
@@ -1438,20 +1438,11 @@ static ssize_t read_flush(struct file *file, char __user *buf, | |||
1438 | struct cache_detail *cd) | 1438 | struct cache_detail *cd) |
1439 | { | 1439 | { |
1440 | char tbuf[22]; | 1440 | char tbuf[22]; |
1441 | unsigned long p = *ppos; | ||
1442 | size_t len; | 1441 | size_t len; |
1443 | 1442 | ||
1444 | snprintf(tbuf, sizeof(tbuf), "%lu\n", convert_to_wallclock(cd->flush_time)); | 1443 | len = snprintf(tbuf, sizeof(tbuf), "%lu\n", |
1445 | len = strlen(tbuf); | 1444 | convert_to_wallclock(cd->flush_time)); |
1446 | if (p >= len) | 1445 | return simple_read_from_buffer(buf, count, ppos, tbuf, len); |
1447 | return 0; | ||
1448 | len -= p; | ||
1449 | if (len > count) | ||
1450 | len = count; | ||
1451 | if (copy_to_user(buf, (void*)(tbuf+p), len)) | ||
1452 | return -EFAULT; | ||
1453 | *ppos += len; | ||
1454 | return len; | ||
1455 | } | 1446 | } |
1456 | 1447 | ||
1457 | static ssize_t write_flush(struct file *file, const char __user *buf, | 1448 | static ssize_t write_flush(struct file *file, const char __user *buf, |
@@ -1611,21 +1602,12 @@ static const struct file_operations cache_flush_operations_procfs = { | |||
1611 | .llseek = no_llseek, | 1602 | .llseek = no_llseek, |
1612 | }; | 1603 | }; |
1613 | 1604 | ||
1614 | static void remove_cache_proc_entries(struct cache_detail *cd, struct net *net) | 1605 | static void remove_cache_proc_entries(struct cache_detail *cd) |
1615 | { | 1606 | { |
1616 | struct sunrpc_net *sn; | 1607 | if (cd->procfs) { |
1617 | 1608 | proc_remove(cd->procfs); | |
1618 | if (cd->u.procfs.proc_ent == NULL) | 1609 | cd->procfs = NULL; |
1619 | return; | 1610 | } |
1620 | if (cd->u.procfs.flush_ent) | ||
1621 | remove_proc_entry("flush", cd->u.procfs.proc_ent); | ||
1622 | if (cd->u.procfs.channel_ent) | ||
1623 | remove_proc_entry("channel", cd->u.procfs.proc_ent); | ||
1624 | if (cd->u.procfs.content_ent) | ||
1625 | remove_proc_entry("content", cd->u.procfs.proc_ent); | ||
1626 | cd->u.procfs.proc_ent = NULL; | ||
1627 | sn = net_generic(net, sunrpc_net_id); | ||
1628 | remove_proc_entry(cd->name, sn->proc_net_rpc); | ||
1629 | } | 1611 | } |
1630 | 1612 | ||
1631 | #ifdef CONFIG_PROC_FS | 1613 | #ifdef CONFIG_PROC_FS |
@@ -1635,38 +1617,30 @@ static int create_cache_proc_entries(struct cache_detail *cd, struct net *net) | |||
1635 | struct sunrpc_net *sn; | 1617 | struct sunrpc_net *sn; |
1636 | 1618 | ||
1637 | sn = net_generic(net, sunrpc_net_id); | 1619 | sn = net_generic(net, sunrpc_net_id); |
1638 | cd->u.procfs.proc_ent = proc_mkdir(cd->name, sn->proc_net_rpc); | 1620 | cd->procfs = proc_mkdir(cd->name, sn->proc_net_rpc); |
1639 | if (cd->u.procfs.proc_ent == NULL) | 1621 | if (cd->procfs == NULL) |
1640 | goto out_nomem; | 1622 | goto out_nomem; |
1641 | cd->u.procfs.channel_ent = NULL; | ||
1642 | cd->u.procfs.content_ent = NULL; | ||
1643 | 1623 | ||
1644 | p = proc_create_data("flush", S_IFREG|S_IRUSR|S_IWUSR, | 1624 | p = proc_create_data("flush", S_IFREG|S_IRUSR|S_IWUSR, |
1645 | cd->u.procfs.proc_ent, | 1625 | cd->procfs, &cache_flush_operations_procfs, cd); |
1646 | &cache_flush_operations_procfs, cd); | ||
1647 | cd->u.procfs.flush_ent = p; | ||
1648 | if (p == NULL) | 1626 | if (p == NULL) |
1649 | goto out_nomem; | 1627 | goto out_nomem; |
1650 | 1628 | ||
1651 | if (cd->cache_request || cd->cache_parse) { | 1629 | if (cd->cache_request || cd->cache_parse) { |
1652 | p = proc_create_data("channel", S_IFREG|S_IRUSR|S_IWUSR, | 1630 | p = proc_create_data("channel", S_IFREG|S_IRUSR|S_IWUSR, |
1653 | cd->u.procfs.proc_ent, | 1631 | cd->procfs, &cache_file_operations_procfs, cd); |
1654 | &cache_file_operations_procfs, cd); | ||
1655 | cd->u.procfs.channel_ent = p; | ||
1656 | if (p == NULL) | 1632 | if (p == NULL) |
1657 | goto out_nomem; | 1633 | goto out_nomem; |
1658 | } | 1634 | } |
1659 | if (cd->cache_show) { | 1635 | if (cd->cache_show) { |
1660 | p = proc_create_data("content", S_IFREG|S_IRUSR, | 1636 | p = proc_create_data("content", S_IFREG|S_IRUSR, |
1661 | cd->u.procfs.proc_ent, | 1637 | cd->procfs, &content_file_operations_procfs, cd); |
1662 | &content_file_operations_procfs, cd); | ||
1663 | cd->u.procfs.content_ent = p; | ||
1664 | if (p == NULL) | 1638 | if (p == NULL) |
1665 | goto out_nomem; | 1639 | goto out_nomem; |
1666 | } | 1640 | } |
1667 | return 0; | 1641 | return 0; |
1668 | out_nomem: | 1642 | out_nomem: |
1669 | remove_cache_proc_entries(cd, net); | 1643 | remove_cache_proc_entries(cd); |
1670 | return -ENOMEM; | 1644 | return -ENOMEM; |
1671 | } | 1645 | } |
1672 | #else /* CONFIG_PROC_FS */ | 1646 | #else /* CONFIG_PROC_FS */ |
@@ -1695,7 +1669,7 @@ EXPORT_SYMBOL_GPL(cache_register_net); | |||
1695 | 1669 | ||
1696 | void cache_unregister_net(struct cache_detail *cd, struct net *net) | 1670 | void cache_unregister_net(struct cache_detail *cd, struct net *net) |
1697 | { | 1671 | { |
1698 | remove_cache_proc_entries(cd, net); | 1672 | remove_cache_proc_entries(cd); |
1699 | sunrpc_destroy_cache_detail(cd); | 1673 | sunrpc_destroy_cache_detail(cd); |
1700 | } | 1674 | } |
1701 | EXPORT_SYMBOL_GPL(cache_unregister_net); | 1675 | EXPORT_SYMBOL_GPL(cache_unregister_net); |
@@ -1854,15 +1828,17 @@ int sunrpc_cache_register_pipefs(struct dentry *parent, | |||
1854 | struct dentry *dir = rpc_create_cache_dir(parent, name, umode, cd); | 1828 | struct dentry *dir = rpc_create_cache_dir(parent, name, umode, cd); |
1855 | if (IS_ERR(dir)) | 1829 | if (IS_ERR(dir)) |
1856 | return PTR_ERR(dir); | 1830 | return PTR_ERR(dir); |
1857 | cd->u.pipefs.dir = dir; | 1831 | cd->pipefs = dir; |
1858 | return 0; | 1832 | return 0; |
1859 | } | 1833 | } |
1860 | EXPORT_SYMBOL_GPL(sunrpc_cache_register_pipefs); | 1834 | EXPORT_SYMBOL_GPL(sunrpc_cache_register_pipefs); |
1861 | 1835 | ||
1862 | void sunrpc_cache_unregister_pipefs(struct cache_detail *cd) | 1836 | void sunrpc_cache_unregister_pipefs(struct cache_detail *cd) |
1863 | { | 1837 | { |
1864 | rpc_remove_cache_dir(cd->u.pipefs.dir); | 1838 | if (cd->pipefs) { |
1865 | cd->u.pipefs.dir = NULL; | 1839 | rpc_remove_cache_dir(cd->pipefs); |
1840 | cd->pipefs = NULL; | ||
1841 | } | ||
1866 | } | 1842 | } |
1867 | EXPORT_SYMBOL_GPL(sunrpc_cache_unregister_pipefs); | 1843 | EXPORT_SYMBOL_GPL(sunrpc_cache_unregister_pipefs); |
1868 | 1844 | ||
diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c index 1dc9f3bac099..52da3ce54bb5 100644 --- a/net/sunrpc/clnt.c +++ b/net/sunrpc/clnt.c | |||
@@ -1453,21 +1453,6 @@ size_t rpc_max_bc_payload(struct rpc_clnt *clnt) | |||
1453 | EXPORT_SYMBOL_GPL(rpc_max_bc_payload); | 1453 | EXPORT_SYMBOL_GPL(rpc_max_bc_payload); |
1454 | 1454 | ||
1455 | /** | 1455 | /** |
1456 | * rpc_get_timeout - Get timeout for transport in units of HZ | ||
1457 | * @clnt: RPC client to query | ||
1458 | */ | ||
1459 | unsigned long rpc_get_timeout(struct rpc_clnt *clnt) | ||
1460 | { | ||
1461 | unsigned long ret; | ||
1462 | |||
1463 | rcu_read_lock(); | ||
1464 | ret = rcu_dereference(clnt->cl_xprt)->timeout->to_initval; | ||
1465 | rcu_read_unlock(); | ||
1466 | return ret; | ||
1467 | } | ||
1468 | EXPORT_SYMBOL_GPL(rpc_get_timeout); | ||
1469 | |||
1470 | /** | ||
1471 | * rpc_force_rebind - force transport to check that remote port is unchanged | 1456 | * rpc_force_rebind - force transport to check that remote port is unchanged |
1472 | * @clnt: client to rebind | 1457 | * @clnt: client to rebind |
1473 | * | 1458 | * |
@@ -2699,6 +2684,7 @@ int rpc_clnt_add_xprt(struct rpc_clnt *clnt, | |||
2699 | { | 2684 | { |
2700 | struct rpc_xprt_switch *xps; | 2685 | struct rpc_xprt_switch *xps; |
2701 | struct rpc_xprt *xprt; | 2686 | struct rpc_xprt *xprt; |
2687 | unsigned long connect_timeout; | ||
2702 | unsigned long reconnect_timeout; | 2688 | unsigned long reconnect_timeout; |
2703 | unsigned char resvport; | 2689 | unsigned char resvport; |
2704 | int ret = 0; | 2690 | int ret = 0; |
@@ -2711,6 +2697,7 @@ int rpc_clnt_add_xprt(struct rpc_clnt *clnt, | |||
2711 | return -EAGAIN; | 2697 | return -EAGAIN; |
2712 | } | 2698 | } |
2713 | resvport = xprt->resvport; | 2699 | resvport = xprt->resvport; |
2700 | connect_timeout = xprt->connect_timeout; | ||
2714 | reconnect_timeout = xprt->max_reconnect_timeout; | 2701 | reconnect_timeout = xprt->max_reconnect_timeout; |
2715 | rcu_read_unlock(); | 2702 | rcu_read_unlock(); |
2716 | 2703 | ||
@@ -2720,7 +2707,10 @@ int rpc_clnt_add_xprt(struct rpc_clnt *clnt, | |||
2720 | goto out_put_switch; | 2707 | goto out_put_switch; |
2721 | } | 2708 | } |
2722 | xprt->resvport = resvport; | 2709 | xprt->resvport = resvport; |
2723 | xprt->max_reconnect_timeout = reconnect_timeout; | 2710 | if (xprt->ops->set_connect_timeout != NULL) |
2711 | xprt->ops->set_connect_timeout(xprt, | ||
2712 | connect_timeout, | ||
2713 | reconnect_timeout); | ||
2724 | 2714 | ||
2725 | rpc_xprt_switch_set_roundrobin(xps); | 2715 | rpc_xprt_switch_set_roundrobin(xps); |
2726 | if (setup) { | 2716 | if (setup) { |
@@ -2737,26 +2727,39 @@ out_put_switch: | |||
2737 | } | 2727 | } |
2738 | EXPORT_SYMBOL_GPL(rpc_clnt_add_xprt); | 2728 | EXPORT_SYMBOL_GPL(rpc_clnt_add_xprt); |
2739 | 2729 | ||
2730 | struct connect_timeout_data { | ||
2731 | unsigned long connect_timeout; | ||
2732 | unsigned long reconnect_timeout; | ||
2733 | }; | ||
2734 | |||
2740 | static int | 2735 | static int |
2741 | rpc_xprt_cap_max_reconnect_timeout(struct rpc_clnt *clnt, | 2736 | rpc_xprt_set_connect_timeout(struct rpc_clnt *clnt, |
2742 | struct rpc_xprt *xprt, | 2737 | struct rpc_xprt *xprt, |
2743 | void *data) | 2738 | void *data) |
2744 | { | 2739 | { |
2745 | unsigned long timeout = *((unsigned long *)data); | 2740 | struct connect_timeout_data *timeo = data; |
2746 | 2741 | ||
2747 | if (timeout < xprt->max_reconnect_timeout) | 2742 | if (xprt->ops->set_connect_timeout) |
2748 | xprt->max_reconnect_timeout = timeout; | 2743 | xprt->ops->set_connect_timeout(xprt, |
2744 | timeo->connect_timeout, | ||
2745 | timeo->reconnect_timeout); | ||
2749 | return 0; | 2746 | return 0; |
2750 | } | 2747 | } |
2751 | 2748 | ||
2752 | void | 2749 | void |
2753 | rpc_cap_max_reconnect_timeout(struct rpc_clnt *clnt, unsigned long timeo) | 2750 | rpc_set_connect_timeout(struct rpc_clnt *clnt, |
2751 | unsigned long connect_timeout, | ||
2752 | unsigned long reconnect_timeout) | ||
2754 | { | 2753 | { |
2754 | struct connect_timeout_data timeout = { | ||
2755 | .connect_timeout = connect_timeout, | ||
2756 | .reconnect_timeout = reconnect_timeout, | ||
2757 | }; | ||
2755 | rpc_clnt_iterate_for_each_xprt(clnt, | 2758 | rpc_clnt_iterate_for_each_xprt(clnt, |
2756 | rpc_xprt_cap_max_reconnect_timeout, | 2759 | rpc_xprt_set_connect_timeout, |
2757 | &timeo); | 2760 | &timeout); |
2758 | } | 2761 | } |
2759 | EXPORT_SYMBOL_GPL(rpc_cap_max_reconnect_timeout); | 2762 | EXPORT_SYMBOL_GPL(rpc_set_connect_timeout); |
2760 | 2763 | ||
2761 | void rpc_clnt_xprt_switch_put(struct rpc_clnt *clnt) | 2764 | void rpc_clnt_xprt_switch_put(struct rpc_clnt *clnt) |
2762 | { | 2765 | { |
diff --git a/net/sunrpc/debugfs.c b/net/sunrpc/debugfs.c index e7b4d93566df..c8fd0b6c1618 100644 --- a/net/sunrpc/debugfs.c +++ b/net/sunrpc/debugfs.c | |||
@@ -16,11 +16,6 @@ static struct dentry *rpc_xprt_dir; | |||
16 | 16 | ||
17 | unsigned int rpc_inject_disconnect; | 17 | unsigned int rpc_inject_disconnect; |
18 | 18 | ||
19 | struct rpc_clnt_iter { | ||
20 | struct rpc_clnt *clnt; | ||
21 | loff_t pos; | ||
22 | }; | ||
23 | |||
24 | static int | 19 | static int |
25 | tasks_show(struct seq_file *f, void *v) | 20 | tasks_show(struct seq_file *f, void *v) |
26 | { | 21 | { |
@@ -47,12 +42,10 @@ static void * | |||
47 | tasks_start(struct seq_file *f, loff_t *ppos) | 42 | tasks_start(struct seq_file *f, loff_t *ppos) |
48 | __acquires(&clnt->cl_lock) | 43 | __acquires(&clnt->cl_lock) |
49 | { | 44 | { |
50 | struct rpc_clnt_iter *iter = f->private; | 45 | struct rpc_clnt *clnt = f->private; |
51 | loff_t pos = *ppos; | 46 | loff_t pos = *ppos; |
52 | struct rpc_clnt *clnt = iter->clnt; | ||
53 | struct rpc_task *task; | 47 | struct rpc_task *task; |
54 | 48 | ||
55 | iter->pos = pos + 1; | ||
56 | spin_lock(&clnt->cl_lock); | 49 | spin_lock(&clnt->cl_lock); |
57 | list_for_each_entry(task, &clnt->cl_tasks, tk_task) | 50 | list_for_each_entry(task, &clnt->cl_tasks, tk_task) |
58 | if (pos-- == 0) | 51 | if (pos-- == 0) |
@@ -63,12 +56,10 @@ tasks_start(struct seq_file *f, loff_t *ppos) | |||
63 | static void * | 56 | static void * |
64 | tasks_next(struct seq_file *f, void *v, loff_t *pos) | 57 | tasks_next(struct seq_file *f, void *v, loff_t *pos) |
65 | { | 58 | { |
66 | struct rpc_clnt_iter *iter = f->private; | 59 | struct rpc_clnt *clnt = f->private; |
67 | struct rpc_clnt *clnt = iter->clnt; | ||
68 | struct rpc_task *task = v; | 60 | struct rpc_task *task = v; |
69 | struct list_head *next = task->tk_task.next; | 61 | struct list_head *next = task->tk_task.next; |
70 | 62 | ||
71 | ++iter->pos; | ||
72 | ++*pos; | 63 | ++*pos; |
73 | 64 | ||
74 | /* If there's another task on list, return it */ | 65 | /* If there's another task on list, return it */ |
@@ -81,9 +72,7 @@ static void | |||
81 | tasks_stop(struct seq_file *f, void *v) | 72 | tasks_stop(struct seq_file *f, void *v) |
82 | __releases(&clnt->cl_lock) | 73 | __releases(&clnt->cl_lock) |
83 | { | 74 | { |
84 | struct rpc_clnt_iter *iter = f->private; | 75 | struct rpc_clnt *clnt = f->private; |
85 | struct rpc_clnt *clnt = iter->clnt; | ||
86 | |||
87 | spin_unlock(&clnt->cl_lock); | 76 | spin_unlock(&clnt->cl_lock); |
88 | } | 77 | } |
89 | 78 | ||
@@ -96,17 +85,13 @@ static const struct seq_operations tasks_seq_operations = { | |||
96 | 85 | ||
97 | static int tasks_open(struct inode *inode, struct file *filp) | 86 | static int tasks_open(struct inode *inode, struct file *filp) |
98 | { | 87 | { |
99 | int ret = seq_open_private(filp, &tasks_seq_operations, | 88 | int ret = seq_open(filp, &tasks_seq_operations); |
100 | sizeof(struct rpc_clnt_iter)); | ||
101 | |||
102 | if (!ret) { | 89 | if (!ret) { |
103 | struct seq_file *seq = filp->private_data; | 90 | struct seq_file *seq = filp->private_data; |
104 | struct rpc_clnt_iter *iter = seq->private; | 91 | struct rpc_clnt *clnt = seq->private = inode->i_private; |
105 | |||
106 | iter->clnt = inode->i_private; | ||
107 | 92 | ||
108 | if (!atomic_inc_not_zero(&iter->clnt->cl_count)) { | 93 | if (!atomic_inc_not_zero(&clnt->cl_count)) { |
109 | seq_release_private(inode, filp); | 94 | seq_release(inode, filp); |
110 | ret = -EINVAL; | 95 | ret = -EINVAL; |
111 | } | 96 | } |
112 | } | 97 | } |
@@ -118,10 +103,10 @@ static int | |||
118 | tasks_release(struct inode *inode, struct file *filp) | 103 | tasks_release(struct inode *inode, struct file *filp) |
119 | { | 104 | { |
120 | struct seq_file *seq = filp->private_data; | 105 | struct seq_file *seq = filp->private_data; |
121 | struct rpc_clnt_iter *iter = seq->private; | 106 | struct rpc_clnt *clnt = seq->private; |
122 | 107 | ||
123 | rpc_release_client(iter->clnt); | 108 | rpc_release_client(clnt); |
124 | return seq_release_private(inode, filp); | 109 | return seq_release(inode, filp); |
125 | } | 110 | } |
126 | 111 | ||
127 | static const struct file_operations tasks_fops = { | 112 | static const struct file_operations tasks_fops = { |
diff --git a/net/sunrpc/svcauth_unix.c b/net/sunrpc/svcauth_unix.c index 64af4f034de6..f81eaa8e0888 100644 --- a/net/sunrpc/svcauth_unix.c +++ b/net/sunrpc/svcauth_unix.c | |||
@@ -403,7 +403,7 @@ svcauth_unix_info_release(struct svc_xprt *xpt) | |||
403 | /**************************************************************************** | 403 | /**************************************************************************** |
404 | * auth.unix.gid cache | 404 | * auth.unix.gid cache |
405 | * simple cache to map a UID to a list of GIDs | 405 | * simple cache to map a UID to a list of GIDs |
406 | * because AUTH_UNIX aka AUTH_SYS has a max of 16 | 406 | * because AUTH_UNIX aka AUTH_SYS has a max of UNX_NGROUPS |
407 | */ | 407 | */ |
408 | #define GID_HASHBITS 8 | 408 | #define GID_HASHBITS 8 |
409 | #define GID_HASHMAX (1<<GID_HASHBITS) | 409 | #define GID_HASHMAX (1<<GID_HASHBITS) |
@@ -810,7 +810,7 @@ svcauth_unix_accept(struct svc_rqst *rqstp, __be32 *authp) | |||
810 | cred->cr_uid = make_kuid(&init_user_ns, svc_getnl(argv)); /* uid */ | 810 | cred->cr_uid = make_kuid(&init_user_ns, svc_getnl(argv)); /* uid */ |
811 | cred->cr_gid = make_kgid(&init_user_ns, svc_getnl(argv)); /* gid */ | 811 | cred->cr_gid = make_kgid(&init_user_ns, svc_getnl(argv)); /* gid */ |
812 | slen = svc_getnl(argv); /* gids length */ | 812 | slen = svc_getnl(argv); /* gids length */ |
813 | if (slen > 16 || (len -= (slen + 2)*4) < 0) | 813 | if (slen > UNX_NGROUPS || (len -= (slen + 2)*4) < 0) |
814 | goto badcred; | 814 | goto badcred; |
815 | cred->cr_group_info = groups_alloc(slen); | 815 | cred->cr_group_info = groups_alloc(slen); |
816 | if (cred->cr_group_info == NULL) | 816 | if (cred->cr_group_info == NULL) |
diff --git a/net/sunrpc/xdr.c b/net/sunrpc/xdr.c index 7f1071e103ca..1f7082144e01 100644 --- a/net/sunrpc/xdr.c +++ b/net/sunrpc/xdr.c | |||
@@ -1518,3 +1518,37 @@ out: | |||
1518 | } | 1518 | } |
1519 | EXPORT_SYMBOL_GPL(xdr_process_buf); | 1519 | EXPORT_SYMBOL_GPL(xdr_process_buf); |
1520 | 1520 | ||
1521 | /** | ||
1522 | * xdr_stream_decode_string_dup - Decode and duplicate variable length string | ||
1523 | * @xdr: pointer to xdr_stream | ||
1524 | * @str: location to store pointer to string | ||
1525 | * @maxlen: maximum acceptable string length | ||
1526 | * @gfp_flags: GFP mask to use | ||
1527 | * | ||
1528 | * Return values: | ||
1529 | * On success, returns length of NUL-terminated string stored in *@ptr | ||
1530 | * %-EBADMSG on XDR buffer overflow | ||
1531 | * %-EMSGSIZE if the size of the string would exceed @maxlen | ||
1532 | * %-ENOMEM on memory allocation failure | ||
1533 | */ | ||
1534 | ssize_t xdr_stream_decode_string_dup(struct xdr_stream *xdr, char **str, | ||
1535 | size_t maxlen, gfp_t gfp_flags) | ||
1536 | { | ||
1537 | void *p; | ||
1538 | ssize_t ret; | ||
1539 | |||
1540 | ret = xdr_stream_decode_opaque_inline(xdr, &p, maxlen); | ||
1541 | if (ret > 0) { | ||
1542 | char *s = kmalloc(ret + 1, gfp_flags); | ||
1543 | if (s != NULL) { | ||
1544 | memcpy(s, p, ret); | ||
1545 | s[ret] = '\0'; | ||
1546 | *str = s; | ||
1547 | return strlen(s); | ||
1548 | } | ||
1549 | ret = -ENOMEM; | ||
1550 | } | ||
1551 | *str = NULL; | ||
1552 | return ret; | ||
1553 | } | ||
1554 | EXPORT_SYMBOL_GPL(xdr_stream_decode_string_dup); | ||
diff --git a/net/sunrpc/xprt.c b/net/sunrpc/xprt.c index 9a6be030ca7d..b530a2852ba8 100644 --- a/net/sunrpc/xprt.c +++ b/net/sunrpc/xprt.c | |||
@@ -897,13 +897,11 @@ static void xprt_timer(struct rpc_task *task) | |||
897 | return; | 897 | return; |
898 | dprintk("RPC: %5u xprt_timer\n", task->tk_pid); | 898 | dprintk("RPC: %5u xprt_timer\n", task->tk_pid); |
899 | 899 | ||
900 | spin_lock_bh(&xprt->transport_lock); | ||
901 | if (!req->rq_reply_bytes_recvd) { | 900 | if (!req->rq_reply_bytes_recvd) { |
902 | if (xprt->ops->timer) | 901 | if (xprt->ops->timer) |
903 | xprt->ops->timer(xprt, task); | 902 | xprt->ops->timer(xprt, task); |
904 | } else | 903 | } else |
905 | task->tk_status = 0; | 904 | task->tk_status = 0; |
906 | spin_unlock_bh(&xprt->transport_lock); | ||
907 | } | 905 | } |
908 | 906 | ||
909 | /** | 907 | /** |
diff --git a/net/sunrpc/xprtrdma/fmr_ops.c b/net/sunrpc/xprtrdma/fmr_ops.c index 1ebb09e1ac4f..59e64025ed96 100644 --- a/net/sunrpc/xprtrdma/fmr_ops.c +++ b/net/sunrpc/xprtrdma/fmr_ops.c | |||
@@ -310,10 +310,7 @@ fmr_op_unmap_safe(struct rpcrdma_xprt *r_xprt, struct rpcrdma_req *req, | |||
310 | struct rpcrdma_mw *mw; | 310 | struct rpcrdma_mw *mw; |
311 | 311 | ||
312 | while (!list_empty(&req->rl_registered)) { | 312 | while (!list_empty(&req->rl_registered)) { |
313 | mw = list_first_entry(&req->rl_registered, | 313 | mw = rpcrdma_pop_mw(&req->rl_registered); |
314 | struct rpcrdma_mw, mw_list); | ||
315 | list_del_init(&mw->mw_list); | ||
316 | |||
317 | if (sync) | 314 | if (sync) |
318 | fmr_op_recover_mr(mw); | 315 | fmr_op_recover_mr(mw); |
319 | else | 316 | else |
diff --git a/net/sunrpc/xprtrdma/frwr_ops.c b/net/sunrpc/xprtrdma/frwr_ops.c index 47bed5333c7f..f81dd93176c0 100644 --- a/net/sunrpc/xprtrdma/frwr_ops.c +++ b/net/sunrpc/xprtrdma/frwr_ops.c | |||
@@ -466,8 +466,8 @@ frwr_op_unmap_sync(struct rpcrdma_xprt *r_xprt, struct rpcrdma_req *req) | |||
466 | struct ib_send_wr *first, **prev, *last, *bad_wr; | 466 | struct ib_send_wr *first, **prev, *last, *bad_wr; |
467 | struct rpcrdma_rep *rep = req->rl_reply; | 467 | struct rpcrdma_rep *rep = req->rl_reply; |
468 | struct rpcrdma_ia *ia = &r_xprt->rx_ia; | 468 | struct rpcrdma_ia *ia = &r_xprt->rx_ia; |
469 | struct rpcrdma_mw *mw, *tmp; | ||
470 | struct rpcrdma_frmr *f; | 469 | struct rpcrdma_frmr *f; |
470 | struct rpcrdma_mw *mw; | ||
471 | int count, rc; | 471 | int count, rc; |
472 | 472 | ||
473 | dprintk("RPC: %s: req %p\n", __func__, req); | 473 | dprintk("RPC: %s: req %p\n", __func__, req); |
@@ -534,10 +534,10 @@ frwr_op_unmap_sync(struct rpcrdma_xprt *r_xprt, struct rpcrdma_req *req) | |||
534 | * them to the free MW list. | 534 | * them to the free MW list. |
535 | */ | 535 | */ |
536 | unmap: | 536 | unmap: |
537 | list_for_each_entry_safe(mw, tmp, &req->rl_registered, mw_list) { | 537 | while (!list_empty(&req->rl_registered)) { |
538 | mw = rpcrdma_pop_mw(&req->rl_registered); | ||
538 | dprintk("RPC: %s: DMA unmapping frmr %p\n", | 539 | dprintk("RPC: %s: DMA unmapping frmr %p\n", |
539 | __func__, &mw->frmr); | 540 | __func__, &mw->frmr); |
540 | list_del_init(&mw->mw_list); | ||
541 | ib_dma_unmap_sg(ia->ri_device, | 541 | ib_dma_unmap_sg(ia->ri_device, |
542 | mw->mw_sg, mw->mw_nents, mw->mw_dir); | 542 | mw->mw_sg, mw->mw_nents, mw->mw_dir); |
543 | rpcrdma_put_mw(r_xprt, mw); | 543 | rpcrdma_put_mw(r_xprt, mw); |
@@ -571,10 +571,7 @@ frwr_op_unmap_safe(struct rpcrdma_xprt *r_xprt, struct rpcrdma_req *req, | |||
571 | struct rpcrdma_mw *mw; | 571 | struct rpcrdma_mw *mw; |
572 | 572 | ||
573 | while (!list_empty(&req->rl_registered)) { | 573 | while (!list_empty(&req->rl_registered)) { |
574 | mw = list_first_entry(&req->rl_registered, | 574 | mw = rpcrdma_pop_mw(&req->rl_registered); |
575 | struct rpcrdma_mw, mw_list); | ||
576 | list_del_init(&mw->mw_list); | ||
577 | |||
578 | if (sync) | 575 | if (sync) |
579 | frwr_op_recover_mr(mw); | 576 | frwr_op_recover_mr(mw); |
580 | else | 577 | else |
diff --git a/net/sunrpc/xprtrdma/rpc_rdma.c b/net/sunrpc/xprtrdma/rpc_rdma.c index c52e0f2ffe52..a044be2d6ad7 100644 --- a/net/sunrpc/xprtrdma/rpc_rdma.c +++ b/net/sunrpc/xprtrdma/rpc_rdma.c | |||
@@ -125,14 +125,34 @@ void rpcrdma_set_max_header_sizes(struct rpcrdma_xprt *r_xprt) | |||
125 | /* The client can send a request inline as long as the RPCRDMA header | 125 | /* The client can send a request inline as long as the RPCRDMA header |
126 | * plus the RPC call fit under the transport's inline limit. If the | 126 | * plus the RPC call fit under the transport's inline limit. If the |
127 | * combined call message size exceeds that limit, the client must use | 127 | * combined call message size exceeds that limit, the client must use |
128 | * the read chunk list for this operation. | 128 | * a Read chunk for this operation. |
129 | * | ||
130 | * A Read chunk is also required if sending the RPC call inline would | ||
131 | * exceed this device's max_sge limit. | ||
129 | */ | 132 | */ |
130 | static bool rpcrdma_args_inline(struct rpcrdma_xprt *r_xprt, | 133 | static bool rpcrdma_args_inline(struct rpcrdma_xprt *r_xprt, |
131 | struct rpc_rqst *rqst) | 134 | struct rpc_rqst *rqst) |
132 | { | 135 | { |
133 | struct rpcrdma_ia *ia = &r_xprt->rx_ia; | 136 | struct xdr_buf *xdr = &rqst->rq_snd_buf; |
137 | unsigned int count, remaining, offset; | ||
138 | |||
139 | if (xdr->len > r_xprt->rx_ia.ri_max_inline_write) | ||
140 | return false; | ||
141 | |||
142 | if (xdr->page_len) { | ||
143 | remaining = xdr->page_len; | ||
144 | offset = xdr->page_base & ~PAGE_MASK; | ||
145 | count = 0; | ||
146 | while (remaining) { | ||
147 | remaining -= min_t(unsigned int, | ||
148 | PAGE_SIZE - offset, remaining); | ||
149 | offset = 0; | ||
150 | if (++count > r_xprt->rx_ia.ri_max_send_sges) | ||
151 | return false; | ||
152 | } | ||
153 | } | ||
134 | 154 | ||
135 | return rqst->rq_snd_buf.len <= ia->ri_max_inline_write; | 155 | return true; |
136 | } | 156 | } |
137 | 157 | ||
138 | /* The client can't know how large the actual reply will be. Thus it | 158 | /* The client can't know how large the actual reply will be. Thus it |
@@ -186,9 +206,9 @@ rpcrdma_convert_kvec(struct kvec *vec, struct rpcrdma_mr_seg *seg, int n) | |||
186 | */ | 206 | */ |
187 | 207 | ||
188 | static int | 208 | static int |
189 | rpcrdma_convert_iovs(struct xdr_buf *xdrbuf, unsigned int pos, | 209 | rpcrdma_convert_iovs(struct rpcrdma_xprt *r_xprt, struct xdr_buf *xdrbuf, |
190 | enum rpcrdma_chunktype type, struct rpcrdma_mr_seg *seg, | 210 | unsigned int pos, enum rpcrdma_chunktype type, |
191 | bool reminv_expected) | 211 | struct rpcrdma_mr_seg *seg) |
192 | { | 212 | { |
193 | int len, n, p, page_base; | 213 | int len, n, p, page_base; |
194 | struct page **ppages; | 214 | struct page **ppages; |
@@ -226,22 +246,21 @@ rpcrdma_convert_iovs(struct xdr_buf *xdrbuf, unsigned int pos, | |||
226 | if (len && n == RPCRDMA_MAX_SEGS) | 246 | if (len && n == RPCRDMA_MAX_SEGS) |
227 | goto out_overflow; | 247 | goto out_overflow; |
228 | 248 | ||
229 | /* When encoding the read list, the tail is always sent inline */ | 249 | /* When encoding a Read chunk, the tail iovec contains an |
230 | if (type == rpcrdma_readch) | 250 | * XDR pad and may be omitted. |
251 | */ | ||
252 | if (type == rpcrdma_readch && r_xprt->rx_ia.ri_implicit_roundup) | ||
231 | return n; | 253 | return n; |
232 | 254 | ||
233 | /* When encoding the Write list, some servers need to see an extra | 255 | /* When encoding a Write chunk, some servers need to see an |
234 | * segment for odd-length Write chunks. The upper layer provides | 256 | * extra segment for non-XDR-aligned Write chunks. The upper |
235 | * space in the tail iovec for this purpose. | 257 | * layer provides space in the tail iovec that may be used |
258 | * for this purpose. | ||
236 | */ | 259 | */ |
237 | if (type == rpcrdma_writech && reminv_expected) | 260 | if (type == rpcrdma_writech && r_xprt->rx_ia.ri_implicit_roundup) |
238 | return n; | 261 | return n; |
239 | 262 | ||
240 | if (xdrbuf->tail[0].iov_len) { | 263 | if (xdrbuf->tail[0].iov_len) { |
241 | /* the rpcrdma protocol allows us to omit any trailing | ||
242 | * xdr pad bytes, saving the server an RDMA operation. */ | ||
243 | if (xdrbuf->tail[0].iov_len < 4 && xprt_rdma_pad_optimize) | ||
244 | return n; | ||
245 | n = rpcrdma_convert_kvec(&xdrbuf->tail[0], seg, n); | 264 | n = rpcrdma_convert_kvec(&xdrbuf->tail[0], seg, n); |
246 | if (n == RPCRDMA_MAX_SEGS) | 265 | if (n == RPCRDMA_MAX_SEGS) |
247 | goto out_overflow; | 266 | goto out_overflow; |
@@ -293,7 +312,8 @@ rpcrdma_encode_read_list(struct rpcrdma_xprt *r_xprt, | |||
293 | if (rtype == rpcrdma_areadch) | 312 | if (rtype == rpcrdma_areadch) |
294 | pos = 0; | 313 | pos = 0; |
295 | seg = req->rl_segments; | 314 | seg = req->rl_segments; |
296 | nsegs = rpcrdma_convert_iovs(&rqst->rq_snd_buf, pos, rtype, seg, false); | 315 | nsegs = rpcrdma_convert_iovs(r_xprt, &rqst->rq_snd_buf, pos, |
316 | rtype, seg); | ||
297 | if (nsegs < 0) | 317 | if (nsegs < 0) |
298 | return ERR_PTR(nsegs); | 318 | return ERR_PTR(nsegs); |
299 | 319 | ||
@@ -302,7 +322,7 @@ rpcrdma_encode_read_list(struct rpcrdma_xprt *r_xprt, | |||
302 | false, &mw); | 322 | false, &mw); |
303 | if (n < 0) | 323 | if (n < 0) |
304 | return ERR_PTR(n); | 324 | return ERR_PTR(n); |
305 | list_add(&mw->mw_list, &req->rl_registered); | 325 | rpcrdma_push_mw(mw, &req->rl_registered); |
306 | 326 | ||
307 | *iptr++ = xdr_one; /* item present */ | 327 | *iptr++ = xdr_one; /* item present */ |
308 | 328 | ||
@@ -355,10 +375,9 @@ rpcrdma_encode_write_list(struct rpcrdma_xprt *r_xprt, struct rpcrdma_req *req, | |||
355 | } | 375 | } |
356 | 376 | ||
357 | seg = req->rl_segments; | 377 | seg = req->rl_segments; |
358 | nsegs = rpcrdma_convert_iovs(&rqst->rq_rcv_buf, | 378 | nsegs = rpcrdma_convert_iovs(r_xprt, &rqst->rq_rcv_buf, |
359 | rqst->rq_rcv_buf.head[0].iov_len, | 379 | rqst->rq_rcv_buf.head[0].iov_len, |
360 | wtype, seg, | 380 | wtype, seg); |
361 | r_xprt->rx_ia.ri_reminv_expected); | ||
362 | if (nsegs < 0) | 381 | if (nsegs < 0) |
363 | return ERR_PTR(nsegs); | 382 | return ERR_PTR(nsegs); |
364 | 383 | ||
@@ -371,7 +390,7 @@ rpcrdma_encode_write_list(struct rpcrdma_xprt *r_xprt, struct rpcrdma_req *req, | |||
371 | true, &mw); | 390 | true, &mw); |
372 | if (n < 0) | 391 | if (n < 0) |
373 | return ERR_PTR(n); | 392 | return ERR_PTR(n); |
374 | list_add(&mw->mw_list, &req->rl_registered); | 393 | rpcrdma_push_mw(mw, &req->rl_registered); |
375 | 394 | ||
376 | iptr = xdr_encode_rdma_segment(iptr, mw); | 395 | iptr = xdr_encode_rdma_segment(iptr, mw); |
377 | 396 | ||
@@ -423,8 +442,7 @@ rpcrdma_encode_reply_chunk(struct rpcrdma_xprt *r_xprt, | |||
423 | } | 442 | } |
424 | 443 | ||
425 | seg = req->rl_segments; | 444 | seg = req->rl_segments; |
426 | nsegs = rpcrdma_convert_iovs(&rqst->rq_rcv_buf, 0, wtype, seg, | 445 | nsegs = rpcrdma_convert_iovs(r_xprt, &rqst->rq_rcv_buf, 0, wtype, seg); |
427 | r_xprt->rx_ia.ri_reminv_expected); | ||
428 | if (nsegs < 0) | 446 | if (nsegs < 0) |
429 | return ERR_PTR(nsegs); | 447 | return ERR_PTR(nsegs); |
430 | 448 | ||
@@ -437,7 +455,7 @@ rpcrdma_encode_reply_chunk(struct rpcrdma_xprt *r_xprt, | |||
437 | true, &mw); | 455 | true, &mw); |
438 | if (n < 0) | 456 | if (n < 0) |
439 | return ERR_PTR(n); | 457 | return ERR_PTR(n); |
440 | list_add(&mw->mw_list, &req->rl_registered); | 458 | rpcrdma_push_mw(mw, &req->rl_registered); |
441 | 459 | ||
442 | iptr = xdr_encode_rdma_segment(iptr, mw); | 460 | iptr = xdr_encode_rdma_segment(iptr, mw); |
443 | 461 | ||
@@ -741,13 +759,13 @@ rpcrdma_marshal_req(struct rpc_rqst *rqst) | |||
741 | iptr = headerp->rm_body.rm_chunks; | 759 | iptr = headerp->rm_body.rm_chunks; |
742 | iptr = rpcrdma_encode_read_list(r_xprt, req, rqst, iptr, rtype); | 760 | iptr = rpcrdma_encode_read_list(r_xprt, req, rqst, iptr, rtype); |
743 | if (IS_ERR(iptr)) | 761 | if (IS_ERR(iptr)) |
744 | goto out_unmap; | 762 | goto out_err; |
745 | iptr = rpcrdma_encode_write_list(r_xprt, req, rqst, iptr, wtype); | 763 | iptr = rpcrdma_encode_write_list(r_xprt, req, rqst, iptr, wtype); |
746 | if (IS_ERR(iptr)) | 764 | if (IS_ERR(iptr)) |
747 | goto out_unmap; | 765 | goto out_err; |
748 | iptr = rpcrdma_encode_reply_chunk(r_xprt, req, rqst, iptr, wtype); | 766 | iptr = rpcrdma_encode_reply_chunk(r_xprt, req, rqst, iptr, wtype); |
749 | if (IS_ERR(iptr)) | 767 | if (IS_ERR(iptr)) |
750 | goto out_unmap; | 768 | goto out_err; |
751 | hdrlen = (unsigned char *)iptr - (unsigned char *)headerp; | 769 | hdrlen = (unsigned char *)iptr - (unsigned char *)headerp; |
752 | 770 | ||
753 | dprintk("RPC: %5u %s: %s/%s: hdrlen %zd rpclen %zd\n", | 771 | dprintk("RPC: %5u %s: %s/%s: hdrlen %zd rpclen %zd\n", |
@@ -758,12 +776,14 @@ rpcrdma_marshal_req(struct rpc_rqst *rqst) | |||
758 | if (!rpcrdma_prepare_send_sges(&r_xprt->rx_ia, req, hdrlen, | 776 | if (!rpcrdma_prepare_send_sges(&r_xprt->rx_ia, req, hdrlen, |
759 | &rqst->rq_snd_buf, rtype)) { | 777 | &rqst->rq_snd_buf, rtype)) { |
760 | iptr = ERR_PTR(-EIO); | 778 | iptr = ERR_PTR(-EIO); |
761 | goto out_unmap; | 779 | goto out_err; |
762 | } | 780 | } |
763 | return 0; | 781 | return 0; |
764 | 782 | ||
765 | out_unmap: | 783 | out_err: |
766 | r_xprt->rx_ia.ri_ops->ro_unmap_safe(r_xprt, req, false); | 784 | pr_err("rpcrdma: rpcrdma_marshal_req failed, status %ld\n", |
785 | PTR_ERR(iptr)); | ||
786 | r_xprt->rx_stats.failed_marshal_count++; | ||
767 | return PTR_ERR(iptr); | 787 | return PTR_ERR(iptr); |
768 | } | 788 | } |
769 | 789 | ||
diff --git a/net/sunrpc/xprtrdma/transport.c b/net/sunrpc/xprtrdma/transport.c index 534c178d2a7e..c717f5410776 100644 --- a/net/sunrpc/xprtrdma/transport.c +++ b/net/sunrpc/xprtrdma/transport.c | |||
@@ -67,7 +67,7 @@ unsigned int xprt_rdma_max_inline_read = RPCRDMA_DEF_INLINE; | |||
67 | static unsigned int xprt_rdma_max_inline_write = RPCRDMA_DEF_INLINE; | 67 | static unsigned int xprt_rdma_max_inline_write = RPCRDMA_DEF_INLINE; |
68 | static unsigned int xprt_rdma_inline_write_padding; | 68 | static unsigned int xprt_rdma_inline_write_padding; |
69 | static unsigned int xprt_rdma_memreg_strategy = RPCRDMA_FRMR; | 69 | static unsigned int xprt_rdma_memreg_strategy = RPCRDMA_FRMR; |
70 | int xprt_rdma_pad_optimize = 1; | 70 | int xprt_rdma_pad_optimize = 0; |
71 | 71 | ||
72 | #if IS_ENABLED(CONFIG_SUNRPC_DEBUG) | 72 | #if IS_ENABLED(CONFIG_SUNRPC_DEBUG) |
73 | 73 | ||
@@ -709,10 +709,6 @@ xprt_rdma_send_request(struct rpc_task *task) | |||
709 | return 0; | 709 | return 0; |
710 | 710 | ||
711 | failed_marshal: | 711 | failed_marshal: |
712 | dprintk("RPC: %s: rpcrdma_marshal_req failed, status %i\n", | ||
713 | __func__, rc); | ||
714 | if (rc == -EIO) | ||
715 | r_xprt->rx_stats.failed_marshal_count++; | ||
716 | if (rc != -ENOTCONN) | 712 | if (rc != -ENOTCONN) |
717 | return rc; | 713 | return rc; |
718 | drop_connection: | 714 | drop_connection: |
diff --git a/net/sunrpc/xprtrdma/verbs.c b/net/sunrpc/xprtrdma/verbs.c index 11d07748f699..81cd31acf690 100644 --- a/net/sunrpc/xprtrdma/verbs.c +++ b/net/sunrpc/xprtrdma/verbs.c | |||
@@ -54,6 +54,7 @@ | |||
54 | #include <linux/sunrpc/svc_rdma.h> | 54 | #include <linux/sunrpc/svc_rdma.h> |
55 | #include <asm/bitops.h> | 55 | #include <asm/bitops.h> |
56 | #include <linux/module.h> /* try_module_get()/module_put() */ | 56 | #include <linux/module.h> /* try_module_get()/module_put() */ |
57 | #include <rdma/ib_cm.h> | ||
57 | 58 | ||
58 | #include "xprt_rdma.h" | 59 | #include "xprt_rdma.h" |
59 | 60 | ||
@@ -208,6 +209,7 @@ rpcrdma_update_connect_private(struct rpcrdma_xprt *r_xprt, | |||
208 | 209 | ||
209 | /* Default settings for RPC-over-RDMA Version One */ | 210 | /* Default settings for RPC-over-RDMA Version One */ |
210 | r_xprt->rx_ia.ri_reminv_expected = false; | 211 | r_xprt->rx_ia.ri_reminv_expected = false; |
212 | r_xprt->rx_ia.ri_implicit_roundup = xprt_rdma_pad_optimize; | ||
211 | rsize = RPCRDMA_V1_DEF_INLINE_SIZE; | 213 | rsize = RPCRDMA_V1_DEF_INLINE_SIZE; |
212 | wsize = RPCRDMA_V1_DEF_INLINE_SIZE; | 214 | wsize = RPCRDMA_V1_DEF_INLINE_SIZE; |
213 | 215 | ||
@@ -215,6 +217,7 @@ rpcrdma_update_connect_private(struct rpcrdma_xprt *r_xprt, | |||
215 | pmsg->cp_magic == rpcrdma_cmp_magic && | 217 | pmsg->cp_magic == rpcrdma_cmp_magic && |
216 | pmsg->cp_version == RPCRDMA_CMP_VERSION) { | 218 | pmsg->cp_version == RPCRDMA_CMP_VERSION) { |
217 | r_xprt->rx_ia.ri_reminv_expected = true; | 219 | r_xprt->rx_ia.ri_reminv_expected = true; |
220 | r_xprt->rx_ia.ri_implicit_roundup = true; | ||
218 | rsize = rpcrdma_decode_buffer_size(pmsg->cp_send_size); | 221 | rsize = rpcrdma_decode_buffer_size(pmsg->cp_send_size); |
219 | wsize = rpcrdma_decode_buffer_size(pmsg->cp_recv_size); | 222 | wsize = rpcrdma_decode_buffer_size(pmsg->cp_recv_size); |
220 | } | 223 | } |
@@ -277,7 +280,14 @@ rpcrdma_conn_upcall(struct rdma_cm_id *id, struct rdma_cm_event *event) | |||
277 | connstate = -ENETDOWN; | 280 | connstate = -ENETDOWN; |
278 | goto connected; | 281 | goto connected; |
279 | case RDMA_CM_EVENT_REJECTED: | 282 | case RDMA_CM_EVENT_REJECTED: |
283 | #if IS_ENABLED(CONFIG_SUNRPC_DEBUG) | ||
284 | pr_info("rpcrdma: connection to %pIS:%u on %s rejected: %s\n", | ||
285 | sap, rpc_get_port(sap), ia->ri_device->name, | ||
286 | rdma_reject_msg(id, event->status)); | ||
287 | #endif | ||
280 | connstate = -ECONNREFUSED; | 288 | connstate = -ECONNREFUSED; |
289 | if (event->status == IB_CM_REJ_STALE_CONN) | ||
290 | connstate = -EAGAIN; | ||
281 | goto connected; | 291 | goto connected; |
282 | case RDMA_CM_EVENT_DISCONNECTED: | 292 | case RDMA_CM_EVENT_DISCONNECTED: |
283 | connstate = -ECONNABORTED; | 293 | connstate = -ECONNABORTED; |
@@ -486,18 +496,19 @@ rpcrdma_ia_close(struct rpcrdma_ia *ia) | |||
486 | */ | 496 | */ |
487 | int | 497 | int |
488 | rpcrdma_ep_create(struct rpcrdma_ep *ep, struct rpcrdma_ia *ia, | 498 | rpcrdma_ep_create(struct rpcrdma_ep *ep, struct rpcrdma_ia *ia, |
489 | struct rpcrdma_create_data_internal *cdata) | 499 | struct rpcrdma_create_data_internal *cdata) |
490 | { | 500 | { |
491 | struct rpcrdma_connect_private *pmsg = &ep->rep_cm_private; | 501 | struct rpcrdma_connect_private *pmsg = &ep->rep_cm_private; |
502 | unsigned int max_qp_wr, max_sge; | ||
492 | struct ib_cq *sendcq, *recvcq; | 503 | struct ib_cq *sendcq, *recvcq; |
493 | unsigned int max_qp_wr; | ||
494 | int rc; | 504 | int rc; |
495 | 505 | ||
496 | if (ia->ri_device->attrs.max_sge < RPCRDMA_MAX_SEND_SGES) { | 506 | max_sge = min(ia->ri_device->attrs.max_sge, RPCRDMA_MAX_SEND_SGES); |
497 | dprintk("RPC: %s: insufficient sge's available\n", | 507 | if (max_sge < RPCRDMA_MIN_SEND_SGES) { |
498 | __func__); | 508 | pr_warn("rpcrdma: HCA provides only %d send SGEs\n", max_sge); |
499 | return -ENOMEM; | 509 | return -ENOMEM; |
500 | } | 510 | } |
511 | ia->ri_max_send_sges = max_sge - RPCRDMA_MIN_SEND_SGES; | ||
501 | 512 | ||
502 | if (ia->ri_device->attrs.max_qp_wr <= RPCRDMA_BACKWARD_WRS) { | 513 | if (ia->ri_device->attrs.max_qp_wr <= RPCRDMA_BACKWARD_WRS) { |
503 | dprintk("RPC: %s: insufficient wqe's available\n", | 514 | dprintk("RPC: %s: insufficient wqe's available\n", |
@@ -522,7 +533,7 @@ rpcrdma_ep_create(struct rpcrdma_ep *ep, struct rpcrdma_ia *ia, | |||
522 | ep->rep_attr.cap.max_recv_wr = cdata->max_requests; | 533 | ep->rep_attr.cap.max_recv_wr = cdata->max_requests; |
523 | ep->rep_attr.cap.max_recv_wr += RPCRDMA_BACKWARD_WRS; | 534 | ep->rep_attr.cap.max_recv_wr += RPCRDMA_BACKWARD_WRS; |
524 | ep->rep_attr.cap.max_recv_wr += 1; /* drain cqe */ | 535 | ep->rep_attr.cap.max_recv_wr += 1; /* drain cqe */ |
525 | ep->rep_attr.cap.max_send_sge = RPCRDMA_MAX_SEND_SGES; | 536 | ep->rep_attr.cap.max_send_sge = max_sge; |
526 | ep->rep_attr.cap.max_recv_sge = 1; | 537 | ep->rep_attr.cap.max_recv_sge = 1; |
527 | ep->rep_attr.cap.max_inline_data = 0; | 538 | ep->rep_attr.cap.max_inline_data = 0; |
528 | ep->rep_attr.sq_sig_type = IB_SIGNAL_REQ_WR; | 539 | ep->rep_attr.sq_sig_type = IB_SIGNAL_REQ_WR; |
@@ -640,20 +651,21 @@ rpcrdma_ep_destroy(struct rpcrdma_ep *ep, struct rpcrdma_ia *ia) | |||
640 | int | 651 | int |
641 | rpcrdma_ep_connect(struct rpcrdma_ep *ep, struct rpcrdma_ia *ia) | 652 | rpcrdma_ep_connect(struct rpcrdma_ep *ep, struct rpcrdma_ia *ia) |
642 | { | 653 | { |
654 | struct rpcrdma_xprt *r_xprt = container_of(ia, struct rpcrdma_xprt, | ||
655 | rx_ia); | ||
643 | struct rdma_cm_id *id, *old; | 656 | struct rdma_cm_id *id, *old; |
657 | struct sockaddr *sap; | ||
658 | unsigned int extras; | ||
644 | int rc = 0; | 659 | int rc = 0; |
645 | int retry_count = 0; | ||
646 | 660 | ||
647 | if (ep->rep_connected != 0) { | 661 | if (ep->rep_connected != 0) { |
648 | struct rpcrdma_xprt *xprt; | ||
649 | retry: | 662 | retry: |
650 | dprintk("RPC: %s: reconnecting...\n", __func__); | 663 | dprintk("RPC: %s: reconnecting...\n", __func__); |
651 | 664 | ||
652 | rpcrdma_ep_disconnect(ep, ia); | 665 | rpcrdma_ep_disconnect(ep, ia); |
653 | 666 | ||
654 | xprt = container_of(ia, struct rpcrdma_xprt, rx_ia); | 667 | sap = (struct sockaddr *)&r_xprt->rx_data.addr; |
655 | id = rpcrdma_create_id(xprt, ia, | 668 | id = rpcrdma_create_id(r_xprt, ia, sap); |
656 | (struct sockaddr *)&xprt->rx_data.addr); | ||
657 | if (IS_ERR(id)) { | 669 | if (IS_ERR(id)) { |
658 | rc = -EHOSTUNREACH; | 670 | rc = -EHOSTUNREACH; |
659 | goto out; | 671 | goto out; |
@@ -708,51 +720,18 @@ retry: | |||
708 | } | 720 | } |
709 | 721 | ||
710 | wait_event_interruptible(ep->rep_connect_wait, ep->rep_connected != 0); | 722 | wait_event_interruptible(ep->rep_connect_wait, ep->rep_connected != 0); |
711 | |||
712 | /* | ||
713 | * Check state. A non-peer reject indicates no listener | ||
714 | * (ECONNREFUSED), which may be a transient state. All | ||
715 | * others indicate a transport condition which has already | ||
716 | * undergone a best-effort. | ||
717 | */ | ||
718 | if (ep->rep_connected == -ECONNREFUSED && | ||
719 | ++retry_count <= RDMA_CONNECT_RETRY_MAX) { | ||
720 | dprintk("RPC: %s: non-peer_reject, retry\n", __func__); | ||
721 | goto retry; | ||
722 | } | ||
723 | if (ep->rep_connected <= 0) { | 723 | if (ep->rep_connected <= 0) { |
724 | /* Sometimes, the only way to reliably connect to remote | 724 | if (ep->rep_connected == -EAGAIN) |
725 | * CMs is to use same nonzero values for ORD and IRD. */ | ||
726 | if (retry_count++ <= RDMA_CONNECT_RETRY_MAX + 1 && | ||
727 | (ep->rep_remote_cma.responder_resources == 0 || | ||
728 | ep->rep_remote_cma.initiator_depth != | ||
729 | ep->rep_remote_cma.responder_resources)) { | ||
730 | if (ep->rep_remote_cma.responder_resources == 0) | ||
731 | ep->rep_remote_cma.responder_resources = 1; | ||
732 | ep->rep_remote_cma.initiator_depth = | ||
733 | ep->rep_remote_cma.responder_resources; | ||
734 | goto retry; | 725 | goto retry; |
735 | } | ||
736 | rc = ep->rep_connected; | 726 | rc = ep->rep_connected; |
737 | } else { | 727 | goto out; |
738 | struct rpcrdma_xprt *r_xprt; | ||
739 | unsigned int extras; | ||
740 | |||
741 | dprintk("RPC: %s: connected\n", __func__); | ||
742 | |||
743 | r_xprt = container_of(ia, struct rpcrdma_xprt, rx_ia); | ||
744 | extras = r_xprt->rx_buf.rb_bc_srv_max_requests; | ||
745 | |||
746 | if (extras) { | ||
747 | rc = rpcrdma_ep_post_extra_recv(r_xprt, extras); | ||
748 | if (rc) { | ||
749 | pr_warn("%s: rpcrdma_ep_post_extra_recv: %i\n", | ||
750 | __func__, rc); | ||
751 | rc = 0; | ||
752 | } | ||
753 | } | ||
754 | } | 728 | } |
755 | 729 | ||
730 | dprintk("RPC: %s: connected\n", __func__); | ||
731 | extras = r_xprt->rx_buf.rb_bc_srv_max_requests; | ||
732 | if (extras) | ||
733 | rpcrdma_ep_post_extra_recv(r_xprt, extras); | ||
734 | |||
756 | out: | 735 | out: |
757 | if (rc) | 736 | if (rc) |
758 | ep->rep_connected = rc; | 737 | ep->rep_connected = rc; |
@@ -797,9 +776,7 @@ rpcrdma_mr_recovery_worker(struct work_struct *work) | |||
797 | 776 | ||
798 | spin_lock(&buf->rb_recovery_lock); | 777 | spin_lock(&buf->rb_recovery_lock); |
799 | while (!list_empty(&buf->rb_stale_mrs)) { | 778 | while (!list_empty(&buf->rb_stale_mrs)) { |
800 | mw = list_first_entry(&buf->rb_stale_mrs, | 779 | mw = rpcrdma_pop_mw(&buf->rb_stale_mrs); |
801 | struct rpcrdma_mw, mw_list); | ||
802 | list_del_init(&mw->mw_list); | ||
803 | spin_unlock(&buf->rb_recovery_lock); | 780 | spin_unlock(&buf->rb_recovery_lock); |
804 | 781 | ||
805 | dprintk("RPC: %s: recovering MR %p\n", __func__, mw); | 782 | dprintk("RPC: %s: recovering MR %p\n", __func__, mw); |
@@ -817,7 +794,7 @@ rpcrdma_defer_mr_recovery(struct rpcrdma_mw *mw) | |||
817 | struct rpcrdma_buffer *buf = &r_xprt->rx_buf; | 794 | struct rpcrdma_buffer *buf = &r_xprt->rx_buf; |
818 | 795 | ||
819 | spin_lock(&buf->rb_recovery_lock); | 796 | spin_lock(&buf->rb_recovery_lock); |
820 | list_add(&mw->mw_list, &buf->rb_stale_mrs); | 797 | rpcrdma_push_mw(mw, &buf->rb_stale_mrs); |
821 | spin_unlock(&buf->rb_recovery_lock); | 798 | spin_unlock(&buf->rb_recovery_lock); |
822 | 799 | ||
823 | schedule_delayed_work(&buf->rb_recovery_worker, 0); | 800 | schedule_delayed_work(&buf->rb_recovery_worker, 0); |
@@ -1093,11 +1070,8 @@ rpcrdma_get_mw(struct rpcrdma_xprt *r_xprt) | |||
1093 | struct rpcrdma_mw *mw = NULL; | 1070 | struct rpcrdma_mw *mw = NULL; |
1094 | 1071 | ||
1095 | spin_lock(&buf->rb_mwlock); | 1072 | spin_lock(&buf->rb_mwlock); |
1096 | if (!list_empty(&buf->rb_mws)) { | 1073 | if (!list_empty(&buf->rb_mws)) |
1097 | mw = list_first_entry(&buf->rb_mws, | 1074 | mw = rpcrdma_pop_mw(&buf->rb_mws); |
1098 | struct rpcrdma_mw, mw_list); | ||
1099 | list_del_init(&mw->mw_list); | ||
1100 | } | ||
1101 | spin_unlock(&buf->rb_mwlock); | 1075 | spin_unlock(&buf->rb_mwlock); |
1102 | 1076 | ||
1103 | if (!mw) | 1077 | if (!mw) |
@@ -1120,7 +1094,7 @@ rpcrdma_put_mw(struct rpcrdma_xprt *r_xprt, struct rpcrdma_mw *mw) | |||
1120 | struct rpcrdma_buffer *buf = &r_xprt->rx_buf; | 1094 | struct rpcrdma_buffer *buf = &r_xprt->rx_buf; |
1121 | 1095 | ||
1122 | spin_lock(&buf->rb_mwlock); | 1096 | spin_lock(&buf->rb_mwlock); |
1123 | list_add_tail(&mw->mw_list, &buf->rb_mws); | 1097 | rpcrdma_push_mw(mw, &buf->rb_mws); |
1124 | spin_unlock(&buf->rb_mwlock); | 1098 | spin_unlock(&buf->rb_mwlock); |
1125 | } | 1099 | } |
1126 | 1100 | ||
diff --git a/net/sunrpc/xprtrdma/xprt_rdma.h b/net/sunrpc/xprtrdma/xprt_rdma.h index e35efd4ac1e4..171a35116de9 100644 --- a/net/sunrpc/xprtrdma/xprt_rdma.h +++ b/net/sunrpc/xprtrdma/xprt_rdma.h | |||
@@ -74,7 +74,9 @@ struct rpcrdma_ia { | |||
74 | unsigned int ri_max_frmr_depth; | 74 | unsigned int ri_max_frmr_depth; |
75 | unsigned int ri_max_inline_write; | 75 | unsigned int ri_max_inline_write; |
76 | unsigned int ri_max_inline_read; | 76 | unsigned int ri_max_inline_read; |
77 | unsigned int ri_max_send_sges; | ||
77 | bool ri_reminv_expected; | 78 | bool ri_reminv_expected; |
79 | bool ri_implicit_roundup; | ||
78 | enum ib_mr_type ri_mrtype; | 80 | enum ib_mr_type ri_mrtype; |
79 | struct ib_qp_attr ri_qp_attr; | 81 | struct ib_qp_attr ri_qp_attr; |
80 | struct ib_qp_init_attr ri_qp_init_attr; | 82 | struct ib_qp_init_attr ri_qp_init_attr; |
@@ -303,15 +305,19 @@ struct rpcrdma_mr_seg { /* chunk descriptors */ | |||
303 | char *mr_offset; /* kva if no page, else offset */ | 305 | char *mr_offset; /* kva if no page, else offset */ |
304 | }; | 306 | }; |
305 | 307 | ||
306 | /* Reserve enough Send SGEs to send a maximum size inline request: | 308 | /* The Send SGE array is provisioned to send a maximum size |
309 | * inline request: | ||
307 | * - RPC-over-RDMA header | 310 | * - RPC-over-RDMA header |
308 | * - xdr_buf head iovec | 311 | * - xdr_buf head iovec |
309 | * - RPCRDMA_MAX_INLINE bytes, possibly unaligned, in pages | 312 | * - RPCRDMA_MAX_INLINE bytes, in pages |
310 | * - xdr_buf tail iovec | 313 | * - xdr_buf tail iovec |
314 | * | ||
315 | * The actual number of array elements consumed by each RPC | ||
316 | * depends on the device's max_sge limit. | ||
311 | */ | 317 | */ |
312 | enum { | 318 | enum { |
313 | RPCRDMA_MAX_SEND_PAGES = PAGE_SIZE + RPCRDMA_MAX_INLINE - 1, | 319 | RPCRDMA_MIN_SEND_SGES = 3, |
314 | RPCRDMA_MAX_PAGE_SGES = (RPCRDMA_MAX_SEND_PAGES >> PAGE_SHIFT) + 1, | 320 | RPCRDMA_MAX_PAGE_SGES = RPCRDMA_MAX_INLINE >> PAGE_SHIFT, |
315 | RPCRDMA_MAX_SEND_SGES = 1 + 1 + RPCRDMA_MAX_PAGE_SGES + 1, | 321 | RPCRDMA_MAX_SEND_SGES = 1 + 1 + RPCRDMA_MAX_PAGE_SGES + 1, |
316 | }; | 322 | }; |
317 | 323 | ||
@@ -348,6 +354,22 @@ rpcr_to_rdmar(struct rpc_rqst *rqst) | |||
348 | return rqst->rq_xprtdata; | 354 | return rqst->rq_xprtdata; |
349 | } | 355 | } |
350 | 356 | ||
357 | static inline void | ||
358 | rpcrdma_push_mw(struct rpcrdma_mw *mw, struct list_head *list) | ||
359 | { | ||
360 | list_add_tail(&mw->mw_list, list); | ||
361 | } | ||
362 | |||
363 | static inline struct rpcrdma_mw * | ||
364 | rpcrdma_pop_mw(struct list_head *list) | ||
365 | { | ||
366 | struct rpcrdma_mw *mw; | ||
367 | |||
368 | mw = list_first_entry(list, struct rpcrdma_mw, mw_list); | ||
369 | list_del(&mw->mw_list); | ||
370 | return mw; | ||
371 | } | ||
372 | |||
351 | /* | 373 | /* |
352 | * struct rpcrdma_buffer -- holds list/queue of pre-registered memory for | 374 | * struct rpcrdma_buffer -- holds list/queue of pre-registered memory for |
353 | * inline requests/replies, and client/server credits. | 375 | * inline requests/replies, and client/server credits. |
diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c index 956c7bce80d1..16aff8ddc16f 100644 --- a/net/sunrpc/xprtsock.c +++ b/net/sunrpc/xprtsock.c | |||
@@ -52,6 +52,8 @@ | |||
52 | #include "sunrpc.h" | 52 | #include "sunrpc.h" |
53 | 53 | ||
54 | static void xs_close(struct rpc_xprt *xprt); | 54 | static void xs_close(struct rpc_xprt *xprt); |
55 | static void xs_tcp_set_socket_timeouts(struct rpc_xprt *xprt, | ||
56 | struct socket *sock); | ||
55 | 57 | ||
56 | /* | 58 | /* |
57 | * xprtsock tunables | 59 | * xprtsock tunables |
@@ -666,6 +668,9 @@ static int xs_tcp_send_request(struct rpc_task *task) | |||
666 | if (task->tk_flags & RPC_TASK_SENT) | 668 | if (task->tk_flags & RPC_TASK_SENT) |
667 | zerocopy = false; | 669 | zerocopy = false; |
668 | 670 | ||
671 | if (test_bit(XPRT_SOCK_UPD_TIMEOUT, &transport->sock_state)) | ||
672 | xs_tcp_set_socket_timeouts(xprt, transport->sock); | ||
673 | |||
669 | /* Continue transmitting the packet/record. We must be careful | 674 | /* Continue transmitting the packet/record. We must be careful |
670 | * to cope with writespace callbacks arriving _after_ we have | 675 | * to cope with writespace callbacks arriving _after_ we have |
671 | * called sendmsg(). */ | 676 | * called sendmsg(). */ |
@@ -1734,7 +1739,9 @@ static void xs_udp_set_buffer_size(struct rpc_xprt *xprt, size_t sndsize, size_t | |||
1734 | */ | 1739 | */ |
1735 | static void xs_udp_timer(struct rpc_xprt *xprt, struct rpc_task *task) | 1740 | static void xs_udp_timer(struct rpc_xprt *xprt, struct rpc_task *task) |
1736 | { | 1741 | { |
1742 | spin_lock_bh(&xprt->transport_lock); | ||
1737 | xprt_adjust_cwnd(xprt, task, -ETIMEDOUT); | 1743 | xprt_adjust_cwnd(xprt, task, -ETIMEDOUT); |
1744 | spin_unlock_bh(&xprt->transport_lock); | ||
1738 | } | 1745 | } |
1739 | 1746 | ||
1740 | static unsigned short xs_get_random_port(void) | 1747 | static unsigned short xs_get_random_port(void) |
@@ -2235,6 +2242,66 @@ static void xs_tcp_shutdown(struct rpc_xprt *xprt) | |||
2235 | xs_reset_transport(transport); | 2242 | xs_reset_transport(transport); |
2236 | } | 2243 | } |
2237 | 2244 | ||
2245 | static void xs_tcp_set_socket_timeouts(struct rpc_xprt *xprt, | ||
2246 | struct socket *sock) | ||
2247 | { | ||
2248 | struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt); | ||
2249 | unsigned int keepidle; | ||
2250 | unsigned int keepcnt; | ||
2251 | unsigned int opt_on = 1; | ||
2252 | unsigned int timeo; | ||
2253 | |||
2254 | spin_lock_bh(&xprt->transport_lock); | ||
2255 | keepidle = DIV_ROUND_UP(xprt->timeout->to_initval, HZ); | ||
2256 | keepcnt = xprt->timeout->to_retries + 1; | ||
2257 | timeo = jiffies_to_msecs(xprt->timeout->to_initval) * | ||
2258 | (xprt->timeout->to_retries + 1); | ||
2259 | clear_bit(XPRT_SOCK_UPD_TIMEOUT, &transport->sock_state); | ||
2260 | spin_unlock_bh(&xprt->transport_lock); | ||
2261 | |||
2262 | /* TCP Keepalive options */ | ||
2263 | kernel_setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, | ||
2264 | (char *)&opt_on, sizeof(opt_on)); | ||
2265 | kernel_setsockopt(sock, SOL_TCP, TCP_KEEPIDLE, | ||
2266 | (char *)&keepidle, sizeof(keepidle)); | ||
2267 | kernel_setsockopt(sock, SOL_TCP, TCP_KEEPINTVL, | ||
2268 | (char *)&keepidle, sizeof(keepidle)); | ||
2269 | kernel_setsockopt(sock, SOL_TCP, TCP_KEEPCNT, | ||
2270 | (char *)&keepcnt, sizeof(keepcnt)); | ||
2271 | |||
2272 | /* TCP user timeout (see RFC5482) */ | ||
2273 | kernel_setsockopt(sock, SOL_TCP, TCP_USER_TIMEOUT, | ||
2274 | (char *)&timeo, sizeof(timeo)); | ||
2275 | } | ||
2276 | |||
2277 | static void xs_tcp_set_connect_timeout(struct rpc_xprt *xprt, | ||
2278 | unsigned long connect_timeout, | ||
2279 | unsigned long reconnect_timeout) | ||
2280 | { | ||
2281 | struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt); | ||
2282 | struct rpc_timeout to; | ||
2283 | unsigned long initval; | ||
2284 | |||
2285 | spin_lock_bh(&xprt->transport_lock); | ||
2286 | if (reconnect_timeout < xprt->max_reconnect_timeout) | ||
2287 | xprt->max_reconnect_timeout = reconnect_timeout; | ||
2288 | if (connect_timeout < xprt->connect_timeout) { | ||
2289 | memcpy(&to, xprt->timeout, sizeof(to)); | ||
2290 | initval = DIV_ROUND_UP(connect_timeout, to.to_retries + 1); | ||
2291 | /* Arbitrary lower limit */ | ||
2292 | if (initval < XS_TCP_INIT_REEST_TO << 1) | ||
2293 | initval = XS_TCP_INIT_REEST_TO << 1; | ||
2294 | to.to_initval = initval; | ||
2295 | to.to_maxval = initval; | ||
2296 | memcpy(&transport->tcp_timeout, &to, | ||
2297 | sizeof(transport->tcp_timeout)); | ||
2298 | xprt->timeout = &transport->tcp_timeout; | ||
2299 | xprt->connect_timeout = connect_timeout; | ||
2300 | } | ||
2301 | set_bit(XPRT_SOCK_UPD_TIMEOUT, &transport->sock_state); | ||
2302 | spin_unlock_bh(&xprt->transport_lock); | ||
2303 | } | ||
2304 | |||
2238 | static int xs_tcp_finish_connecting(struct rpc_xprt *xprt, struct socket *sock) | 2305 | static int xs_tcp_finish_connecting(struct rpc_xprt *xprt, struct socket *sock) |
2239 | { | 2306 | { |
2240 | struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt); | 2307 | struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt); |
@@ -2242,22 +2309,8 @@ static int xs_tcp_finish_connecting(struct rpc_xprt *xprt, struct socket *sock) | |||
2242 | 2309 | ||
2243 | if (!transport->inet) { | 2310 | if (!transport->inet) { |
2244 | struct sock *sk = sock->sk; | 2311 | struct sock *sk = sock->sk; |
2245 | unsigned int keepidle = xprt->timeout->to_initval / HZ; | ||
2246 | unsigned int keepcnt = xprt->timeout->to_retries + 1; | ||
2247 | unsigned int opt_on = 1; | ||
2248 | unsigned int timeo; | ||
2249 | unsigned int addr_pref = IPV6_PREFER_SRC_PUBLIC; | 2312 | unsigned int addr_pref = IPV6_PREFER_SRC_PUBLIC; |
2250 | 2313 | ||
2251 | /* TCP Keepalive options */ | ||
2252 | kernel_setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, | ||
2253 | (char *)&opt_on, sizeof(opt_on)); | ||
2254 | kernel_setsockopt(sock, SOL_TCP, TCP_KEEPIDLE, | ||
2255 | (char *)&keepidle, sizeof(keepidle)); | ||
2256 | kernel_setsockopt(sock, SOL_TCP, TCP_KEEPINTVL, | ||
2257 | (char *)&keepidle, sizeof(keepidle)); | ||
2258 | kernel_setsockopt(sock, SOL_TCP, TCP_KEEPCNT, | ||
2259 | (char *)&keepcnt, sizeof(keepcnt)); | ||
2260 | |||
2261 | /* Avoid temporary address, they are bad for long-lived | 2314 | /* Avoid temporary address, they are bad for long-lived |
2262 | * connections such as NFS mounts. | 2315 | * connections such as NFS mounts. |
2263 | * RFC4941, section 3.6 suggests that: | 2316 | * RFC4941, section 3.6 suggests that: |
@@ -2268,11 +2321,7 @@ static int xs_tcp_finish_connecting(struct rpc_xprt *xprt, struct socket *sock) | |||
2268 | kernel_setsockopt(sock, SOL_IPV6, IPV6_ADDR_PREFERENCES, | 2321 | kernel_setsockopt(sock, SOL_IPV6, IPV6_ADDR_PREFERENCES, |
2269 | (char *)&addr_pref, sizeof(addr_pref)); | 2322 | (char *)&addr_pref, sizeof(addr_pref)); |
2270 | 2323 | ||
2271 | /* TCP user timeout (see RFC5482) */ | 2324 | xs_tcp_set_socket_timeouts(xprt, sock); |
2272 | timeo = jiffies_to_msecs(xprt->timeout->to_initval) * | ||
2273 | (xprt->timeout->to_retries + 1); | ||
2274 | kernel_setsockopt(sock, SOL_TCP, TCP_USER_TIMEOUT, | ||
2275 | (char *)&timeo, sizeof(timeo)); | ||
2276 | 2325 | ||
2277 | write_lock_bh(&sk->sk_callback_lock); | 2326 | write_lock_bh(&sk->sk_callback_lock); |
2278 | 2327 | ||
@@ -2721,6 +2770,7 @@ static struct rpc_xprt_ops xs_tcp_ops = { | |||
2721 | .set_retrans_timeout = xprt_set_retrans_timeout_def, | 2770 | .set_retrans_timeout = xprt_set_retrans_timeout_def, |
2722 | .close = xs_tcp_shutdown, | 2771 | .close = xs_tcp_shutdown, |
2723 | .destroy = xs_destroy, | 2772 | .destroy = xs_destroy, |
2773 | .set_connect_timeout = xs_tcp_set_connect_timeout, | ||
2724 | .print_stats = xs_tcp_print_stats, | 2774 | .print_stats = xs_tcp_print_stats, |
2725 | .enable_swap = xs_enable_swap, | 2775 | .enable_swap = xs_enable_swap, |
2726 | .disable_swap = xs_disable_swap, | 2776 | .disable_swap = xs_disable_swap, |
@@ -3007,6 +3057,8 @@ static struct rpc_xprt *xs_setup_tcp(struct xprt_create *args) | |||
3007 | xprt->timeout = &xs_tcp_default_timeout; | 3057 | xprt->timeout = &xs_tcp_default_timeout; |
3008 | 3058 | ||
3009 | xprt->max_reconnect_timeout = xprt->timeout->to_maxval; | 3059 | xprt->max_reconnect_timeout = xprt->timeout->to_maxval; |
3060 | xprt->connect_timeout = xprt->timeout->to_initval * | ||
3061 | (xprt->timeout->to_retries + 1); | ||
3010 | 3062 | ||
3011 | INIT_WORK(&transport->recv_worker, xs_tcp_data_receive_workfn); | 3063 | INIT_WORK(&transport->recv_worker, xs_tcp_data_receive_workfn); |
3012 | INIT_DELAYED_WORK(&transport->connect_worker, xs_tcp_setup_socket); | 3064 | INIT_DELAYED_WORK(&transport->connect_worker, xs_tcp_setup_socket); |
@@ -3209,7 +3261,9 @@ static int param_set_uint_minmax(const char *val, | |||
3209 | if (!val) | 3261 | if (!val) |
3210 | return -EINVAL; | 3262 | return -EINVAL; |
3211 | ret = kstrtouint(val, 0, &num); | 3263 | ret = kstrtouint(val, 0, &num); |
3212 | if (ret == -EINVAL || num < min || num > max) | 3264 | if (ret) |
3265 | return ret; | ||
3266 | if (num < min || num > max) | ||
3213 | return -EINVAL; | 3267 | return -EINVAL; |
3214 | *((unsigned int *)kp->arg) = num; | 3268 | *((unsigned int *)kp->arg) = num; |
3215 | return 0; | 3269 | return 0; |
diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c index 4dedd0d3d3a7..30d752a4a6a6 100644 --- a/scripts/mod/modpost.c +++ b/scripts/mod/modpost.c | |||
@@ -854,6 +854,7 @@ static const char *const section_white_list[] = | |||
854 | ".cmem*", /* EZchip */ | 854 | ".cmem*", /* EZchip */ |
855 | ".fmt_slot*", /* EZchip */ | 855 | ".fmt_slot*", /* EZchip */ |
856 | ".gnu.lto*", | 856 | ".gnu.lto*", |
857 | ".discard.*", | ||
857 | NULL | 858 | NULL |
858 | }; | 859 | }; |
859 | 860 | ||
diff --git a/scripts/module-common.lds b/scripts/module-common.lds index 73a2c7da0e55..cf7e52e4781b 100644 --- a/scripts/module-common.lds +++ b/scripts/module-common.lds | |||
@@ -4,7 +4,10 @@ | |||
4 | * combine them automatically. | 4 | * combine them automatically. |
5 | */ | 5 | */ |
6 | SECTIONS { | 6 | SECTIONS { |
7 | /DISCARD/ : { *(.discard) } | 7 | /DISCARD/ : { |
8 | *(.discard) | ||
9 | *(.discard.*) | ||
10 | } | ||
8 | 11 | ||
9 | __ksymtab 0 : { *(SORT(___ksymtab+*)) } | 12 | __ksymtab 0 : { *(SORT(___ksymtab+*)) } |
10 | __ksymtab_gpl 0 : { *(SORT(___ksymtab_gpl+*)) } | 13 | __ksymtab_gpl 0 : { *(SORT(___ksymtab_gpl+*)) } |
diff --git a/sound/core/seq/seq_fifo.c b/sound/core/seq/seq_fifo.c index 1d5acbe0c08b..86240d02b530 100644 --- a/sound/core/seq/seq_fifo.c +++ b/sound/core/seq/seq_fifo.c | |||
@@ -135,6 +135,7 @@ int snd_seq_fifo_event_in(struct snd_seq_fifo *f, | |||
135 | f->tail = cell; | 135 | f->tail = cell; |
136 | if (f->head == NULL) | 136 | if (f->head == NULL) |
137 | f->head = cell; | 137 | f->head = cell; |
138 | cell->next = NULL; | ||
138 | f->cells++; | 139 | f->cells++; |
139 | spin_unlock_irqrestore(&f->lock, flags); | 140 | spin_unlock_irqrestore(&f->lock, flags); |
140 | 141 | ||
@@ -214,6 +215,8 @@ void snd_seq_fifo_cell_putback(struct snd_seq_fifo *f, | |||
214 | spin_lock_irqsave(&f->lock, flags); | 215 | spin_lock_irqsave(&f->lock, flags); |
215 | cell->next = f->head; | 216 | cell->next = f->head; |
216 | f->head = cell; | 217 | f->head = cell; |
218 | if (!f->tail) | ||
219 | f->tail = cell; | ||
217 | f->cells++; | 220 | f->cells++; |
218 | spin_unlock_irqrestore(&f->lock, flags); | 221 | spin_unlock_irqrestore(&f->lock, flags); |
219 | } | 222 | } |
diff --git a/sound/core/timer.c b/sound/core/timer.c index fc144f43faa6..ad153149b231 100644 --- a/sound/core/timer.c +++ b/sound/core/timer.c | |||
@@ -1702,9 +1702,21 @@ static int snd_timer_user_params(struct file *file, | |||
1702 | return -EBADFD; | 1702 | return -EBADFD; |
1703 | if (copy_from_user(¶ms, _params, sizeof(params))) | 1703 | if (copy_from_user(¶ms, _params, sizeof(params))) |
1704 | return -EFAULT; | 1704 | return -EFAULT; |
1705 | if (!(t->hw.flags & SNDRV_TIMER_HW_SLAVE) && params.ticks < 1) { | 1705 | if (!(t->hw.flags & SNDRV_TIMER_HW_SLAVE)) { |
1706 | err = -EINVAL; | 1706 | u64 resolution; |
1707 | goto _end; | 1707 | |
1708 | if (params.ticks < 1) { | ||
1709 | err = -EINVAL; | ||
1710 | goto _end; | ||
1711 | } | ||
1712 | |||
1713 | /* Don't allow resolution less than 1ms */ | ||
1714 | resolution = snd_timer_resolution(tu->timeri); | ||
1715 | resolution *= params.ticks; | ||
1716 | if (resolution < 1000000) { | ||
1717 | err = -EINVAL; | ||
1718 | goto _end; | ||
1719 | } | ||
1708 | } | 1720 | } |
1709 | if (params.queue_size > 0 && | 1721 | if (params.queue_size > 0 && |
1710 | (params.queue_size < 32 || params.queue_size > 1024)) { | 1722 | (params.queue_size < 32 || params.queue_size > 1024)) { |
diff --git a/sound/pci/ctxfi/cthw20k1.c b/sound/pci/ctxfi/cthw20k1.c index 9667cbfb0ca2..ab4cdab5cfa5 100644 --- a/sound/pci/ctxfi/cthw20k1.c +++ b/sound/pci/ctxfi/cthw20k1.c | |||
@@ -27,12 +27,6 @@ | |||
27 | #include "cthw20k1.h" | 27 | #include "cthw20k1.h" |
28 | #include "ct20k1reg.h" | 28 | #include "ct20k1reg.h" |
29 | 29 | ||
30 | #if BITS_PER_LONG == 32 | ||
31 | #define CT_XFI_DMA_MASK DMA_BIT_MASK(32) /* 32 bit PTE */ | ||
32 | #else | ||
33 | #define CT_XFI_DMA_MASK DMA_BIT_MASK(64) /* 64 bit PTE */ | ||
34 | #endif | ||
35 | |||
36 | struct hw20k1 { | 30 | struct hw20k1 { |
37 | struct hw hw; | 31 | struct hw hw; |
38 | spinlock_t reg_20k1_lock; | 32 | spinlock_t reg_20k1_lock; |
@@ -1904,19 +1898,18 @@ static int hw_card_start(struct hw *hw) | |||
1904 | { | 1898 | { |
1905 | int err; | 1899 | int err; |
1906 | struct pci_dev *pci = hw->pci; | 1900 | struct pci_dev *pci = hw->pci; |
1901 | const unsigned int dma_bits = BITS_PER_LONG; | ||
1907 | 1902 | ||
1908 | err = pci_enable_device(pci); | 1903 | err = pci_enable_device(pci); |
1909 | if (err < 0) | 1904 | if (err < 0) |
1910 | return err; | 1905 | return err; |
1911 | 1906 | ||
1912 | /* Set DMA transfer mask */ | 1907 | /* Set DMA transfer mask */ |
1913 | if (dma_set_mask(&pci->dev, CT_XFI_DMA_MASK) < 0 || | 1908 | if (dma_set_mask(&pci->dev, DMA_BIT_MASK(dma_bits))) { |
1914 | dma_set_coherent_mask(&pci->dev, CT_XFI_DMA_MASK) < 0) { | 1909 | dma_set_coherent_mask(&pci->dev, DMA_BIT_MASK(dma_bits)); |
1915 | dev_err(hw->card->dev, | 1910 | } else { |
1916 | "architecture does not support PCI busmaster DMA with mask 0x%llx\n", | 1911 | dma_set_mask(&pci->dev, DMA_BIT_MASK(32)); |
1917 | CT_XFI_DMA_MASK); | 1912 | dma_set_coherent_mask(&pci->dev, DMA_BIT_MASK(32)); |
1918 | err = -ENXIO; | ||
1919 | goto error1; | ||
1920 | } | 1913 | } |
1921 | 1914 | ||
1922 | if (!hw->io_base) { | 1915 | if (!hw->io_base) { |
diff --git a/sound/pci/ctxfi/cthw20k2.c b/sound/pci/ctxfi/cthw20k2.c index 6414ecf93efa..18ee7768b7c4 100644 --- a/sound/pci/ctxfi/cthw20k2.c +++ b/sound/pci/ctxfi/cthw20k2.c | |||
@@ -26,12 +26,6 @@ | |||
26 | #include "cthw20k2.h" | 26 | #include "cthw20k2.h" |
27 | #include "ct20k2reg.h" | 27 | #include "ct20k2reg.h" |
28 | 28 | ||
29 | #if BITS_PER_LONG == 32 | ||
30 | #define CT_XFI_DMA_MASK DMA_BIT_MASK(32) /* 32 bit PTE */ | ||
31 | #else | ||
32 | #define CT_XFI_DMA_MASK DMA_BIT_MASK(64) /* 64 bit PTE */ | ||
33 | #endif | ||
34 | |||
35 | struct hw20k2 { | 29 | struct hw20k2 { |
36 | struct hw hw; | 30 | struct hw hw; |
37 | /* for i2c */ | 31 | /* for i2c */ |
@@ -2029,19 +2023,18 @@ static int hw_card_start(struct hw *hw) | |||
2029 | int err = 0; | 2023 | int err = 0; |
2030 | struct pci_dev *pci = hw->pci; | 2024 | struct pci_dev *pci = hw->pci; |
2031 | unsigned int gctl; | 2025 | unsigned int gctl; |
2026 | const unsigned int dma_bits = BITS_PER_LONG; | ||
2032 | 2027 | ||
2033 | err = pci_enable_device(pci); | 2028 | err = pci_enable_device(pci); |
2034 | if (err < 0) | 2029 | if (err < 0) |
2035 | return err; | 2030 | return err; |
2036 | 2031 | ||
2037 | /* Set DMA transfer mask */ | 2032 | /* Set DMA transfer mask */ |
2038 | if (dma_set_mask(&pci->dev, CT_XFI_DMA_MASK) < 0 || | 2033 | if (!dma_set_mask(&pci->dev, DMA_BIT_MASK(dma_bits))) { |
2039 | dma_set_coherent_mask(&pci->dev, CT_XFI_DMA_MASK) < 0) { | 2034 | dma_set_coherent_mask(&pci->dev, DMA_BIT_MASK(dma_bits)); |
2040 | dev_err(hw->card->dev, | 2035 | } else { |
2041 | "architecture does not support PCI busmaster DMA with mask 0x%llx\n", | 2036 | dma_set_mask(&pci->dev, DMA_BIT_MASK(32)); |
2042 | CT_XFI_DMA_MASK); | 2037 | dma_set_coherent_mask(&pci->dev, DMA_BIT_MASK(32)); |
2043 | err = -ENXIO; | ||
2044 | goto error1; | ||
2045 | } | 2038 | } |
2046 | 2039 | ||
2047 | if (!hw->io_base) { | 2040 | if (!hw->io_base) { |
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index 16108f0eb688..c8256a89375a 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c | |||
@@ -2255,6 +2255,9 @@ static const struct pci_device_id azx_ids[] = { | |||
2255 | /* Broxton-T */ | 2255 | /* Broxton-T */ |
2256 | { PCI_DEVICE(0x8086, 0x1a98), | 2256 | { PCI_DEVICE(0x8086, 0x1a98), |
2257 | .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_BROXTON }, | 2257 | .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_BROXTON }, |
2258 | /* Gemini-Lake */ | ||
2259 | { PCI_DEVICE(0x8086, 0x3198), | ||
2260 | .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_BROXTON }, | ||
2258 | /* Haswell */ | 2261 | /* Haswell */ |
2259 | { PCI_DEVICE(0x8086, 0x0a0c), | 2262 | { PCI_DEVICE(0x8086, 0x0a0c), |
2260 | .driver_data = AZX_DRIVER_HDMI | AZX_DCAPS_INTEL_HASWELL }, | 2263 | .driver_data = AZX_DRIVER_HDMI | AZX_DCAPS_INTEL_HASWELL }, |
diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c index fd5efa72a68b..1461ef8eb749 100644 --- a/sound/pci/hda/patch_hdmi.c +++ b/sound/pci/hda/patch_hdmi.c | |||
@@ -3800,6 +3800,7 @@ HDA_CODEC_ENTRY(0x80862808, "Broadwell HDMI", patch_i915_hsw_hdmi), | |||
3800 | HDA_CODEC_ENTRY(0x80862809, "Skylake HDMI", patch_i915_hsw_hdmi), | 3800 | HDA_CODEC_ENTRY(0x80862809, "Skylake HDMI", patch_i915_hsw_hdmi), |
3801 | HDA_CODEC_ENTRY(0x8086280a, "Broxton HDMI", patch_i915_hsw_hdmi), | 3801 | HDA_CODEC_ENTRY(0x8086280a, "Broxton HDMI", patch_i915_hsw_hdmi), |
3802 | HDA_CODEC_ENTRY(0x8086280b, "Kabylake HDMI", patch_i915_hsw_hdmi), | 3802 | HDA_CODEC_ENTRY(0x8086280b, "Kabylake HDMI", patch_i915_hsw_hdmi), |
3803 | HDA_CODEC_ENTRY(0x8086280d, "Geminilake HDMI", patch_i915_hsw_hdmi), | ||
3803 | HDA_CODEC_ENTRY(0x80862880, "CedarTrail HDMI", patch_generic_hdmi), | 3804 | HDA_CODEC_ENTRY(0x80862880, "CedarTrail HDMI", patch_generic_hdmi), |
3804 | HDA_CODEC_ENTRY(0x80862882, "Valleyview2 HDMI", patch_i915_byt_hdmi), | 3805 | HDA_CODEC_ENTRY(0x80862882, "Valleyview2 HDMI", patch_i915_byt_hdmi), |
3805 | HDA_CODEC_ENTRY(0x80862883, "Braswell HDMI", patch_i915_byt_hdmi), | 3806 | HDA_CODEC_ENTRY(0x80862883, "Braswell HDMI", patch_i915_byt_hdmi), |
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 73a00460b5c1..4e112221d825 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
@@ -5606,6 +5606,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { | |||
5606 | SND_PCI_QUIRK(0x1028, 0x0725, "Dell Inspiron 3162", ALC255_FIXUP_DELL_SPK_NOISE), | 5606 | SND_PCI_QUIRK(0x1028, 0x0725, "Dell Inspiron 3162", ALC255_FIXUP_DELL_SPK_NOISE), |
5607 | SND_PCI_QUIRK(0x1028, 0x075b, "Dell XPS 13 9360", ALC256_FIXUP_DELL_XPS_13_HEADPHONE_NOISE), | 5607 | SND_PCI_QUIRK(0x1028, 0x075b, "Dell XPS 13 9360", ALC256_FIXUP_DELL_XPS_13_HEADPHONE_NOISE), |
5608 | SND_PCI_QUIRK(0x1028, 0x075d, "Dell AIO", ALC298_FIXUP_SPK_VOLUME), | 5608 | SND_PCI_QUIRK(0x1028, 0x075d, "Dell AIO", ALC298_FIXUP_SPK_VOLUME), |
5609 | SND_PCI_QUIRK(0x1028, 0x0798, "Dell Inspiron 17 7000 Gaming", ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER), | ||
5609 | SND_PCI_QUIRK(0x1028, 0x164a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), | 5610 | SND_PCI_QUIRK(0x1028, 0x164a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), |
5610 | SND_PCI_QUIRK(0x1028, 0x164b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), | 5611 | SND_PCI_QUIRK(0x1028, 0x164b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), |
5611 | SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC2), | 5612 | SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC2), |
@@ -5724,6 +5725,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { | |||
5724 | SND_PCI_QUIRK(0x17aa, 0x2233, "Thinkpad", ALC292_FIXUP_TPT460), | 5725 | SND_PCI_QUIRK(0x17aa, 0x2233, "Thinkpad", ALC292_FIXUP_TPT460), |
5725 | SND_PCI_QUIRK(0x17aa, 0x30bb, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY), | 5726 | SND_PCI_QUIRK(0x17aa, 0x30bb, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY), |
5726 | SND_PCI_QUIRK(0x17aa, 0x30e2, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY), | 5727 | SND_PCI_QUIRK(0x17aa, 0x30e2, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY), |
5728 | SND_PCI_QUIRK(0x17aa, 0x3112, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY), | ||
5727 | SND_PCI_QUIRK(0x17aa, 0x3902, "Lenovo E50-80", ALC269_FIXUP_DMIC_THINKPAD_ACPI), | 5729 | SND_PCI_QUIRK(0x17aa, 0x3902, "Lenovo E50-80", ALC269_FIXUP_DMIC_THINKPAD_ACPI), |
5728 | SND_PCI_QUIRK(0x17aa, 0x3977, "IdeaPad S210", ALC283_FIXUP_INT_MIC), | 5730 | SND_PCI_QUIRK(0x17aa, 0x3977, "IdeaPad S210", ALC283_FIXUP_INT_MIC), |
5729 | SND_PCI_QUIRK(0x17aa, 0x3978, "IdeaPad Y410P", ALC269_FIXUP_NO_SHUTUP), | 5731 | SND_PCI_QUIRK(0x17aa, 0x3978, "IdeaPad Y410P", ALC269_FIXUP_NO_SHUTUP), |
diff --git a/tools/objtool/builtin-check.c b/tools/objtool/builtin-check.c index 5fc52ee3264c..4cfdbb5b6967 100644 --- a/tools/objtool/builtin-check.c +++ b/tools/objtool/builtin-check.c | |||
@@ -339,13 +339,13 @@ static int add_dead_ends(struct objtool_file *file) | |||
339 | struct instruction *insn; | 339 | struct instruction *insn; |
340 | bool found; | 340 | bool found; |
341 | 341 | ||
342 | sec = find_section_by_name(file->elf, ".rela__unreachable"); | 342 | sec = find_section_by_name(file->elf, ".rela.discard.unreachable"); |
343 | if (!sec) | 343 | if (!sec) |
344 | return 0; | 344 | return 0; |
345 | 345 | ||
346 | list_for_each_entry(rela, &sec->rela_list, list) { | 346 | list_for_each_entry(rela, &sec->rela_list, list) { |
347 | if (rela->sym->type != STT_SECTION) { | 347 | if (rela->sym->type != STT_SECTION) { |
348 | WARN("unexpected relocation symbol type in .rela__unreachable"); | 348 | WARN("unexpected relocation symbol type in %s", sec->name); |
349 | return -1; | 349 | return -1; |
350 | } | 350 | } |
351 | insn = find_insn(file, rela->sym->sec, rela->addend); | 351 | insn = find_insn(file, rela->sym->sec, rela->addend); |
@@ -1272,7 +1272,7 @@ int cmd_check(int argc, const char **argv) | |||
1272 | 1272 | ||
1273 | INIT_LIST_HEAD(&file.insn_list); | 1273 | INIT_LIST_HEAD(&file.insn_list); |
1274 | hash_init(file.insn_hash); | 1274 | hash_init(file.insn_hash); |
1275 | file.whitelist = find_section_by_name(file.elf, "__func_stack_frame_non_standard"); | 1275 | file.whitelist = find_section_by_name(file.elf, ".discard.func_stack_frame_non_standard"); |
1276 | file.rodata = find_section_by_name(file.elf, ".rodata"); | 1276 | file.rodata = find_section_by_name(file.elf, ".rodata"); |
1277 | file.ignore_unreachables = false; | 1277 | file.ignore_unreachables = false; |
1278 | file.c_file = find_section_by_name(file.elf, ".comment"); | 1278 | file.c_file = find_section_by_name(file.elf, ".comment"); |