OpenCores
URL https://opencores.org/ocsvn/or1k_old/or1k_old/trunk

Subversion Repositories or1k_old

[/] [or1k_old/] [trunk/] [rc203soc/] [sw/] [uClinux/] [arch/] [alpha/] [mm/] [init.c] - Blame information for rev 1782

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1622 jcastillo
/*
2
 *  linux/arch/alpha/mm/init.c
3
 *
4
 *  Copyright (C) 1995  Linus Torvalds
5
 */
6
 
7
#include <linux/config.h>
8
#include <linux/signal.h>
9
#include <linux/sched.h>
10
#include <linux/head.h>
11
#include <linux/kernel.h>
12
#include <linux/errno.h>
13
#include <linux/string.h>
14
#include <linux/types.h>
15
#include <linux/ptrace.h>
16
#include <linux/mman.h>
17
#include <linux/mm.h>
18
#include <linux/swap.h>
19
 
20
#include <asm/system.h>
21
#include <asm/segment.h>
22
#include <asm/pgtable.h>
23
#include <asm/hwrpb.h>
24
#include <asm/dma.h>
25
 
26
extern void die_if_kernel(char *,struct pt_regs *,long);
27
extern void show_net_buffers(void);
28
 
29
struct thread_struct * original_pcb_ptr;
30
 
31
/*
32
 * BAD_PAGE is the page that is used for page faults when linux
33
 * is out-of-memory. Older versions of linux just did a
34
 * do_exit(), but using this instead means there is less risk
35
 * for a process dying in kernel mode, possibly leaving a inode
36
 * unused etc..
37
 *
38
 * BAD_PAGETABLE is the accompanying page-table: it is initialized
39
 * to point to BAD_PAGE entries.
40
 *
41
 * ZERO_PAGE is a special page that is used for zero-initialized
42
 * data and COW.
43
 */
44
pmd_t * __bad_pagetable(void)
45
{
46
        memset((void *) EMPTY_PGT, 0, PAGE_SIZE);
47
        return (pmd_t *) EMPTY_PGT;
48
}
49
 
50
pte_t __bad_page(void)
51
{
52
        memset((void *) EMPTY_PGE, 0, PAGE_SIZE);
53
        return pte_mkdirty(mk_pte((unsigned long) EMPTY_PGE, PAGE_SHARED));
54
}
55
 
56
void show_mem(void)
57
{
58
        int i,free = 0,total = 0,reserved = 0;
59
        int shared = 0;
60
 
61
        printk("\nMem-info:\n");
62
        show_free_areas();
63
        printk("Free swap:       %6dkB\n",nr_swap_pages<<(PAGE_SHIFT-10));
64
        i = MAP_NR(high_memory);
65
        while (i-- > 0) {
66
                total++;
67
                if (PageReserved(mem_map+i))
68
                        reserved++;
69
                else if (!mem_map[i].count)
70
                        free++;
71
                else
72
                        shared += mem_map[i].count-1;
73
        }
74
        printk("%d pages of RAM\n",total);
75
        printk("%d free pages\n",free);
76
        printk("%d reserved pages\n",reserved);
77
        printk("%d pages shared\n",shared);
78
        show_buffers();
79
#ifdef CONFIG_NET
80
        show_net_buffers();
81
#endif
82
}
83
 
84
extern unsigned long free_area_init(unsigned long, unsigned long);
85
 
86
static struct thread_struct * load_PCB(struct thread_struct * pcb)
87
{
88
        struct thread_struct *old_pcb;
89
 
90
        __asm__ __volatile__(
91
                "stq $30,0(%1)\n\t"
92
                "bis %1,%1,$16\n\t"
93
                "call_pal %2\n\t"
94
                "bis $0,$0,%0"
95
                : "=r" (old_pcb)
96
                : "r" (pcb), "i" (PAL_swpctx)
97
                : "$0", "$1", "$16", "$22", "$23", "$24", "$25");
98
        return old_pcb;
99
}
100
 
101
/*
102
 * paging_init() sets up the page tables: in the alpha version this actually
103
 * unmaps the bootup page table (as we're now in KSEG, so we don't need it).
104
 */
