#include "entry.h"
#include "unwind_i.h"
-#define MIN(a,b) ((a) < (b) ? (a) : (b))
#define p5 5
#define UNW_LOG_CACHE_SIZE 7 /* each unw_script is ~256 bytes in size */
int
unw_access_fr (struct unw_frame_info *info, int regnum, struct ia64_fpreg *val, int write)
{
- struct ia64_fpreg *addr = 0;
+ struct ia64_fpreg *addr = NULL;
struct pt_regs *pt;
if ((unsigned) (regnum - 2) >= 126) {
}
sr->gr_save_loc = grsave;
sr->any_spills = 0;
- sr->imask = 0;
+ sr->imask = NULL;
sr->spill_offset = 0x10; /* default to psp+16 */
}
}
desc_mem_stack_f (unw_word t, unw_word size, struct unw_state_record *sr)
{
set_reg(sr->curr.reg + UNW_REG_PSP, UNW_WHERE_NONE,
- sr->region_start + MIN((int)t, sr->region_len - 1), 16*size);
+ sr->region_start + min_t(int, t, sr->region_len - 1), 16*size);
}
static inline void
desc_mem_stack_v (unw_word t, struct unw_state_record *sr)
{
- sr->curr.reg[UNW_REG_PSP].when = sr->region_start + MIN((int)t, sr->region_len - 1);
+ sr->curr.reg[UNW_REG_PSP].when = sr->region_start + min_t(int, t, sr->region_len - 1);
}
static inline void
if (reg->where == UNW_WHERE_NONE)
reg->where = UNW_WHERE_GR_SAVE;
- reg->when = sr->region_start + MIN((int)t, sr->region_len - 1);
+ reg->when = sr->region_start + min_t(int, t, sr->region_len - 1);
}
static inline void
static inline int
desc_is_active (unsigned char qp, unw_word t, struct unw_state_record *sr)
{
- if (sr->when_target <= sr->region_start + MIN((int)t, sr->region_len - 1))
+ if (sr->when_target <= sr->region_start + min_t(int, t, sr->region_len - 1))
return 0;
if (qp > 0) {
if ((sr->pr_val & (1UL << qp)) == 0)
r = sr->curr.reg + decode_abreg(abreg, 0);
r->where = where;
- r->when = sr->region_start + MIN((int)t, sr->region_len - 1);
+ r->when = sr->region_start + min_t(int, t, sr->region_len - 1);
r->val = (ytreg & 0x7f);
}
r = sr->curr.reg + decode_abreg(abreg, 1);
r->where = UNW_WHERE_PSPREL;
- r->when = sr->region_start + MIN((int)t, sr->region_len - 1);
+ r->when = sr->region_start + min_t(int, t, sr->region_len - 1);
r->val = 0x10 - 4*pspoff;
}
r = sr->curr.reg + decode_abreg(abreg, 1);
r->where = UNW_WHERE_SPREL;
- r->when = sr->region_start + MIN((int)t, sr->region_len - 1);
+ r->when = sr->region_start + min_t(int, t, sr->region_len - 1);
r->val = 4*spoff;
}
static inline unw_hash_index_t
hash (unsigned long ip)
{
-# define hashmagic 0x9e3779b97f4a7c16 /* based on (sqrt(5)/2-1)*2^64 */
+# define hashmagic 0x9e3779b97f4a7c16UL /* based on (sqrt(5)/2-1)*2^64 */
return (ip >> 4)*hashmagic >> (64 - UNW_LOG_HASH_SIZE);
#undef hashmagic
unsigned long ip, pr;
if (UNW_DEBUG_ON(0))
- return 0; /* Always regenerate scripts in debug mode */
+ return NULL; /* Always regenerate scripts in debug mode */
STAT(++unw.stat.cache.lookups);
index = unw.hash[hash(ip)];
if (index >= UNW_CACHE_SIZE)
- return 0;
+ return NULL;
script = unw.cache + index;
while (1) {
return script;
}
if (script->coll_chain >= UNW_HASH_SIZE)
- return 0;
+ return NULL;
script = unw.cache + script->coll_chain;
STAT(++unw.stat.cache.collision_chain_traversals);
}
if (script->ip) {
index = hash(script->ip);
tmp = unw.cache + unw.hash[index];
- prev = 0;
+ prev = NULL;
while (1) {
if (tmp == script) {
if (prev)
static inline const struct unw_table_entry *
lookup (struct unw_table *table, unsigned long rel_ip)
{
- const struct unw_table_entry *e = 0;
+ const struct unw_table_entry *e = NULL;
unsigned long lo, hi, mid;
/* do a binary search for right entry: */
static inline struct unw_script *
build_script (struct unw_frame_info *info)
{
- const struct unw_table_entry *e = 0;
- struct unw_script *script = 0;
+ const struct unw_table_entry *e = NULL;
+ struct unw_script *script = NULL;
struct unw_labeled_state *ls, *next;
unsigned long ip = info->ip;
struct unw_state_record sr;
if (!script) {
UNW_DPRINT(0, "unwind.%s: failed to create unwind script\n", __FUNCTION__);
STAT(unw.stat.script.build_time += ia64_get_itc() - start);
- return 0;
+ return NULL;
}
unw.cache[info->prev_script].hint = script - unw.cache;
/* don't let obviously bad addresses pollute the cache */
/* FIXME: should really be level 0 but it occurs too often. KAO */
UNW_DPRINT(1, "unwind.%s: rejecting bad ip=0x%lx\n", __FUNCTION__, info->ip);
- info->rp_loc = 0;
+ info->rp_loc = NULL;
return -1;
}
if (end - start <= 0) {
UNW_DPRINT(0, "unwind.%s: ignoring attempt to insert empty unwind table\n",
__FUNCTION__);
- return 0;
+ return NULL;
}
table = kmalloc(sizeof(*table), GFP_USER);
if (!table)
- return 0;
+ return NULL;
init_unwind_table(table, name, segment_base, gp, table_start, table_end);
* EFAULT BUF points outside your accessible address space.
*/
asmlinkage long
-sys_getunwind (void *buf, size_t buf_size)
+sys_getunwind (void __user *buf, size_t buf_size)
{
if (buf && buf_size >= unw.gate_table_size)
if (copy_to_user(buf, unw.gate_table, unw.gate_table_size) != 0)