Andreas Färber | 25ebd80 | 2012-04-06 19:46:48 +0200 | [diff] [blame] | 1 | /* |
| 2 | * QEMU Alpha CPU |
| 3 | * |
Andreas Färber | 9444006 | 2012-04-07 01:19:45 +0200 | [diff] [blame] | 4 | * Copyright (c) 2007 Jocelyn Mayer |
Andreas Färber | 25ebd80 | 2012-04-06 19:46:48 +0200 | [diff] [blame] | 5 | * Copyright (c) 2012 SUSE LINUX Products GmbH |
| 6 | * |
| 7 | * This library is free software; you can redistribute it and/or |
| 8 | * modify it under the terms of the GNU Lesser General Public |
| 9 | * License as published by the Free Software Foundation; either |
| 10 | * version 2.1 of the License, or (at your option) any later version. |
| 11 | * |
| 12 | * This library is distributed in the hope that it will be useful, |
| 13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| 15 | * Lesser General Public License for more details. |
| 16 | * |
| 17 | * You should have received a copy of the GNU Lesser General Public |
| 18 | * License along with this library; if not, see |
| 19 | * <http://www.gnu.org/licenses/lgpl-2.1.html> |
| 20 | */ |
| 21 | |
Peter Maydell | e2e5e11 | 2016-01-26 18:17:04 +0000 | [diff] [blame] | 22 | #include "qemu/osdep.h" |
Markus Armbruster | da34e65 | 2016-03-14 09:01:28 +0100 | [diff] [blame] | 23 | #include "qapi/error.h" |
Markus Armbruster | 0442428 | 2019-04-17 21:17:57 +0200 | [diff] [blame] | 24 | #include "qemu/qemu-print.h" |
Andreas Färber | 3993c6b | 2012-05-03 06:43:49 +0200 | [diff] [blame] | 25 | #include "cpu.h" |
Paolo Bonzini | 63c9155 | 2016-03-15 13:18:37 +0100 | [diff] [blame] | 26 | #include "exec/exec-all.h" |
Andreas Färber | 25ebd80 | 2012-04-06 19:46:48 +0200 | [diff] [blame] | 27 | |
| 28 | |
Andreas Färber | f45748f | 2013-06-21 19:09:18 +0200 | [diff] [blame] | 29 | static void alpha_cpu_set_pc(CPUState *cs, vaddr value) |
| 30 | { |
| 31 | AlphaCPU *cpu = ALPHA_CPU(cs); |
| 32 | |
| 33 | cpu->env.pc = value; |
| 34 | } |
| 35 | |
Andreas Färber | 8c2e1b0 | 2013-08-25 18:53:55 +0200 | [diff] [blame] | 36 | static bool alpha_cpu_has_work(CPUState *cs) |
| 37 | { |
| 38 | /* Here we are checking to see if the CPU should wake up from HALT. |
| 39 | We will have gotten into this state only for WTINT from PALmode. */ |
| 40 | /* ??? I'm not sure how the IPL state works with WTINT to keep a CPU |
| 41 | asleep even if (some) interrupts have been asserted. For now, |
| 42 | assume that if a CPU really wants to stay asleep, it will mask |
| 43 | interrupts at the chipset level, which will prevent these bits |
| 44 | from being set in the first place. */ |
| 45 | return cs->interrupt_request & (CPU_INTERRUPT_HARD |
| 46 | | CPU_INTERRUPT_TIMER |
| 47 | | CPU_INTERRUPT_SMP |
| 48 | | CPU_INTERRUPT_MCHK); |
| 49 | } |
| 50 | |
Peter Crosthwaite | 0960be7 | 2015-07-11 19:00:05 -0700 | [diff] [blame] | 51 | static void alpha_cpu_disas_set_info(CPUState *cpu, disassemble_info *info) |
| 52 | { |
| 53 | info->mach = bfd_mach_alpha_ev6; |
| 54 | info->print_insn = print_insn_alpha; |
| 55 | } |
| 56 | |
Andreas Färber | bd1b282 | 2013-01-05 14:01:30 +0100 | [diff] [blame] | 57 | static void alpha_cpu_realizefn(DeviceState *dev, Error **errp) |
Andreas Färber | 0c28246 | 2012-10-15 17:33:32 +0200 | [diff] [blame] | 58 | { |
Andreas Färber | 14a10fc | 2013-07-27 02:53:25 +0200 | [diff] [blame] | 59 | CPUState *cs = CPU(dev); |
Andreas Färber | bd1b282 | 2013-01-05 14:01:30 +0100 | [diff] [blame] | 60 | AlphaCPUClass *acc = ALPHA_CPU_GET_CLASS(dev); |
Laurent Vivier | ce5b1bb | 2016-10-20 13:26:03 +0200 | [diff] [blame] | 61 | Error *local_err = NULL; |
| 62 | |
| 63 | cpu_exec_realizefn(cs, &local_err); |
| 64 | if (local_err != NULL) { |
| 65 | error_propagate(errp, local_err); |
| 66 | return; |
| 67 | } |
Andreas Färber | 0c28246 | 2012-10-15 17:33:32 +0200 | [diff] [blame] | 68 | |
Andreas Färber | 14a10fc | 2013-07-27 02:53:25 +0200 | [diff] [blame] | 69 | qemu_init_vcpu(cs); |
| 70 | |
Andreas Färber | bd1b282 | 2013-01-05 14:01:30 +0100 | [diff] [blame] | 71 | acc->parent_realize(dev, errp); |
Andreas Färber | 0c28246 | 2012-10-15 17:33:32 +0200 | [diff] [blame] | 72 | } |
| 73 | |
Andreas Färber | 494342b | 2012-10-15 17:44:21 +0200 | [diff] [blame] | 74 | static void alpha_cpu_list_entry(gpointer data, gpointer user_data) |
| 75 | { |
| 76 | ObjectClass *oc = data; |
Andreas Färber | 494342b | 2012-10-15 17:44:21 +0200 | [diff] [blame] | 77 | |
Markus Armbruster | 0442428 | 2019-04-17 21:17:57 +0200 | [diff] [blame] | 78 | qemu_printf(" %s\n", object_class_get_name(oc)); |
Andreas Färber | 494342b | 2012-10-15 17:44:21 +0200 | [diff] [blame] | 79 | } |
| 80 | |
Markus Armbruster | 0442428 | 2019-04-17 21:17:57 +0200 | [diff] [blame] | 81 | void alpha_cpu_list(void) |
Andreas Färber | 494342b | 2012-10-15 17:44:21 +0200 | [diff] [blame] | 82 | { |
Andreas Färber | 494342b | 2012-10-15 17:44:21 +0200 | [diff] [blame] | 83 | GSList *list; |
| 84 | |
Paolo Bonzini | 47c6600 | 2018-03-03 08:33:10 +0100 | [diff] [blame] | 85 | list = object_class_get_list_sorted(TYPE_ALPHA_CPU, false); |
Markus Armbruster | 0442428 | 2019-04-17 21:17:57 +0200 | [diff] [blame] | 86 | qemu_printf("Available CPUs:\n"); |
| 87 | g_slist_foreach(list, alpha_cpu_list_entry, NULL); |
Andreas Färber | 494342b | 2012-10-15 17:44:21 +0200 | [diff] [blame] | 88 | g_slist_free(list); |
| 89 | } |
| 90 | |
Andreas Färber | 0c28246 | 2012-10-15 17:33:32 +0200 | [diff] [blame] | 91 | /* Models */ |
Andreas Färber | 0c28246 | 2012-10-15 17:33:32 +0200 | [diff] [blame] | 92 | typedef struct AlphaCPUAlias { |
| 93 | const char *alias; |
| 94 | const char *typename; |
| 95 | } AlphaCPUAlias; |
| 96 | |
| 97 | static const AlphaCPUAlias alpha_cpu_aliases[] = { |
Igor Mammedov | 73a25e8 | 2017-10-05 15:50:38 +0200 | [diff] [blame] | 98 | { "21064", ALPHA_CPU_TYPE_NAME("ev4") }, |
| 99 | { "21164", ALPHA_CPU_TYPE_NAME("ev5") }, |
| 100 | { "21164a", ALPHA_CPU_TYPE_NAME("ev56") }, |
| 101 | { "21164pc", ALPHA_CPU_TYPE_NAME("pca56") }, |
| 102 | { "21264", ALPHA_CPU_TYPE_NAME("ev6") }, |
| 103 | { "21264a", ALPHA_CPU_TYPE_NAME("ev67") }, |
Andreas Färber | 0c28246 | 2012-10-15 17:33:32 +0200 | [diff] [blame] | 104 | }; |
| 105 | |
| 106 | static ObjectClass *alpha_cpu_class_by_name(const char *cpu_model) |
| 107 | { |
Philippe Mathieu-Daudé | 8301ea4 | 2017-09-17 20:28:42 -0300 | [diff] [blame] | 108 | ObjectClass *oc; |
Andreas Färber | 0c28246 | 2012-10-15 17:33:32 +0200 | [diff] [blame] | 109 | char *typename; |
| 110 | int i; |
| 111 | |
Andreas Färber | 0c28246 | 2012-10-15 17:33:32 +0200 | [diff] [blame] | 112 | oc = object_class_by_name(cpu_model); |
Andreas Färber | a120c28 | 2013-01-23 12:28:22 +0100 | [diff] [blame] | 113 | if (oc != NULL && object_class_dynamic_cast(oc, TYPE_ALPHA_CPU) != NULL && |
| 114 | !object_class_is_abstract(oc)) { |
Andreas Färber | 0c28246 | 2012-10-15 17:33:32 +0200 | [diff] [blame] | 115 | return oc; |
| 116 | } |
| 117 | |
| 118 | for (i = 0; i < ARRAY_SIZE(alpha_cpu_aliases); i++) { |
| 119 | if (strcmp(cpu_model, alpha_cpu_aliases[i].alias) == 0) { |
| 120 | oc = object_class_by_name(alpha_cpu_aliases[i].typename); |
Andreas Färber | a120c28 | 2013-01-23 12:28:22 +0100 | [diff] [blame] | 121 | assert(oc != NULL && !object_class_is_abstract(oc)); |
Andreas Färber | 0c28246 | 2012-10-15 17:33:32 +0200 | [diff] [blame] | 122 | return oc; |
| 123 | } |
| 124 | } |
| 125 | |
Igor Mammedov | 73a25e8 | 2017-10-05 15:50:38 +0200 | [diff] [blame] | 126 | typename = g_strdup_printf(ALPHA_CPU_TYPE_NAME("%s"), cpu_model); |
Andreas Färber | 0c28246 | 2012-10-15 17:33:32 +0200 | [diff] [blame] | 127 | oc = object_class_by_name(typename); |
| 128 | g_free(typename); |
Andreas Färber | a120c28 | 2013-01-23 12:28:22 +0100 | [diff] [blame] | 129 | if (oc != NULL && object_class_is_abstract(oc)) { |
| 130 | oc = NULL; |
| 131 | } |
Andreas Färber | 0c28246 | 2012-10-15 17:33:32 +0200 | [diff] [blame] | 132 | |
Igor Mammedov | 82a3d1f | 2017-08-24 18:31:32 +0200 | [diff] [blame] | 133 | /* TODO: remove match everything nonsense */ |
| 134 | /* Default to ev67; no reason not to emulate insns by default. */ |
| 135 | if (!oc) { |
Igor Mammedov | 73a25e8 | 2017-10-05 15:50:38 +0200 | [diff] [blame] | 136 | oc = object_class_by_name(ALPHA_CPU_TYPE_NAME("ev67")); |
Andreas Färber | 0c28246 | 2012-10-15 17:33:32 +0200 | [diff] [blame] | 137 | } |
Andreas Färber | 0c28246 | 2012-10-15 17:33:32 +0200 | [diff] [blame] | 138 | |
Igor Mammedov | 82a3d1f | 2017-08-24 18:31:32 +0200 | [diff] [blame] | 139 | return oc; |
Andreas Färber | 0c28246 | 2012-10-15 17:33:32 +0200 | [diff] [blame] | 140 | } |
| 141 | |
| 142 | static void ev4_cpu_initfn(Object *obj) |
| 143 | { |
| 144 | AlphaCPU *cpu = ALPHA_CPU(obj); |
| 145 | CPUAlphaState *env = &cpu->env; |
| 146 | |
| 147 | env->implver = IMPLVER_2106x; |
| 148 | } |
| 149 | |
Andreas Färber | 0c28246 | 2012-10-15 17:33:32 +0200 | [diff] [blame] | 150 | static void ev5_cpu_initfn(Object *obj) |
| 151 | { |
| 152 | AlphaCPU *cpu = ALPHA_CPU(obj); |
| 153 | CPUAlphaState *env = &cpu->env; |
| 154 | |
| 155 | env->implver = IMPLVER_21164; |
| 156 | } |
| 157 | |
Andreas Färber | 0c28246 | 2012-10-15 17:33:32 +0200 | [diff] [blame] | 158 | static void ev56_cpu_initfn(Object *obj) |
| 159 | { |
| 160 | AlphaCPU *cpu = ALPHA_CPU(obj); |
| 161 | CPUAlphaState *env = &cpu->env; |
| 162 | |
| 163 | env->amask |= AMASK_BWX; |
| 164 | } |
| 165 | |
Andreas Färber | 0c28246 | 2012-10-15 17:33:32 +0200 | [diff] [blame] | 166 | static void pca56_cpu_initfn(Object *obj) |
| 167 | { |
| 168 | AlphaCPU *cpu = ALPHA_CPU(obj); |
| 169 | CPUAlphaState *env = &cpu->env; |
| 170 | |
| 171 | env->amask |= AMASK_MVI; |
| 172 | } |
| 173 | |
Andreas Färber | 0c28246 | 2012-10-15 17:33:32 +0200 | [diff] [blame] | 174 | static void ev6_cpu_initfn(Object *obj) |
| 175 | { |
| 176 | AlphaCPU *cpu = ALPHA_CPU(obj); |
| 177 | CPUAlphaState *env = &cpu->env; |
| 178 | |
| 179 | env->implver = IMPLVER_21264; |
| 180 | env->amask = AMASK_BWX | AMASK_FIX | AMASK_MVI | AMASK_TRAP; |
| 181 | } |
| 182 | |
Andreas Färber | 0c28246 | 2012-10-15 17:33:32 +0200 | [diff] [blame] | 183 | static void ev67_cpu_initfn(Object *obj) |
| 184 | { |
| 185 | AlphaCPU *cpu = ALPHA_CPU(obj); |
| 186 | CPUAlphaState *env = &cpu->env; |
| 187 | |
| 188 | env->amask |= AMASK_CIX | AMASK_PREFETCH; |
| 189 | } |
| 190 | |
Andreas Färber | 9444006 | 2012-04-07 01:19:45 +0200 | [diff] [blame] | 191 | static void alpha_cpu_initfn(Object *obj) |
| 192 | { |
| 193 | AlphaCPU *cpu = ALPHA_CPU(obj); |
| 194 | CPUAlphaState *env = &cpu->env; |
| 195 | |
Richard Henderson | 7506ed9 | 2019-03-28 11:26:22 -1000 | [diff] [blame] | 196 | cpu_set_cpustate_pointers(cpu); |
Andreas Färber | 9444006 | 2012-04-07 01:19:45 +0200 | [diff] [blame] | 197 | |
Richard Henderson | bcd2625 | 2017-07-06 09:45:07 -1000 | [diff] [blame] | 198 | env->lock_addr = -1; |
Andreas Färber | 9444006 | 2012-04-07 01:19:45 +0200 | [diff] [blame] | 199 | #if defined(CONFIG_USER_ONLY) |
Richard Henderson | bcd2625 | 2017-07-06 09:45:07 -1000 | [diff] [blame] | 200 | env->flags = ENV_FLAG_PS_USER | ENV_FLAG_FEN; |
Richard Henderson | 29eb528 | 2019-01-06 08:39:32 +1000 | [diff] [blame] | 201 | cpu_alpha_store_fpcr(env, (uint64_t)(FPCR_INVD | FPCR_DZED | FPCR_OVFD |
| 202 | | FPCR_UNFD | FPCR_INED | FPCR_DNOD |
| 203 | | FPCR_DYN_NORMAL) << 32); |
Richard Henderson | bcd2625 | 2017-07-06 09:45:07 -1000 | [diff] [blame] | 204 | #else |
| 205 | env->flags = ENV_FLAG_PAL_MODE | ENV_FLAG_FEN; |
Andreas Färber | 9444006 | 2012-04-07 01:19:45 +0200 | [diff] [blame] | 206 | #endif |
Andreas Färber | 9444006 | 2012-04-07 01:19:45 +0200 | [diff] [blame] | 207 | } |
| 208 | |
Philippe Mathieu-Daudé | 8b80bd2 | 2021-05-17 12:51:31 +0200 | [diff] [blame] | 209 | #ifndef CONFIG_USER_ONLY |
| 210 | #include "hw/core/sysemu-cpu-ops.h" |
| 211 | |
| 212 | static const struct SysemuCPUOps alpha_sysemu_ops = { |
Philippe Mathieu-Daudé | 08928c6 | 2021-05-17 12:51:37 +0200 | [diff] [blame] | 213 | .get_phys_page_debug = alpha_cpu_get_phys_page_debug, |
Philippe Mathieu-Daudé | 8b80bd2 | 2021-05-17 12:51:31 +0200 | [diff] [blame] | 214 | }; |
| 215 | #endif |
| 216 | |
Claudio Fontana | 7827168 | 2021-02-04 17:39:23 +0100 | [diff] [blame] | 217 | #include "hw/core/tcg-cpu-ops.h" |
| 218 | |
Richard Henderson | 1190655 | 2021-02-27 15:21:17 -0800 | [diff] [blame] | 219 | static const struct TCGCPUOps alpha_tcg_ops = { |
Claudio Fontana | 7827168 | 2021-02-04 17:39:23 +0100 | [diff] [blame] | 220 | .initialize = alpha_translate_init, |
Claudio Fontana | 7827168 | 2021-02-04 17:39:23 +0100 | [diff] [blame] | 221 | |
Richard Henderson | 9011388 | 2021-10-05 19:31:14 -0700 | [diff] [blame] | 222 | #ifdef CONFIG_USER_ONLY |
| 223 | .record_sigsegv = alpha_cpu_record_sigsegv, |
Richard Henderson | e7424ab | 2021-07-23 12:20:55 -1000 | [diff] [blame] | 224 | .record_sigbus = alpha_cpu_record_sigbus, |
Richard Henderson | 9011388 | 2021-10-05 19:31:14 -0700 | [diff] [blame] | 225 | #else |
| 226 | .tlb_fill = alpha_cpu_tlb_fill, |
Philippe Mathieu-Daudé | 9354e69 | 2021-09-11 18:54:16 +0200 | [diff] [blame] | 227 | .cpu_exec_interrupt = alpha_cpu_exec_interrupt, |
Claudio Fontana | 7827168 | 2021-02-04 17:39:23 +0100 | [diff] [blame] | 228 | .do_interrupt = alpha_cpu_do_interrupt, |
| 229 | .do_transaction_failed = alpha_cpu_do_transaction_failed, |
| 230 | .do_unaligned_access = alpha_cpu_do_unaligned_access, |
| 231 | #endif /* !CONFIG_USER_ONLY */ |
| 232 | }; |
| 233 | |
Andreas Färber | 2b8c275 | 2013-01-21 18:26:21 +0100 | [diff] [blame] | 234 | static void alpha_cpu_class_init(ObjectClass *oc, void *data) |
| 235 | { |
Andreas Färber | bd1b282 | 2013-01-05 14:01:30 +0100 | [diff] [blame] | 236 | DeviceClass *dc = DEVICE_CLASS(oc); |
Andreas Färber | 2b8c275 | 2013-01-21 18:26:21 +0100 | [diff] [blame] | 237 | CPUClass *cc = CPU_CLASS(oc); |
Andreas Färber | bd1b282 | 2013-01-05 14:01:30 +0100 | [diff] [blame] | 238 | AlphaCPUClass *acc = ALPHA_CPU_CLASS(oc); |
| 239 | |
Philippe Mathieu-Daudé | bf85388 | 2018-01-13 23:04:12 -0300 | [diff] [blame] | 240 | device_class_set_parent_realize(dc, alpha_cpu_realizefn, |
| 241 | &acc->parent_realize); |
Andreas Färber | 2b8c275 | 2013-01-21 18:26:21 +0100 | [diff] [blame] | 242 | |
| 243 | cc->class_by_name = alpha_cpu_class_by_name; |
Andreas Färber | 8c2e1b0 | 2013-08-25 18:53:55 +0200 | [diff] [blame] | 244 | cc->has_work = alpha_cpu_has_work; |
Andreas Färber | 878096e | 2013-05-27 01:33:50 +0200 | [diff] [blame] | 245 | cc->dump_state = alpha_cpu_dump_state; |
Andreas Färber | f45748f | 2013-06-21 19:09:18 +0200 | [diff] [blame] | 246 | cc->set_pc = alpha_cpu_set_pc; |
Andreas Färber | 5b50e79 | 2013-06-29 04:18:45 +0200 | [diff] [blame] | 247 | cc->gdb_read_register = alpha_cpu_gdb_read_register; |
| 248 | cc->gdb_write_register = alpha_cpu_gdb_write_register; |
Richard Henderson | e41c945 | 2019-04-02 14:51:11 +0700 | [diff] [blame] | 249 | #ifndef CONFIG_USER_ONLY |
Andreas Färber | 00b941e | 2013-06-29 18:55:54 +0200 | [diff] [blame] | 250 | dc->vmsd = &vmstate_alpha_cpu; |
Philippe Mathieu-Daudé | 8b80bd2 | 2021-05-17 12:51:31 +0200 | [diff] [blame] | 251 | cc->sysemu_ops = &alpha_sysemu_ops; |
Andreas Färber | 00b941e | 2013-06-29 18:55:54 +0200 | [diff] [blame] | 252 | #endif |
Peter Crosthwaite | 0960be7 | 2015-07-11 19:00:05 -0700 | [diff] [blame] | 253 | cc->disas_set_info = alpha_cpu_disas_set_info; |
| 254 | |
Claudio Fontana | 7827168 | 2021-02-04 17:39:23 +0100 | [diff] [blame] | 255 | cc->tcg_ops = &alpha_tcg_ops; |
Andreas Färber | a0e372f | 2013-06-28 23:18:47 +0200 | [diff] [blame] | 256 | cc->gdb_num_core_regs = 67; |
Andreas Färber | 2b8c275 | 2013-01-21 18:26:21 +0100 | [diff] [blame] | 257 | } |
| 258 | |
Igor Mammedov | 73a25e8 | 2017-10-05 15:50:38 +0200 | [diff] [blame] | 259 | #define DEFINE_ALPHA_CPU_TYPE(base_type, cpu_model, initfn) \ |
| 260 | { \ |
| 261 | .parent = base_type, \ |
| 262 | .instance_init = initfn, \ |
| 263 | .name = ALPHA_CPU_TYPE_NAME(cpu_model), \ |
| 264 | } |
| 265 | |
| 266 | static const TypeInfo alpha_cpu_type_infos[] = { |
| 267 | { |
| 268 | .name = TYPE_ALPHA_CPU, |
| 269 | .parent = TYPE_CPU, |
| 270 | .instance_size = sizeof(AlphaCPU), |
| 271 | .instance_init = alpha_cpu_initfn, |
| 272 | .abstract = true, |
| 273 | .class_size = sizeof(AlphaCPUClass), |
| 274 | .class_init = alpha_cpu_class_init, |
| 275 | }, |
| 276 | DEFINE_ALPHA_CPU_TYPE(TYPE_ALPHA_CPU, "ev4", ev4_cpu_initfn), |
| 277 | DEFINE_ALPHA_CPU_TYPE(TYPE_ALPHA_CPU, "ev5", ev5_cpu_initfn), |
| 278 | DEFINE_ALPHA_CPU_TYPE(ALPHA_CPU_TYPE_NAME("ev5"), "ev56", ev56_cpu_initfn), |
| 279 | DEFINE_ALPHA_CPU_TYPE(ALPHA_CPU_TYPE_NAME("ev56"), "pca56", |
| 280 | pca56_cpu_initfn), |
| 281 | DEFINE_ALPHA_CPU_TYPE(TYPE_ALPHA_CPU, "ev6", ev6_cpu_initfn), |
| 282 | DEFINE_ALPHA_CPU_TYPE(ALPHA_CPU_TYPE_NAME("ev6"), "ev67", ev67_cpu_initfn), |
| 283 | DEFINE_ALPHA_CPU_TYPE(ALPHA_CPU_TYPE_NAME("ev67"), "ev68", NULL), |
Andreas Färber | 25ebd80 | 2012-04-06 19:46:48 +0200 | [diff] [blame] | 284 | }; |
| 285 | |
Igor Mammedov | 73a25e8 | 2017-10-05 15:50:38 +0200 | [diff] [blame] | 286 | DEFINE_TYPES(alpha_cpu_type_infos) |