Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 25956
b: refs/heads/master
c: 193dd2c
h: refs/heads/master
v: v3
  • Loading branch information
Ralf Baechle committed Apr 19, 2006
1 parent faa79e6 commit 0cde7b9
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 24 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 62a442155ea58a17497b487324b27ec2f2dc5c5c
refs/heads/master: 193dd2ce2a4a1c5b2e7814544572424d497069db
41 changes: 18 additions & 23 deletions trunk/arch/mips/kernel/traps.c
Original file line number Diff line number Diff line change
Expand Up @@ -961,15 +961,19 @@ void *set_except_vector(int n, void *addr)

#ifdef CONFIG_CPU_MIPSR2
/*
* Shadow register allocation
* MIPSR2 shadow register set allocation
* FIXME: SMP...
*/

/* MIPSR2 shadow register sets */
struct shadow_registers {
spinlock_t sr_lock; /* */
int sr_supported; /* Number of shadow register sets supported */
int sr_allocated; /* Bitmap of allocated shadow registers */
static struct shadow_registers {
/*
* Number of shadow register sets supported
*/
unsigned long sr_supported;
/*
* Bitmap of allocated shadow registers
*/
unsigned long sr_allocated;
} shadow_registers;

void mips_srs_init(void)
Expand All @@ -980,7 +984,6 @@ void mips_srs_init(void)
shadow_registers.sr_supported);
#endif
shadow_registers.sr_allocated = 1; /* Set 0 used by kernel */
spin_lock_init(&shadow_registers.sr_lock);
}

int mips_srs_max(void)
Expand All @@ -991,32 +994,24 @@ int mips_srs_max(void)
int mips_srs_alloc(void)
{
struct shadow_registers *sr = &shadow_registers;
unsigned long flags;
int set;

spin_lock_irqsave(&sr->sr_lock, flags);
again:
set = find_first_zero_bit(&sr->sr_allocated, sr->sr_supported);
if (set >= sr->sr_supported)
return -1;

for (set = 0; set < sr->sr_supported; set++) {
if ((sr->sr_allocated & (1 << set)) == 0) {
sr->sr_allocated |= 1 << set;
spin_unlock_irqrestore(&sr->sr_lock, flags);
return set;
}
}
if (test_and_set_bit(set, &sr->sr_allocated))
goto again;

/* None available */
spin_unlock_irqrestore(&sr->sr_lock, flags);
return -1;
return set;
}

void mips_srs_free (int set)
{
struct shadow_registers *sr = &shadow_registers;
unsigned long flags;

spin_lock_irqsave(&sr->sr_lock, flags);
sr->sr_allocated &= ~(1 << set);
spin_unlock_irqrestore(&sr->sr_lock, flags);
clear_bit(set, &sr->sr_allocated);
}

static void *set_vi_srs_handler(int n, void *addr, int srs)
Expand Down

0 comments on commit 0cde7b9

Please sign in to comment.