Changeset deaf8d5 in mainline
- Timestamp:
- 2008-06-22T19:21:07Z (17 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 08a19ba
- Parents:
- 69eac4aa
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/mm/frame.c
r69eac4aa rdeaf8d5 130 130 } 131 131 132 /** Initialize frame structure 133 * 134 * Initialize frame structure. 135 * 136 * @param frame Frame structure to be initialized. 132 /** Initialize frame structure. 133 * 134 * @param framei Frame structure to be initialized. 137 135 */ 138 136 static void frame_initialize(frame_t *frame) … … 146 144 /**********************/ 147 145 148 /** 149 * Insert-sort zone into zones list 150 * 151 * @param newzone New zone to be inserted into zone list 152 * @return zone number on success, -1 on error 146 /** Insert-sort zone into zones list. 147 * 148 * @param newzone New zone to be inserted into zone list. 149 * @return Zone number on success, -1 on error. 153 150 */ 154 151 static int zones_add_zone(zone_t *newzone) … … 172 169 /* Check for overflow */ 173 170 z = zones.info[i]; 174 if (overlaps(newzone->base, newzone->count, z->base, z->count)) { 171 if (overlaps(newzone->base, newzone->count, z->base, 172 z->count)) { 175 173 printf("Zones overlap!\n"); 176 174 return -1; … … 194 192 195 193 /** 196 * Try to find a zone where can we find the frame 194 * Try to find a zone where can we find the frame. 197 195 * 198 196 * Assume interrupts are disabled. 199 197 * 200 * @param frame Frame number contained in zone201 * @param pzone If not null, it is used as zone hint. Zone index202 * isfilled into the variable on success.203 * @return Pointer to locked zone containing frame204 */ 205 static zone_t * 198 * @param frame Frame number contained in zone. 199 * @param pzone If not null, it is used as zone hint. Zone index is 200 * filled into the variable on success. 201 * @return Pointer to locked zone containing frame. 202 */ 203 static zone_t *find_zone_and_lock(pfn_t frame, unsigned int *pzone) 206 204 { 207 205 unsigned int i; … … 246 244 * Assume interrupts are disabled. 247 245 * 248 * @param order Size (2^order) of free space we are trying to find249 * @param pzone Pointer to preferred zone or NULL, on return contains zone250 * number251 */ 252 static zone_t * 246 * @param order Size (2^order) of free space we are trying to find. 247 * @param pzone Pointer to preferred zone or NULL, on return contains 248 * zone number. 249 */ 250 static zone_t *find_free_zone_and_lock(uint8_t order, unsigned int *pzone) 253 251 { 254 252 unsigned int i; … … 284 282 /**************************/ 285 283 286 /** Buddy system find_block implementation 284 /** Buddy system find_block implementation. 287 285 * 288 286 * Find block that is parent of current list. 289 287 * That means go to lower addresses, until such block is found 290 288 * 291 * @param order - Order of parent must be different then this parameter!! 289 * @param order Order of parent must be different then this 290 * parameter!! 292 291 */ 293 292 static link_t *zone_buddy_find_block(buddy_system_t *b, link_t *child, … … 322 321 } 323 322 324 /** Buddy system find_buddy implementation 325 * 326 * @param b 327 * @param block Block for which buddy should be found328 * 329 * @return Buddy for given block if found323 /** Buddy system find_buddy implementation. 324 * 325 * @param b Buddy system. 326 * @param block Block for which buddy should be found. 327 * 328 * @return Buddy for given block if found. 330 329 */ 331 330 static link_t *zone_buddy_find_buddy(buddy_system_t *b, link_t *block) … … 346 345 ASSERT(is_left ^ is_right); 347 346 if (is_left) { 348 index = (frame_index(zone, frame)) + (1 << frame->buddy_order); 347 index = (frame_index(zone, frame)) + 348 (1 << frame->buddy_order); 349 349 } else { /* if (is_right) */ 350 index = (frame_index(zone, frame)) - (1 << frame->buddy_order); 350 index = (frame_index(zone, frame)) - 351 (1 << frame->buddy_order); 351 352 } 352 353 … … 361 362 } 362 363 363 /** Buddy system bisect implementation 364 * 365 * @param b Buddy system. 366 * @param block Block to bisect 367 * 368 * @return right block 369 */ 370 static link_t * zone_buddy_bisect(buddy_system_t *b, link_t *block) { 364 /** Buddy system bisect implementation. 365 * 366 * @param b Buddy system. 367 * @param block Block to bisect. 368 * 369 * @return Right block. 370 */ 371 static link_t *zone_buddy_bisect(buddy_system_t *b, link_t *block) 372 { 371 373 frame_t *frame_l, *frame_r; 372 374 … … 377 379 } 378 380 379 /** Buddy system coalesce implementation 380 * 381 * @param b Buddy system. 382 * @param block_1 First block 383 * @param block_2 First block's buddy 384 * 385 * @return Coalesced block (actually block that represents lower address) 381 /** Buddy system coalesce implementation. 382 * 383 * @param b Buddy system. 384 * @param block_1 First block. 385 * @param block_2 First block's buddy. 386 * 387 * @return Coalesced block (actually block that represents lower 388 * address). 386 389 */ 387 390 static link_t *zone_buddy_coalesce(buddy_system_t *b, link_t *block_1, … … 396 399 } 397 400 398 /** Buddy system set_order implementation 399 * 400 * @param b 401 * @param block Buddy system block402 * @param order Order to set401 /** Buddy system set_order implementation. 402 * 403 * @param b Buddy system. 404 * @param block Buddy system block. 405 * @param order Order to set. 403 406 */ 404 407 static void zone_buddy_set_order(buddy_system_t *b, link_t *block, 405 uint8_t order) { 408 uint8_t order) 409 { 406 410 frame_t *frame; 407 411 frame = list_get_instance(block, frame_t, buddy_link); … … 409 413 } 410 414 411 /** Buddy system get_order implementation 412 * 413 * @param b Buddy system. 414 * @param block Buddy system block 415 * 416 * @return Order of block 417 */ 418 static uint8_t zone_buddy_get_order(buddy_system_t *b, link_t *block) { 415 /** Buddy system get_order implementation. 416 * 417 * @param b Buddy system. 418 * @param block Buddy system block. 419 * 420 * @return Order of block. 421 */ 422 static uint8_t zone_buddy_get_order(buddy_system_t *b, link_t *block) 423 { 419 424 frame_t *frame; 420 425 frame = list_get_instance(block, frame_t, buddy_link); … … 422 427 } 423 428 424 /** Buddy system mark_busy implementation 425 * 426 * @param b Buddy system427 * @param block Buddy system block428 * 429 */ 430 static void zone_buddy_mark_busy(buddy_system_t *b, link_t * block){429 /** Buddy system mark_busy implementation. 430 * 431 * @param b Buddy system. 432 * @param block Buddy system block. 433 */ 434 static void zone_buddy_mark_busy(buddy_system_t *b, link_t * block) 435 { 431 436 frame_t * frame; 432 437 … … 435 440 } 436 441 437 /** Buddy system mark_available implementation 438 * 439 * @param b Buddy system440 * @param block Buddy system block441 * 442 */ 443 static void zone_buddy_mark_available(buddy_system_t *b, link_t *block){442 /** Buddy system mark_available implementation. 443 * 444 * @param b Buddy system. 445 * @param block Buddy system block. 446 */ 447 static void zone_buddy_mark_available(buddy_system_t *b, link_t *block) 448 { 444 449 frame_t *frame; 445 450 frame = list_get_instance(block, frame_t, buddy_link); … … 463 468 /******************/ 464 469 465 /** Allocate frame in particular zone 466 * 467 * Assume zone is locked 470 /** Allocate frame in particular zone. 471 * 472 * Assume zone is locked. 468 473 * Panics if allocation is impossible. 469 474 * 470 * @param zone 471 * @param order 472 * 473 * @return Frame index in zone475 * @param zone Zone to allocate from. 476 * @param order Allocate exactly 2^order frames. 477 * 478 * @return Frame index in zone. 474 479 * 475 480 */ … … 497 502 } 498 503 499 /** Free frame from zone 500 * 501 * Assume zone is locked 502 * 503 * @param zone Pointer to zone from which the frame is to be freed504 * @param frame_idx Frame index relative to zone504 /** Free frame from zone. 505 * 506 * Assume zone is locked. 507 * 508 * @param zone Pointer to zone from which the frame is to be freed. 509 * @param frame_idx Frame index relative to zone. 505 510 */ 506 511 static void zone_frame_free(zone_t *zone, index_t frame_idx) … … 525 530 } 526 531 527 /** Return frame from zone */532 /** Return frame from zone. */ 528 533 static frame_t * zone_get_frame(zone_t *zone, index_t frame_idx) 529 534 { … … 532 537 } 533 538 534 /** Mark frame in zone unavailable to allocation */539 /** Mark frame in zone unavailable to allocation. */ 535 540 static void zone_mark_unavailable(zone_t *zone, index_t frame_idx) 536 541 { … … 547 552 } 548 553 549 /** 550 * Join 2 zones 551 * 552 * Expect zone_t *z to point to space at least zone_conf_size large 553 * 554 * Assume z1 & z2 are locked 555 * 556 * @param z Target zone structure pointer 557 * @param z1 Zone to merge 558 * @param z2 Zone to merge 554 /** Join two zones. 555 * 556 * Expect zone_t *z to point to space at least zone_conf_size large. 557 * 558 * Assume z1 & z2 are locked. 559 * 560 * @param z Target zone structure pointer. 561 * @param z1 Zone to merge. 562 * @param z2 Zone to merge. 559 563 */ 560 564 static void _zone_merge(zone_t *z, zone_t *z1, zone_t *z2) … … 630 634 } 631 635 632 /** Return old configuration frames into the zone 636 /** Return old configuration frames into the zone. 633 637 * 634 638 * We have several cases … … 637 641 * updated with reduce_region -> free every frame 638 642 * 639 * @param newzone The actual zone where freeing should occur640 * @param oldzone 641 * be freed from new zone643 * @param newzone The actual zone where freeing should occur. 644 * @param oldzone Pointer to old zone configuration data that should 645 * be freed from new zone. 642 646 */ 643 647 static void return_config_frames(zone_t *newzone, zone_t *oldzone) … … 663 667 } 664 668 665 /** Reduce allocated block to count of order 0 frames 669 /** Reduce allocated block to count of order 0 frames. 666 670 * 667 671 * The allocated block need 2^order frames of space. Reduce all frames … … 671 675 * 672 676 * @param zone 673 * @param frame_idx Index to block674 * @param count Allocated space in block677 * @param frame_idx Index to block. 678 * @param count Allocated space in block. 675 679 */ 676 680 static void zone_reduce_region(zone_t *zone, pfn_t frame_idx, count_t count) … … 699 703 } 700 704 701 /** Merge zones z1 and z2 705 /** Merge zones z1 and z2. 702 706 * 703 707 * - the zones must be 2 zones with no zone existing in between, … … 774 778 } 775 779 776 /** 777 * Merge all zones into one big zone 780 /** Merge all zones into one big zone. 778 781 * 779 782 * It is reasonable to do this on systems whose bios reports parts in chunks, … … 790 793 } 791 794 792 /** Create frame zone 793 * 794 * Create new frame zone. 795 * 796 * @param start Physical address of the first frame within the zone. 797 * @param count Count of frames in zone 798 * @param z Address of configuration information of zone 799 * @param flags Zone flags. 800 * 801 * @return Initialized zone. 795 /** Create new frame zone. 796 * 797 * @param start Physical address of the first frame within the zone. 798 * @param count Count of frames in zone. 799 * @param z Address of configuration information of zone. 800 * @param flags Zone flags. 801 * 802 * @return Initialized zone. 802 803 */ 803 804 static void zone_construct(pfn_t start, count_t count, zone_t *z, int flags) … … 820 821 821 822 buddy_system_create(z->buddy_system, max_order, 822 &zone_buddy_system_operations, 823 (void *) z); 823 &zone_buddy_system_operations, (void *) z); 824 824 825 825 /* Allocate frames _after_ the conframe */ … … 838 838 } 839 839 840 /** Compute configuration data size for zone 841 * 842 * @param count Size of zone in frames843 * @return Size of zone configuration info (in bytes)840 /** Compute configuration data size for zone. 841 * 842 * @param count Size of zone in frames. 843 * @return Size of zone configuration info (in bytes). 844 844 */ 845 845 uintptr_t zone_conf_size(count_t count) … … 853 853 } 854 854 855 /** Create and add zone to system 856 * 857 * @param start First frame number (absolute)858 * @param count Size of zone in frames859 * @param confframe 860 * 861 * kernel and possibly init.862 * If confframe is given _outside_ this zone, it is expected,863 * that the area is already marked BUSY and big enough864 * to contain zone_conf_size() amount of data.865 * If the confframe is inside the area, the zone free frame866 * information ismodified not to include it.867 * 868 * @return Zone number or -1 on error855 /** Create and add zone to system. 856 * 857 * @param start First frame number (absolute). 858 * @param count Size of zone in frames. 859 * @param confframe Where configuration frames are supposed to be. 860 * Automatically checks, that we will not disturb the 861 * kernel and possibly init. If confframe is given 862 * _outside_ this zone, it is expected, that the area is 863 * already marked BUSY and big enough to contain 864 * zone_conf_size() amount of data. If the confframe is 865 * inside the area, the zone free frame information is 866 * modified not to include it. 867 * 868 * @return Zone number or -1 on error. 869 869 */ 870 870 int zone_create(pfn_t start, count_t count, pfn_t confframe, int flags) … … 931 931 /* Frame functions */ 932 932 933 /** Set parent of frame */933 /** Set parent of frame. */ 934 934 void frame_set_parent(pfn_t pfn, void *data, unsigned int hint) 935 935 { … … 956 956 /** Allocate power-of-two frames of physical memory. 957 957 * 958 * @param order 959 * @param flags 960 * @param pzone Preferred zone961 * 962 * @return 963 * 964 */ 965 void * frame_alloc_generic(uint8_t order, int flags, unsigned int *pzone)958 * @param order Allocate exactly 2^order frames. 959 * @param flags Flags for host zone selection and address processing. 960 * @param pzone Preferred zone. 961 * 962 * @return Physical address of the allocated frame. 963 * 964 */ 965 void *frame_alloc_generic(uint8_t order, int flags, unsigned int *pzone) 966 966 { 967 967 ipl_t ipl; … … 1020 1020 * If it drops to zero, move the frame structure to free list. 1021 1021 * 1022 * @param FramePhysical Address of of the frame to be freed.1022 * @param frame Physical Address of of the frame to be freed. 1023 1023 */ 1024 1024 void frame_free(uintptr_t frame) … … 1047 1047 * increment frame reference count. 1048 1048 * 1049 * @param pfn 1049 * @param pfn Frame number of the frame to be freed. 1050 1050 */ 1051 1051 void frame_reference_add(pfn_t pfn) … … 1060 1060 * First, find host frame zone for addr. 1061 1061 */ 1062 zone = find_zone_and_lock(pfn, NULL);1062 zone = find_zone_and_lock(pfn, NULL); 1063 1063 ASSERT(zone); 1064 1064 1065 frame = &zone->frames[pfn -zone->base];1065 frame = &zone->frames[pfn - zone->base]; 1066 1066 frame->refcount++; 1067 1067 … … 1070 1070 } 1071 1071 1072 /** Mark given range unavailable in frame zones */1072 /** Mark given range unavailable in frame zones. */ 1073 1073 void frame_mark_unavailable(pfn_t start, count_t count) 1074 1074 { … … 1087 1087 } 1088 1088 1089 /** Initialize physical memory management 1090 * 1091 * Initialize physical memory managemnt. 1092 */ 1089 /** Initialize physical memory management. */ 1093 1090 void frame_init(void) 1094 1091 { … … 1123 1120 1124 1121 1125 /** Return total size of all zones 1126 * 1127 */ 1128 uint64_t zone_total_size(void) { 1122 /** Return total size of all zones. */ 1123 uint64_t zone_total_size(void) 1124 { 1129 1125 zone_t *zone = NULL; 1130 1126 unsigned int i; … … 1148 1144 } 1149 1145 1150 1151 1152 /** Prints list of zones 1153 * 1154 */ 1155 void zone_print_list(void) { 1146 /** Prints list of zones. */ 1147 void zone_print_list(void) 1148 { 1156 1149 zone_t *zone = NULL; 1157 1150 unsigned int i; … … 1176 1169 1177 1170 #ifdef __32_BITS__ 1178 printf("%-2u %10p %12" PRIc " %12" PRIc "\n", i, PFN2ADDR(zone->base), 1179 zone->free_count, zone->busy_count); 1171 printf("%-2u %10p %12" PRIc " %12" PRIc "\n", 1172 i, PFN2ADDR(zone->base), zone->free_count, 1173 zone->busy_count); 1180 1174 #endif 1181 1175 1182 1176 #ifdef __64_BITS__ 1183 printf("%-2u %18p %12" PRIc " %12" PRIc "\n", i, PFN2ADDR(zone->base),1184 zone->free_count, zone->busy_count);1177 printf("%-2u %18p %12" PRIc " %12" PRIc "\n", i, 1178 PFN2ADDR(zone->base), zone->free_count, zone->busy_count); 1185 1179 #endif 1186 1180 … … 1194 1188 /** Prints zone details. 1195 1189 * 1196 * @param num Zone base address or zone number. 1197 */ 1198 void zone_print_one(unsigned int num) { 1190 * @param num Zone base address or zone number. 1191 */ 1192 void zone_print_one(unsigned int num) 1193 { 1199 1194 zone_t *zone = NULL; 1200 1195 ipl_t ipl; … … 1219 1214 printf("Zone base address: %p\n", PFN2ADDR(zone->base)); 1220 1215 printf("Zone size: %" PRIc " frames (%" PRIs " KB)\n", zone->count, 1221 1222 printf("Allocated space: %" PRIc " frames (%" PRIs " KB)\n", zone->busy_count,1223 1224 printf("Available space: %" PRIc " frames (%" PRIs " KB)\n", zone->free_count,1225 1216 SIZE2KB(FRAMES2SIZE(zone->count))); 1217 printf("Allocated space: %" PRIc " frames (%" PRIs " KB)\n", 1218 zone->busy_count, SIZE2KB(FRAMES2SIZE(zone->busy_count))); 1219 printf("Available space: %" PRIc " frames (%" PRIs " KB)\n", 1220 zone->free_count, SIZE2KB(FRAMES2SIZE(zone->free_count))); 1226 1221 buddy_system_structure_print(zone->buddy_system, FRAME_SIZE); 1227 1222 spinlock_unlock(&zone->lock);
Note:
See TracChangeset
for help on using the changeset viewer.