source: mainline/kernel/generic/src/mm/backend_phys.c@ e037cf37

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since e037cf37 was e037cf37, checked in by Jiri Svoboda <jiri@…>, 4 years ago

Show kernel console again when its physical area is unmapped

It's good to be able to see the stack trace if e.g. display server
crashes.

  • Property mode set to 100644
File size: 4.9 KB
Line 
1/*
2 * Copyright (c) 2006 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/** @addtogroup kernel_generic_mm
30 * @{
31 */
32
33/**
34 * @file
35 * @brief Backend for address space areas backed by continuous physical
36 * memory.
37 */
38
39#include <assert.h>
40#include <ddi/ddi.h>
41#include <typedefs.h>
42#include <mm/as.h>
43#include <mm/page.h>
44#include <mm/frame.h>
45#include <stdlib.h>
46#include <macros.h>
47#include <arch.h>
48#include <align.h>
49
50static bool phys_create(as_area_t *);
51static void phys_share(as_area_t *);
52static void phys_destroy(as_area_t *);
53
54static bool phys_is_resizable(as_area_t *);
55static bool phys_is_shareable(as_area_t *);
56
57static int phys_page_fault(as_area_t *, uintptr_t, pf_access_t);
58
59static bool phys_create_shared_data(as_area_t *);
60static void phys_destroy_shared_data(void *);
61
62typedef struct {
63 uintptr_t base;
64 size_t frames;
65} phys_shared_data_t;
66
67mem_backend_t phys_backend = {
68 .create = phys_create,
69 .resize = NULL,
70 .share = phys_share,
71 .destroy = phys_destroy,
72
73 .is_resizable = phys_is_resizable,
74 .is_shareable = phys_is_shareable,
75
76 .page_fault = phys_page_fault,
77 .frame_free = NULL,
78
79 .create_shared_data = phys_create_shared_data,
80 .destroy_shared_data = phys_destroy_shared_data
81};
82
83bool phys_create(as_area_t *area)
84{
85 return true;
86}
87
88/** Share address space area backed by physical memory.
89 *
90 * Do actually nothing as sharing of address space areas
91 * that are backed up by physical memory is very easy.
92 * Note that the function must be defined so that
93 * as_area_share() will succeed.
94 */
95void phys_share(as_area_t *area)
96{
97 assert(mutex_locked(&area->as->lock));
98 assert(mutex_locked(&area->lock));
99}
100
101void phys_destroy(as_area_t *area)
102{
103 /*
104 * The anonymous frames, if any, are released in
105 * phys_destroy_shared_data().
106 */
107
108 /* Notify parea has been unmapped */
109 if (area->backend_data.parea != NULL)
110 ddi_parea_unmap_notify(area->backend_data.parea);
111}
112
113bool phys_is_resizable(as_area_t *area)
114{
115 return false;
116}
117
118bool phys_is_shareable(as_area_t *area)
119{
120 return true;
121}
122
123/** Service a page fault in the address space area backed by physical memory.
124 *
125 * The address space area and page tables must be already locked.
126 *
127 * @param area Pointer to the address space area.
128 * @param upage Faulting virtual page.
129 * @param access Access mode that caused the fault (i.e. read/write/exec).
130 *
131 * @return AS_PF_FAULT on failure (i.e. page fault) or AS_PF_OK on success (i.e.
132 * serviced).
133 */
134int phys_page_fault(as_area_t *area, uintptr_t upage, pf_access_t access)
135{
136 uintptr_t base = area->backend_data.base;
137
138 assert(page_table_locked(AS));
139 assert(mutex_locked(&area->lock));
140 assert(IS_ALIGNED(upage, PAGE_SIZE));
141
142 if (!as_area_check_access(area, access))
143 return AS_PF_FAULT;
144
145 assert(upage - area->base < area->backend_data.frames * FRAME_SIZE);
146 page_mapping_insert(AS, upage, base + (upage - area->base),
147 as_area_get_flags(area));
148
149 if (!used_space_insert(&area->used_space, upage, 1))
150 panic("Cannot insert used space.");
151
152 return AS_PF_OK;
153}
154
155bool phys_create_shared_data(as_area_t *area)
156{
157 /*
158 * For anonymous phys areas, create the shared data.
159 */
160 if (area->backend_data.anonymous) {
161 phys_shared_data_t *data;
162
163 data = (phys_shared_data_t *) malloc(sizeof(*data));
164 if (!data)
165 return false;
166
167 data->base = area->backend_data.base;
168 data->frames = area->backend_data.frames;
169 area->sh_info->backend_shared_data = data;
170 }
171
172 return true;
173}
174
175void phys_destroy_shared_data(void *opaque_data)
176{
177 phys_shared_data_t *data = (phys_shared_data_t *) opaque_data;
178
179 if (data) {
180 frame_free(data->base, data->frames);
181 free(data);
182 }
183}
184
185/** @}
186 */
Note: See TracBrowser for help on using the repository browser.