105
unsigned long paging_init(unsigned long start_mem, unsigned long end_mem)
106
{
107
        int i;
108
        unsigned long newptbr;
109
        struct memclust_struct * cluster;
110
        struct memdesc_struct * memdesc;
111
 
112
        /* initialize mem_map[] */
113
        start_mem = free_area_init(start_mem, end_mem);
114
 
115
        /* find free clusters, update mem_map[] accordingly */
116
        memdesc = (struct memdesc_struct *)
117
                (INIT_HWRPB->mddt_offset + (unsigned long) INIT_HWRPB);
118
        cluster = memdesc->cluster;
119
        for (i = memdesc->numclusters ; i > 0; i--, cluster++) {
120
                unsigned long pfn, nr;
121
#if 0
122
printk("paging_init: cluster %d usage %ld start %ld size %ld\n",
123
       i, cluster->usage, cluster->start_pfn, cluster->numpages);
124
#endif
125
                if (cluster->usage & 1)
126
                        continue;
127
                pfn = cluster->start_pfn;
128
                nr = cluster->numpages;
129
 
130
                /* non-volatile memory. We might want to mark this for later */
131
                if (cluster->usage & 2)
132
                        continue;
133
 
134
                while (nr--)
135
                        clear_bit(PG_reserved, &mem_map[pfn++].flags);
136
        }
137
 
138
        /* unmap the console stuff: we don't need it, and we don't want it */
139
        /* Also set up the real kernel PCB while we're at it.. */
140
        memset((void *) ZERO_PAGE, 0, PAGE_SIZE);
141
        memset(swapper_pg_dir, 0, PAGE_SIZE);
142
        newptbr = ((unsigned long) swapper_pg_dir - PAGE_OFFSET) >> PAGE_SHIFT;
143
        pgd_val(swapper_pg_dir[1023]) = (newptbr << 32) | pgprot_val(PAGE_KERNEL);
144
        init_task.tss.ptbr = newptbr;
145
        init_task.tss.pal_flags = 1;    /* set FEN, clear everything else */
146
        init_task.tss.flags = 0;
147
        init_task.kernel_stack_page = INIT_STACK;
148
        original_pcb_ptr = load_PCB(&init_task.tss);
149
 
150
        flush_tlb_all();
151
        return start_mem;
152
}
153
 
154
void mem_init(unsigned long start_mem, unsigned long end_mem)
155
{
156
        unsigned long tmp;
157
 
158
        end_mem &= PAGE_MASK;
159
        high_memory = end_mem;
160
        start_mem = PAGE_ALIGN(start_mem);
161
 
162
        /*
163
         * Mark the pages used by the kernel as reserved..
164
         */
165
        tmp = KERNEL_START;
166
        while (tmp < start_mem) {
167
                set_bit(PG_reserved, &mem_map[MAP_NR(tmp)].flags);
168
                tmp += PAGE_SIZE;
169
        }
170
 
171
        for (tmp = PAGE_OFFSET ; tmp < high_memory ; tmp += PAGE_SIZE) {
172
                if (tmp >= MAX_DMA_ADDRESS)
173
                        clear_bit(PG_DMA, &mem_map[MAP_NR(tmp)].flags);
174
                if (PageReserved(mem_map+MAP_NR(tmp)))
175
                        continue;
176
                mem_map[MAP_NR(tmp)].count = 1;
177
                free_page(tmp);
178
        }
179
        tmp = nr_free_pages << PAGE_SHIFT;
180
        printk("Memory: %luk available\n", tmp >> 10);
181
        return;
182
}
183
 
184
void si_meminfo(struct sysinfo *val)
185
{
186
        int i;
187
 
188
        i = MAP_NR(high_memory);
189
        val->totalram = 0;
190
        val->sharedram = 0;
191
        val->freeram = nr_free_pages << PAGE_SHIFT;
192
        val->bufferram = buffermem;
193
        while (i-- > 0)  {
194
                if (PageReserved(mem_map+i))
195
                        continue;
196
                val->totalram++;
197
                if (!mem_map[i].count)
198
                        continue;
199
                val->sharedram += mem_map[i].count-1;
200
        }
201
        val->totalram <<= PAGE_SHIFT;
202
        val->sharedram <<= PAGE_SHIFT;
203
        return;
204
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.