]>
Commit | Line | Data |
---|---|---|
1da177e4 | 1 | /* |
d84b4711 | 2 | * linux/arch/arm/mm/context.c |
1da177e4 LT |
3 | * |
4 | * Copyright (C) 2002-2003 Deep Blue Solutions Ltd, all rights reserved. | |
5 | * | |
6 | * This program is free software; you can redistribute it and/or modify | |
7 | * it under the terms of the GNU General Public License version 2 as | |
8 | * published by the Free Software Foundation. | |
9 | */ | |
10 | #include <linux/init.h> | |
11 | #include <linux/sched.h> | |
12 | #include <linux/mm.h> | |
13 | ||
14 | #include <asm/mmu_context.h> | |
15 | #include <asm/tlbflush.h> | |
16 | ||
17 | unsigned int cpu_last_asid = { 1 << ASID_BITS }; | |
18 | ||
19 | /* | |
20 | * We fork()ed a process, and we need a new context for the child | |
21 | * to run in. We reserve version 0 for initial tasks so we will | |
22 | * always allocate an ASID. | |
23 | */ | |
24 | void __init_new_context(struct task_struct *tsk, struct mm_struct *mm) | |
25 | { | |
26 | mm->context.id = 0; | |
27 | } | |
28 | ||
29 | void __new_context(struct mm_struct *mm) | |
30 | { | |
31 | unsigned int asid; | |
32 | ||
33 | asid = ++cpu_last_asid; | |
34 | if (asid == 0) | |
35 | asid = cpu_last_asid = 1 << ASID_BITS; | |
36 | ||
37 | /* | |
38 | * If we've used up all our ASIDs, we need | |
39 | * to start a new version and flush the TLB. | |
40 | */ | |
41 | if ((asid & ~ASID_MASK) == 0) | |
42 | flush_tlb_all(); | |
43 | ||
44 | mm->context.id = asid; | |
45 | } |