blob: cbc56aedf13e3eb1e3c2283f2db4c1babdc4ada1 [file] [log] [blame]
Chris Zankel3f65ce42005-06-23 22:01:24 -07001/*
2 * arch/xtensa/mm/fault.c
3 *
4 * This file is subject to the terms and conditions of the GNU General Public
5 * License. See the file "COPYING" in the main directory of this archive
6 * for more details.
7 *
8 * Copyright (C) 2001 - 2005 Tensilica Inc.
9 *
10 * Chris Zankel <chris@zankel.net>
11 */
12
13#if (DCACHE_SIZE > PAGE_SIZE)
14
15pte_t* pte_alloc_one_kernel(struct mm_struct *mm, unsigned long address)
16{
Nick Piggin8e7a9aa2006-03-22 00:08:04 -080017 pte_t *pte = NULL, *p;
Chris Zankel3f65ce42005-06-23 22:01:24 -070018 int color = ADDR_COLOR(address);
19 int i;
20
21 p = (pte_t*) __get_free_pages(GFP_KERNEL|__GFP_REPEAT, COLOR_ORDER);
22
23 if (likely(p)) {
24 struct page *page;
25
Nick Piggin8e7a9aa2006-03-22 00:08:04 -080026 for (i = 0; i < COLOR_SIZE; i++) {
27 page = virt_to_page(p);
Chris Zankel3f65ce42005-06-23 22:01:24 -070028
29 set_page_count(page, 1);
Chris Zankel3f65ce42005-06-23 22:01:24 -070030
31 if (ADDR_COLOR(p) == color)
32 pte = p;
33 else
34 free_page(p);
Nick Piggin8e7a9aa2006-03-22 00:08:04 -080035 p += PTRS_PER_PTE;
Chris Zankel3f65ce42005-06-23 22:01:24 -070036 }
37 clear_page(pte);
38 }
39 return pte;
40}
41
42#ifdef PROFILING
43
44int mask;
45int hit;
46int flush;
47
48#endif
49
50struct page* pte_alloc_one(struct mm_struct *mm, unsigned long address)
51{
Nick Piggin8e7a9aa2006-03-22 00:08:04 -080052 struct page *page = NULL, *p;
Chris Zankel3f65ce42005-06-23 22:01:24 -070053 int color = ADDR_COLOR(address);
54
55 p = alloc_pages(GFP_KERNEL | __GFP_REPEAT, PTE_ORDER);
56
57 if (likely(p)) {
58 for (i = 0; i < PAGE_ORDER; i++) {
59 set_page_count(p, 1);
Chris Zankel3f65ce42005-06-23 22:01:24 -070060
Nick Piggin8e7a9aa2006-03-22 00:08:04 -080061 if (PADDR_COLOR(page_address(p)) == color)
Chris Zankel3f65ce42005-06-23 22:01:24 -070062 page = p;
63 else
Nick Piggin8e7a9aa2006-03-22 00:08:04 -080064 __free_page(p);
65 p++;
Chris Zankel3f65ce42005-06-23 22:01:24 -070066 }
67 clear_highpage(page);
68 }
69
70 return page;
71}
72
73#endif
74
75
76