/* * Mapping of DWARF debug register numbers into register names. * * Copyright (C) 2010 Ian Munsie, IBM Corporation. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. */ #include #include #include #include #include #include #include "util.h" struct pt_regs_dwarfnum { const char *name; unsigned int dwarfnum; unsigned int ptregs_offset; }; #define REG_DWARFNUM_NAME(r, num) \ {.name = STR(%)STR(r), .dwarfnum = num, \ .ptregs_offset = offsetof(struct pt_regs, r)} #define GPR_DWARFNUM_NAME(num) \ {.name = STR(%gpr##num), .dwarfnum = num, \ .ptregs_offset = offsetof(struct pt_regs, gpr[num])} #define REG_DWARFNUM_END {.name = NULL, .dwarfnum = 0, .ptregs_offset = 0} /* * Reference: * http://refspecs.linuxfoundation.org/ELF/ppc64/PPC-elf64abi-1.9.html */ static const struct pt_regs_dwarfnum regdwarfnum_table[] = { GPR_DWARFNUM_NAME(0), GPR_DWARFNUM_NAME(1), GPR_DWARFNUM_NAME(2), GPR_DWARFNUM_NAME(3), GPR_DWARFNUM_NAME(4), GPR_DWARFNUM_NAME(5), GPR_DWARFNUM_NAME(6), GPR_DWARFNUM_NAME(7), GPR_DWARFNUM_NAME(8), GPR_DWARFNUM_NAME(9), GPR_DWARFNUM_NAME(10), GPR_DWARFNUM_NAME(11), GPR_DWARFNUM_NAME(12), GPR_DWARFNUM_NAME(13), GPR_DWARFNUM_NAME(14), GPR_DWARFNUM_NAME(15), GPR_DWARFNUM_NAME(16), GPR_DWARFNUM_NAME(17), GPR_DWARFNUM_NAME(18), GPR_DWARFNUM_NAME(19), GPR_DWARFNUM_NAME(20), GPR_DWARFNUM_NAME(21), GPR_DWARFNUM_NAME(22), GPR_DWARFNUM_NAME(23), GPR_DWARFNUM_NAME(24), GPR_DWARFNUM_NAME(25), GPR_DWARFNUM_NAME(26), GPR_DWARFNUM_NAME(27), GPR_DWARFNUM_NAME(28), GPR_DWARFNUM_NAME(29), GPR_DWARFNUM_NAME(30), GPR_DWARFNUM_NAME(31), REG_DWARFNUM_NAME(msr, 66), REG_DWARFNUM_NAME(ctr, 109), REG_DWARFNUM_NAME(link, 108), REG_DWARFNUM_NAME(xer, 101), REG_DWARFNUM_NAME(dar, 119), REG_DWARFNUM_NAME(dsisr, 118), REG_DWARFNUM_END, }; /** * get_arch_regstr() - lookup register name from it's DWARF register number * @n: the DWARF register number * * get_arch_regstr() returns the name of the register in struct * regdwarfnum_table from it's DWARF register number. If the register is not * found in the table, this returns NULL; */ const char *get_arch_regstr(unsigned int n) { const struct pt_regs_dwarfnum *roff; for (roff = regdwarfnum_table; roff->name != NULL; roff++) if (roff->dwarfnum == n) return roff->name; return NULL; } int regs_query_register_offset(const char *name) { const struct pt_regs_dwarfnum *roff; for (roff = regdwarfnum_table; roff->name != NULL; roff++) if (!strcmp(roff->name, name)) return roff->ptregs_offset; return -EINVAL; } th: root/sound/soc/codecs
diff options
context:
space:
mode:
authorJan Kara <jack@suse.cz>2016-08-10 17:22:44 +0200
committerDan Williams <dan.j.williams@intel.com>2016-12-26 20:29:24 -0800
commitc6dcf52c23d2d3fb5235cec42d7dd3f786b87d55 (patch)
tree7e63a6c0225a769e679b194f54b5723e4cfba385 /sound/soc/codecs
parente568df6b84ff05a22467503afc11bee7a6ba0700 (diff)
mm: Invalidate DAX radix tree entries only if appropriate
Currently invalidate_inode_pages2_range() and invalidate_mapping_pages() just delete all exceptional radix tree entries they find. For DAX this is not desirable as we track cache dirtiness in these entries and when they are evicted, we may not flush caches although it is necessary. This can for example manifest when we write to the same block both via mmap and via write(2) (to different offsets) and fsync(2) then does not properly flush CPU caches when modification via write(2) was the last one. Create appropriate DAX functions to handle invalidation of DAX entries for invalidate_inode_pages2_range() and invalidate_mapping_pages() and wire them up into the corresponding mm functions. Acked-by: Johannes Weiner <hannes@cmpxchg.org> Reviewed-by: Ross Zwisler <ross.zwisler@linux.intel.com> Signed-off-by: Jan Kara <jack@suse.cz> Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Diffstat (limited to 'sound/soc/codecs')