source: mainline/arch/ia32/src/mm/page.c@ a7a10630

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since a7a10630 was a7a10630, checked in by Jakub Jermar <jakub@…>, 20 years ago

SMP recovery patch #2 (SMP is no longer broken !!!).
Fix missing KA2PA() operation in ap.S which was causing page faults during AP early initialization.
Fix bug in map_page_to_frame(): 'root' was interpretted as kernel address while read_dba() returns physical address.
Make references to page directory and page tables use kernel addresses instead of physical addresses.

Massive frame allocation code cleanup.
Basically revert to what we had had before implementation of userspace.

Usual cosmetics.

  • Property mode set to 100644
File size: 4.5 KB
Line 
1/*
2 * Copyright (C) 2001-2004 Jakub Jermar
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29#include <arch/types.h>
30#include <config.h>
31#include <func.h>
32#include <mm/frame.h>
33#include <mm/page.h>
34#include <arch/mm/page.h>
35#include <arch/interrupt.h>
36#include <arch/asm.h>
37#include <synch/spinlock.h>
38#include <debug.h>
39
40/*
41 * Note.
42 * This is the preliminary code for controlling paging mechanism on ia32. It is
43 * needed by other parts of the kernel for its ability to map virtual addresses
44 * to physical. SMP code relies on this feature. Other than that, this code is
45 * by no means meant to implement virtual memory in terms of swapping pages in
46 * and out.
47 */
48
49__address bootstrap_dba;
50
51void page_arch_init(void)
52{
53 __address dba;
54 __u32 i;
55
56 if (config.cpu_active == 1) {
57 dba = frame_alloc(FRAME_KA | FRAME_PANIC);
58 memsetb(dba, PAGE_SIZE, 0);
59
60 bootstrap_dba = dba;
61
62 /*
63 * Identity mapping for all but 0th page.
64 * PA2KA(identity) mapping for all but 0th page.
65 */
66 for (i = 1; i < frames; i++) {
67 map_page_to_frame(i * PAGE_SIZE, i * PAGE_SIZE, PAGE_CACHEABLE, KA2PA(dba));
68 map_page_to_frame(PA2KA(i * PAGE_SIZE), i * PAGE_SIZE, PAGE_CACHEABLE, KA2PA(dba));
69 }
70
71 trap_register(14, page_fault);
72 cpu_write_dba(KA2PA(dba));
73 }
74 else {
75 /*
76 * Application processors need to create their own view of the
77 * virtual address space. Because of that, each AP copies
78 * already-initialized paging information from the bootstrap
79 * processor and adjusts it to fulfill its needs.
80 */
81
82 dba = frame_alloc(FRAME_KA | FRAME_PANIC);
83 memcopy(bootstrap_dba, dba, PAGE_SIZE);
84 cpu_write_dba(KA2PA(dba));
85 }
86
87 paging_on();
88}
89
90/*
91 * Besides mapping pages to frames, this function also sets the present bit of
92 * the page's specifier in both page directory and respective page table. If
93 * the page table for this page has not been allocated so far, it will take
94 * care of it and allocate the necessary frame.
95 *
96 * PAGE_CACHEABLE flag: when set, it turns caches for that page on
97 * PAGE_NOT_PRESENT flag: when set, it marks the page not present
98 * PAGE_USER flag: when set, the page is accessible from userspace
99 *
100 * When the root parameter is non-zero, it is used as the page directory address.
101 * Otherwise, the page directory address is read from CPU.
102 */
103void map_page_to_frame(__address page, __address frame, int flags, __address root)
104{
105 struct page_specifier *pd, *pt;
106 __address dba, newpt;
107 int pde, pte;
108
109 if (root) dba = root;
110 else dba = cpu_read_dba();
111
112 pde = page >> 22; /* page directory entry */
113 pte = (page >> 12) & 0x3ff; /* page table entry */
114
115 pd = (struct page_specifier *) PA2KA(dba);
116
117 if (!pd[pde].present) {
118 /*
119 * There is currently no page table for this address. Allocate
120 * frame for the page table and clean it.
121 */
122 newpt = frame_alloc(FRAME_KA);
123 pd[pde].frame_address = KA2PA(newpt) >> 12;
124 memsetb(newpt, PAGE_SIZE, 0);
125 pd[pde].present = 1;
126 pd[pde].uaccessible = 1;
127 }
128
129 pt = (struct page_specifier *) PA2KA((pd[pde].frame_address << 12));
130
131 pt[pte].frame_address = frame >> 12;
132 pt[pte].present = !(flags & PAGE_NOT_PRESENT);
133 pt[pte].page_cache_disable = !(flags & PAGE_CACHEABLE);
134 pt[pte].uaccessible = (flags & PAGE_USER) != 0;
135 pt[pte].writeable = (flags & PAGE_WRITE) != 0;
136}
Note: See TracBrowser for help on using the repository browser.