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@…>, 5 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
RevLine 
[0ee077ee]1/*
[df4ed85]2 * Copyright (c) 2006 Jakub Jermar
[0ee077ee]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
[174156fd]29/** @addtogroup kernel_generic_mm
[b45c443]30 * @{
31 */
32
[0ee077ee]33/**
[b45c443]34 * @file
[d5bd8d7]35 * @brief Backend for address space areas backed by continuous physical
36 * memory.
[0ee077ee]37 */
38
[63e27ef]39#include <assert.h>
[e037cf37]40#include <ddi/ddi.h>
[d99c1d2]41#include <typedefs.h>
[0ee077ee]42#include <mm/as.h>
[41df2827]43#include <mm/page.h>
[0ee077ee]44#include <mm/frame.h>
[aafed15]45#include <stdlib.h>
[0ee077ee]46#include <macros.h>
47#include <arch.h>
48#include <align.h>
49
[03523dc]50static bool phys_create(as_area_t *);
[ceac698]51static void phys_share(as_area_t *);
[03523dc]52static void phys_destroy(as_area_t *);
53
[01029fc]54static bool phys_is_resizable(as_area_t *);
55static bool phys_is_shareable(as_area_t *);
56
[cda1378]57static int phys_page_fault(as_area_t *, uintptr_t, pf_access_t);
[0ee077ee]58
[83b6ba9f]59static bool phys_create_shared_data(as_area_t *);
60static void phys_destroy_shared_data(void *);
61
62typedef struct {
63 uintptr_t base;
[1b20da0]64 size_t frames;
[83b6ba9f]65} phys_shared_data_t;
66
[0ee077ee]67mem_backend_t phys_backend = {
[03523dc]68 .create = phys_create,
69 .resize = NULL,
70 .share = phys_share,
71 .destroy = phys_destroy,
72
[01029fc]73 .is_resizable = phys_is_resizable,
74 .is_shareable = phys_is_shareable,
75
[0ee077ee]76 .page_fault = phys_page_fault,
77 .frame_free = NULL,
[a35b458]78
[83b6ba9f]79 .create_shared_data = phys_create_shared_data,
80 .destroy_shared_data = phys_destroy_shared_data
[0ee077ee]81};
82
[03523dc]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{
[63e27ef]97 assert(mutex_locked(&area->as->lock));
98 assert(mutex_locked(&area->lock));
[03523dc]99}
100
101void phys_destroy(as_area_t *area)
102{
[83b6ba9f]103 /*
104 * The anonymous frames, if any, are released in
105 * phys_destroy_shared_data().
106 */
[e037cf37]107
108 /* Notify parea has been unmapped */
109 if (area->backend_data.parea != NULL)
110 ddi_parea_unmap_notify(area->backend_data.parea);
[03523dc]111}
112
[01029fc]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
[0ee077ee]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.
[59fb782]128 * @param upage Faulting virtual page.
[0ee077ee]129 * @param access Access mode that caused the fault (i.e. read/write/exec).
130 *
[d5bd8d7]131 * @return AS_PF_FAULT on failure (i.e. page fault) or AS_PF_OK on success (i.e.
132 * serviced).
[0ee077ee]133 */
[59fb782]134int phys_page_fault(as_area_t *area, uintptr_t upage, pf_access_t access)
[0ee077ee]135{
[7f1c620]136 uintptr_t base = area->backend_data.base;
[0ee077ee]137
[63e27ef]138 assert(page_table_locked(AS));
139 assert(mutex_locked(&area->lock));
140 assert(IS_ALIGNED(upage, PAGE_SIZE));
[1d432f9]141
[0ee077ee]142 if (!as_area_check_access(area, access))
143 return AS_PF_FAULT;
144
[63e27ef]145 assert(upage - area->base < area->backend_data.frames * FRAME_SIZE);
[59fb782]146 page_mapping_insert(AS, upage, base + (upage - area->base),
[d5bd8d7]147 as_area_get_flags(area));
[a35b458]148
[2fc3b2d]149 if (!used_space_insert(&area->used_space, upage, 1))
[a0ce870]150 panic("Cannot insert used space.");
[0ee077ee]151
152 return AS_PF_OK;
153}
154
[83b6ba9f]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
[11b285d]163 data = (phys_shared_data_t *) malloc(sizeof(*data));
[7473807]164 if (!data)
165 return false;
[83b6ba9f]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
[cc73a8a1]185/** @}
[b45c443]186 */
Note: See TracBrowser for help on using the repository browser.