Changeset fcacfb7 in mainline
- Timestamp:
- 2005-09-20T22:52:05Z (19 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 84dd253
- Parents:
- e456008
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
include/mm/frame.h
re456008 rfcacfb7 78 78 extern void frame_region_not_free(__address start, __address stop); 79 79 80 extern void zone_init(void); 81 extern zone_t *zone_create(__address start, size_t size, int flags); 82 extern void zone_attach(zone_t *zone); 83 84 extern void frame_initialize(frame_t *frame, zone_t *zone); 85 extern __address frame_get_address(frame_t *frame); 86 80 87 /* 81 88 * TODO: Implement the following functions. 82 89 */ 83 90 84 extern void zone_init(void);85 extern zone_t *zone_create(__address start, size_t size, int flags);86 extern void zone_attach(zone_t *zone);87 88 91 /* 89 92 extern frame_t *frame_alloc(int flags); 90 93 extern void frame_free(frame_t *frame); 91 94 */ 92 extern void frame_initialize(frame_t *frame);93 extern __address frame_get_address(frame_t *frame);94 95 extern frame_t *frame_reference(frame_t *frame); 95 96 extern void frame_release(frame_t *frame); -
src/mm/frame.c
re456008 rfcacfb7 40 40 41 41 #include <panic.h> 42 #include <debug.h> 42 43 43 44 #include <synch/spinlock.h> … … 54 55 static spinlock_t framelock; 55 56 57 spinlock_t zone_head_lock; /**< this lock protects zone_head list */ 58 link_t zone_head; /**< list of all zones in the system */ 59 60 56 61 void frame_init(void) 57 62 { 58 63 if (config.cpu_active == 1) { 64 zone_init(); 59 65 60 66 /* … … 199 205 frame_not_free(a * FRAME_SIZE); 200 206 } 207 208 /** Initialize zonekeeping 209 * 210 * Initialize zonekeeping. 211 */ 212 void zone_init(void) 213 { 214 spinlock_initialize(&zone_head_lock); 215 list_initialize(&zone_head); 216 } 217 218 /** Create frame zone 219 * 220 * Create new frame zone. 221 * 222 * @param start Physical address of the first frame within the zone. 223 * @param size Size of the zone. Must be a multiple of FRAME_SIZE. 224 * @param flags Zone flags. 225 * 226 * @return Initialized zone. 227 */ 228 zone_t *zone_create(__address start, size_t size, int flags) 229 { 230 zone_t *z; 231 count_t cnt; 232 int i; 233 234 ASSERT(start % FRAME_SIZE == 0); 235 ASSERT(size % FRAME_SIZE == 0); 236 237 cnt = size / FRAME_SIZE; 238 239 z = (zone_t *) malloc(sizeof(zone_t)); 240 if (z) { 241 link_initialize(&z->link); 242 spinlock_initialize(&z->lock); 243 244 z->base = start; 245 z->flags = flags; 246 247 z->free_count = cnt; 248 list_initialize(&z->free_head); 249 250 z->busy_count = 0; 251 list_initialize(&z->busy_head); 252 253 z->frames = (frame_t *) malloc(cnt * sizeof(frame_t)); 254 if (!z->frames) { 255 free(z); 256 return NULL; 257 } 258 259 for (i = 0; i<cnt; i++) { 260 frame_initialize(&z->frames[i], z); 261 list_append(&z->frames[i].link, &z->free_head); 262 } 263 264 } 265 266 return z; 267 } 268 269 /** Attach frame zone 270 * 271 * Attach frame zone to zone list. 272 * 273 * @param zone Zone to be attached. 274 */ 275 void zone_attach(zone_t *zone) 276 { 277 pri_t pri; 278 279 pri = cpu_priority_high(); 280 spinlock_lock(&zone_head_lock); 281 282 list_append(&zone->link, &zone_head); 283 284 spinlock_unlock(&zone_head_lock); 285 cpu_priority_restore(pri); 286 } 287 288 /** Initialize frame structure 289 * 290 * Initialize frame structure. 291 * 292 * @param frame Frame structure to be initialized. 293 * @param zone Host frame zone. 294 */ 295 void frame_initialize(frame_t *frame, zone_t *zone) 296 { 297 frame->refcount = 0; 298 link_initialize(&frame->link); 299 frame->zone = zone; 300 } 301 302 /** Get address of physical frame from its frame structure 303 * 304 * Get address of physical frame from its frame structure. 305 * 306 * @param frame Frame structure of the queried frame address. 307 * 308 * @return Address of frame associated with the argument. 309 */ 310 __address frame_get_address(frame_t *frame) 311 { 312 __address v; 313 zone_t *z; 314 pri_t pri; 315 316 z = frame->zone; 317 318 pri = cpu_priority_high(); 319 spinlock_lock(&z->lock); 320 321 v = z->base + (frame - z->frames) * FRAME_SIZE; 322 323 if (z->flags & FRAME_KA) 324 v = PA2KA(v); 325 326 spinlock_unlock(&z->lock); 327 cpu_priority_restore(pri); 328 329 return v; 330 }
Note:
See TracChangeset
for help on using the changeset viewer.