diff options
author | Chris Metcalf <cmetcalf@tilera.com> | 2012-03-29 13:30:31 -0400 |
---|---|---|
committer | Chris Metcalf <cmetcalf@tilera.com> | 2012-05-25 12:48:22 -0400 |
commit | 1efea40d4172a2a475ccb29b59d6221e9d0c174b (patch) | |
tree | 8152b61bb3fa83eb3403bca5cb05731c1063e999 /arch/tile/kernel | |
parent | 73636b1aacb1a07e6fbe0d25e560e69b024a8e25 (diff) |
arch/tile: support building big-endian kernel
The toolchain supports big-endian mode now, so add support for building
the kernel to run big-endian as well.
Signed-off-by: Chris Metcalf <cmetcalf@tilera.com>
Diffstat (limited to 'arch/tile/kernel')
-rw-r--r-- | arch/tile/kernel/module.c | 12 | ||||
-rw-r--r-- | arch/tile/kernel/single_step.c | 16 |
2 files changed, 23 insertions, 5 deletions
diff --git a/arch/tile/kernel/module.c b/arch/tile/kernel/module.c index 98d476920106..001cbfa10ac6 100644 --- a/arch/tile/kernel/module.c +++ b/arch/tile/kernel/module.c | |||
@@ -159,7 +159,17 @@ int apply_relocate_add(Elf_Shdr *sechdrs, | |||
159 | 159 | ||
160 | switch (ELF_R_TYPE(rel[i].r_info)) { | 160 | switch (ELF_R_TYPE(rel[i].r_info)) { |
161 | 161 | ||
162 | #define MUNGE(func) (*location = ((*location & ~func(-1)) | func(value))) | 162 | #ifdef __LITTLE_ENDIAN |
163 | # define MUNGE(func) \ | ||
164 | (*location = ((*location & ~func(-1)) | func(value))) | ||
165 | #else | ||
166 | /* | ||
167 | * Instructions are always little-endian, so when we read them as data, | ||
168 | * we have to swap them around before and after modifying them. | ||
169 | */ | ||
170 | # define MUNGE(func) \ | ||
171 | (*location = swab64((swab64(*location) & ~func(-1)) | func(value))) | ||
172 | #endif | ||
163 | 173 | ||
164 | #ifndef __tilegx__ | 174 | #ifndef __tilegx__ |
165 | case R_TILE_32: | 175 | case R_TILE_32: |
diff --git a/arch/tile/kernel/single_step.c b/arch/tile/kernel/single_step.c index 89529c9f0605..27742e87e255 100644 --- a/arch/tile/kernel/single_step.c +++ b/arch/tile/kernel/single_step.c | |||
@@ -172,9 +172,6 @@ static tile_bundle_bits rewrite_load_store_unaligned( | |||
172 | return (tilepro_bundle_bits) 0; | 172 | return (tilepro_bundle_bits) 0; |
173 | } | 173 | } |
174 | 174 | ||
175 | #ifndef __LITTLE_ENDIAN | ||
176 | # error We assume little-endian representation with copy_xx_user size 2 here | ||
177 | #endif | ||
178 | /* Handle unaligned load/store */ | 175 | /* Handle unaligned load/store */ |
179 | if (mem_op == MEMOP_LOAD || mem_op == MEMOP_LOAD_POSTINCR) { | 176 | if (mem_op == MEMOP_LOAD || mem_op == MEMOP_LOAD_POSTINCR) { |
180 | unsigned short val_16; | 177 | unsigned short val_16; |
@@ -195,8 +192,19 @@ static tile_bundle_bits rewrite_load_store_unaligned( | |||
195 | state->update = 1; | 192 | state->update = 1; |
196 | } | 193 | } |
197 | } else { | 194 | } else { |
195 | unsigned short val_16; | ||
198 | val = (val_reg == TREG_ZERO) ? 0 : regs->regs[val_reg]; | 196 | val = (val_reg == TREG_ZERO) ? 0 : regs->regs[val_reg]; |
199 | err = copy_to_user(addr, &val, size); | 197 | switch (size) { |
198 | case 2: | ||
199 | val_16 = val; | ||
200 | err = copy_to_user(addr, &val_16, sizeof(val_16)); | ||
201 | break; | ||
202 | case 4: | ||
203 | err = copy_to_user(addr, &val, sizeof(val)); | ||
204 | break; | ||
205 | default: | ||
206 | BUG(); | ||
207 | } | ||
200 | } | 208 | } |
201 | 209 | ||
202 | if (err) { | 210 | if (err) { |