Commit Graph

3892 Commits

Author SHA1 Message Date
Ingo Weinhold
fa0c1e96a0 Hopefully the last work on the MTRR code for the time being:
Since we also force uncacheability via the PTEs, it is no longer necessary to
use MTRRs for uncacheable ranges. It is recommended, which is why we still do
it, if possible, but when we run out of MTRRs, the algorithm ignores
uncacheable ranges now -- iteratively it increases the minimum size of ranges
to drop until the available MTRRs suffice.
Should fix #5703 and #5865.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36591 a95241bf-73f2-0310-859d-f6bbb57e9c96
2010-05-02 23:05:38 +00:00
Ingo Weinhold
6f2772b135 vm_map_physical_memory(): When alreadyWired we have to explicitly set the
memory type for the mapped pages.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36590 a95241bf-73f2-0310-859d-f6bbb57e9c96
2010-05-02 22:52:25 +00:00
Ingo Weinhold
001a0e0987 memory_type_to_pte_flags(): Also set the write-through flag for uncacheable
memory. This avoids implementation defined behavior on Pentium Pro/II when
intersecting with an write-combining or write-protected MTRR range.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36589 a95241bf-73f2-0310-859d-f6bbb57e9c96
2010-05-02 22:50:30 +00:00
Ingo Weinhold
f23be5bbed Support memory types in page mappings to the degree that is possible without
PAT support (i.e. uncacheable, write-through, and write-back). Has pretty
much no effect ATM, as the MTRRs restrict the types to what is actually
requested.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36583 a95241bf-73f2-0310-859d-f6bbb57e9c96
2010-05-02 15:30:52 +00:00
Ingo Weinhold
bfb3b117eb mmu_init(): In case we couldn't get a memory map from the BIOS the fixed
memory setup was 1 MiB larger than advertised.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36581 a95241bf-73f2-0310-859d-f6bbb57e9c96
2010-05-02 12:56:40 +00:00
Ingo Weinhold
e33adea4dc Fixed PPC build.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36580 a95241bf-73f2-0310-859d-f6bbb57e9c96
2010-05-02 12:53:47 +00:00
Stefano Ceccherini
c65e6981d2 rest of the patch by Kaliber in ticket #5875.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36578 a95241bf-73f2-0310-859d-f6bbb57e9c96
2010-05-02 10:34:57 +00:00
Ingo Weinhold
c1be1e0761 * VMTranslationMap::Map()/Protect(): Added "memoryType" parameter. Not
implemented for any architecture yet.
* vm_set_area_memory_type(): Call VMTranslationMap::ProtectArea() to change the
  memory type for the already mapped pages.



git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36574 a95241bf-73f2-0310-859d-f6bbb57e9c96
2010-05-01 21:33:12 +00:00
Ingo Weinhold
3b0c1b5227 * VMArea: Made memory_type private and added setter and getter methods.
* Don't set the VMArea's memory type in arch_vm_set_memory_type(), but let the
  callers do that.
* vm_set_area_memory_type(): Does nothing, if the memory type doesn't change.



git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36573 a95241bf-73f2-0310-859d-f6bbb57e9c96
2010-05-01 20:41:57 +00:00
Ingo Weinhold
907886143f * Changed some parameters of VM syscalls from int to uint32, mostly for sake
of consistency.
* Moved the B_OVERCOMMITTING_AREA flag from B_KERNEL_AREA_FLAGS to
  B_USER_AREA_FLAGS, since we really allow it to be passed from userland.
* Most VM syscalls check the provided protection against B_USER_AREA_FLAGS
  instead of B_USER_PROTECTION, now. This way they allow for
  B_OVERCOMMITTING_AREA as well.
* _user_map_file(), _user_set_memory_protection(): Check the protection like
  the other syscalls do and use fix_protection() instead of doing that
  manually.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36572 a95241bf-73f2-0310-859d-f6bbb57e9c96
2010-05-01 19:47:39 +00:00
Ingo Weinhold
a5de454f45 VM{Kernel,User}Area::Create(): On error free the area's memory heeding the
given allocation flags. Could deadlock otherwise.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36571 a95241bf-73f2-0310-859d-f6bbb57e9c96
2010-05-01 18:50:21 +00:00
Ingo Weinhold
40f1dd8443 arch_vm_supports_protection(): Fixed broken check.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36570 a95241bf-73f2-0310-859d-f6bbb57e9c96
2010-05-01 18:31:12 +00:00
Ingo Weinhold
f651548ee6 scheduler_reschedule_no_op(): panic() when the calling thread is not
continuing to run. This must not happen since the thread is the boot CPU's
idle thread performing the early kernel initialization (before the scheduler
is started).


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36560 a95241bf-73f2-0310-859d-f6bbb57e9c96
2010-04-30 19:40:20 +00:00
Ingo Weinhold
26f1dd2708 Added a third rendez-vous point for the call_all_cpus() MTRR functions. This
fixes the problem that the CPU initiating the call could make the next call
and reset sCpuRendezvous2 before the other CPUs have returned from their
smp_cpu_rendezvous(). Probably virtually impossible on real hardware, but I
could almost reliably reproduce it with qemu -smp 2 (would hang the late boot
process without ability to enter KDL).


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36559 a95241bf-73f2-0310-859d-f6bbb57e9c96
2010-04-30 19:37:19 +00:00
Ingo Weinhold
7f987e49d7 Added a rendez-vous variable parameter to smp_trap_non_boot_cpus() and make
boot CPU wait until all other CPUs are ready to wait. This solves a
theoretical problem in main(): The boot CPU could run fully through the early
initialization and reset sCpuRendezvous2 before the other CPUs left
smp_cpu_rendezvous(). It's very unlikely on real hardware that the non-boot
CPUs are so much slower, but it might be a concern in emulation.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36558 a95241bf-73f2-0310-859d-f6bbb57e9c96
2010-04-30 19:32:12 +00:00
Ingo Weinhold
4d6b1f03da Documented smp_cpu_rendezvous().
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36556 a95241bf-73f2-0310-859d-f6bbb57e9c96
2010-04-30 18:33:25 +00:00
Ingo Weinhold
0ef0e3cfa0 Map read-only segments over-committing for the relocation. This prevents the
kernel from committing memory for all read-only segments until we're done
relocating. This allows Haiku to boot on machines with less RAM and swap
disabled. At least in qemu I could boot with 100 MB and start WebPositive.
Probably fixed #5822.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36552 a95241bf-73f2-0310-859d-f6bbb57e9c96
2010-04-30 12:09:43 +00:00
Ingo Weinhold
fe5ea7b4d2 VMAnonymous[NoSwap]Cache, overcommitting mode:
* Commit(): Unreserve memory when asked to shrink the commitment.
* Fault(): The whole logic is flawed, since this is always called by
  vm_soft_fault(), even, if the page is finally mapped from a lower cache.
  Now we do at least limit our commitment to (page_count + 1) * B_PAGE_SIZE
  instead of always reserving memory for another page.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36551 a95241bf-73f2-0310-859d-f6bbb57e9c96
2010-04-30 12:02:33 +00:00
Ingo Weinhold
278f7e57cd map_backing_store(): Also consider the B_OVERCOMMITTING_AREA for private
maps. The new cache will be created in over-committing mode.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36550 a95241bf-73f2-0310-859d-f6bbb57e9c96
2010-04-30 11:55:27 +00:00
Ingo Weinhold
8cd3dac13e Reintroduced sigwait(), sigsuspend(), and sigpending(). There are obviously
drivers using those.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36548 a95241bf-73f2-0310-859d-f6bbb57e9c96
2010-04-30 10:00:44 +00:00
Ingo Weinhold
73f4184b7b Unset sSyslogBuffer in all error cases in which we disable syslog output.
Spotted by Axel.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36532 a95241bf-73f2-0310-859d-f6bbb57e9c96
2010-04-29 15:32:54 +00:00
Ingo Weinhold
d3166e469c Replaced no longer necessary send_signal_etc() work-arounds for
resume_thread().


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36531 a95241bf-73f2-0310-859d-f6bbb57e9c96
2010-04-29 15:23:29 +00:00
Ingo Weinhold
28d05e026f Make scheduler_reschedule() an no-op until we're ready to start the
scheduler. This avoids the need to use the send_signal_etc() work-around for
resume_thread() during the early kernel initialization. Might fix #5851.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36530 a95241bf-73f2-0310-859d-f6bbb57e9c96
2010-04-29 15:10:37 +00:00
Axel Dörfler
d3a302aae8 * embedded_controller_support() now actually checks all entries of the
supporting ID array (just that it only contains one entry).
* Fixed missing malloc() result check in embedded_controller_init_driver().
* Style fixes.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36529 a95241bf-73f2-0310-859d-f6bbb57e9c96
2010-04-29 15:09:38 +00:00
Ingo Weinhold
7b8344c61e syslog_init_post_vm(): If the syslog is disabled, clear sSyslogBuffer. It is
already initialized in syslog_init(), if the debug syslog feature is enabled.
Since the area would never be created, the pointer becomes invalid, however,
and could cause a double fault on entering KDL.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36528 a95241bf-73f2-0310-859d-f6bbb57e9c96
2010-04-29 14:16:25 +00:00
Ingo Weinhold
d62afe7ab0 VMUserAddressSpace::LookupArea(): Although only a read-lock is the
precondition for calling the function it read/write accessed the fAreaHint
attribute in a non-atomic manner. I.e. if executed concurrently by two
threads of the same team one could return the wrong area. The most likely
problem could be caused in vm_soft_fault(), leading to pages being added to
the wrong caches.
The bug itself is inherited from NewOS, but is triggered way more likely
since the page daemon unmaps inactive pages (r35485). Probably fixes #5413.
Might also fix the sporadically occurring crashes/asserts in the hoard
allocator -- at least inactive pages being replaced by zeroed ones would be
an excellent explanation.
[Thanks to Matt for providing remote debug access to his machine.]


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36523 a95241bf-73f2-0310-859d-f6bbb57e9c96
2010-04-28 22:06:40 +00:00
Axel Dörfler
4fe399e426 * Use vm_page_write_modified_page_range() instead of
vm_page_schedule_write_page_range() to prevent more memory pressure.
* While it seems to help a bit, it doesn't solve the problem of bug #5777.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36519 a95241bf-73f2-0310-859d-f6bbb57e9c96
2010-04-28 18:09:09 +00:00
Ingo Weinhold
22984248fa * kernel_debugger_loop(): Don't access sSyslogBuffer without checking whether
it is non-NULL first.
* syslog_init_post_vm(): Make sure the area for the debug syslog could actually
  be created and fail otherwise.
* syslog_init_post_threads(): Fixed the cleanup on error. In case of a debug
  syslog we need to delete the respective area instead of free()ing the
  memory.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36497 a95241bf-73f2-0310-859d-f6bbb57e9c96
2010-04-26 21:16:36 +00:00
Ingo Weinhold
5060d7980f IOCache implements IOScheduler, now.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36494 a95241bf-73f2-0310-859d-f6bbb57e9c96
2010-04-26 15:43:20 +00:00
Ingo Weinhold
2eab54201c Added SetDeviceCapacity() method.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36493 a95241bf-73f2-0310-859d-f6bbb57e9c96
2010-04-26 15:42:34 +00:00
Ingo Weinhold
0715529b59 Renamed IOScheduler to IOSchedulerSimple and pulled an interface IOScheduler
out of it.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36492 a95241bf-73f2-0310-859d-f6bbb57e9c96
2010-04-26 14:47:24 +00:00
Ingo Weinhold
7aba4e400e Moved IOSchedulerRoster into its own header/source files.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36491 a95241bf-73f2-0310-859d-f6bbb57e9c96
2010-04-26 14:09:39 +00:00
Ingo Weinhold
b1e06d23ce * The "page_stats" command does now also print the longest contiguous runs of
free respective free and cached pages.
* Removed the unused vm_page_allocate_page_run_no_base().
* vm_page_allocate_page_run() (and allocate_page_run()):
  - Use vm_page_reserve_pages() instead of vm_page_try_reserve_pages(), i.e.
    wait until the reservation succeeds.
  - Now we iterates two times through the pages to find a suitable page run. In
    the first iteration it only looks for free/clear pages, in the second
    iteration it also considers cached pages. This increases the chance of the
    function to succeed, when a lot of caching is going on.
    This reduces the amount of memory required to use the IOCache when booting
    off the anyboot Live CD to around 160 MB in qemu. It also seems to work with
    128 MB, but the syslog indicates that some memory allocations fail, which
    is not exactly inspiring confidence.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36489 a95241bf-73f2-0310-859d-f6bbb57e9c96
2010-04-26 13:56:09 +00:00
Ingo Weinhold
c1b8ab4ef0 vm_create_anonymous_area(): Allocate the page run for B_CONTIGUOUS areas
before locking the address space. That gives us a bit more flexibility in
vm_page_allocate_page_run().


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36486 a95241bf-73f2-0310-859d-f6bbb57e9c96
2010-04-26 13:28:05 +00:00
Ingo Weinhold
f14480bc2c Essentially rewrote the IOCache to use a VMCache and unmapped pages for
caching (similar to the file cache) instead of contiguous areas. This is
probably a little bit slower, but integrates better with the VM -- the
caching doesn't increase memory pressure and the least recently used pages
will automatically be recycled when needed.
There are still memory allocation issues on machines with little memory. The
USB stack apparently tries to allocate a rather big chunk of contiguous
memory, which fails when all not otherwise bound memory is used for caches,
since the VM functions for allocating contiguous memory consider only free
pages ATM.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36458 a95241bf-73f2-0310-859d-f6bbb57e9c96
2010-04-24 21:54:49 +00:00
Axel Dörfler
fd722a6734 * Minor coding style cleanup.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36439 a95241bf-73f2-0310-859d-f6bbb57e9c96
2010-04-23 18:28:45 +00:00
Ingo Weinhold
e91e4ee0a6 Added IOCache, a simple write-through cache implementation that can be used
as a drop-in replacement for IOScheduler, processing IORequests synchronously
in FIFO order. It stores cache lines of user-defined size. Currently for each
cache line an area of contiguous memory is used, which is not optimal.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36436 a95241bf-73f2-0310-859d-f6bbb57e9c96
2010-04-23 18:07:31 +00:00
Ingo Weinhold
ccb3f07a14 get_memory_map_etc(): Setting the return value to B_BUFFER_OVERFLOW in the
loop causes the function to return before setting the _numEntries. The
overflow case is checked at the end of the function anyway, so we can just
break out.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36425 a95241bf-73f2-0310-859d-f6bbb57e9c96
2010-04-22 22:48:33 +00:00
Fredrik Holmqvist
5d9cc10f80 Moving ACPI Embedded Controller to ACPI bus manager.
* Removed irq_routing struct from ACPI.h to where it is used. Might be able to use acrestype.h instead of duplication.
 * Disable old embedded controller and remove it from image.
 * Move embedded controller code to busmanager module.
 * Remove (some) code duplication

Should work as before, but is now initialized right after the bus manager. Can probably remove further code duplication.
I hope I've done it correctly, feedback is most welcome.



git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36420 a95241bf-73f2-0310-859d-f6bbb57e9c96
2010-04-22 16:19:41 +00:00
Ingo Weinhold
63fe660c1b * Replaced a few hardcoded partitioning/file system type names by the
respective constants.
* compare_image_boot(): Compare volume names case insensitively.
* DiskBootMethod::IsBootDevice(): For BOOT_METHOD_CD only accept devices with
  removable media.
* DiskBootMethod::IsBootPartition(): Added special recognition for anyboot
  CDs. Since their partition types aren't kPartitionTypeDataSession,
  compare_cd_boot() didn't prefer them and it was more or less random whether
  it was chosen when other Haiku installations where available. Moreover
  selecting the CD in the boot loader menu would cause the kernel not to find
  it.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36403 a95241bf-73f2-0310-859d-f6bbb57e9c96
2010-04-21 18:00:23 +00:00
Ingo Weinhold
04b174ca25 * Moved IOCallback class into separate source file.
* Moved IOScheduler::_IOCallbackWrapper() to IOCallback::WrapperFunction().


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36394 a95241bf-73f2-0310-859d-f6bbb57e9c96
2010-04-21 11:20:07 +00:00
Jérôme Duval
8fbb8bd5b6 fixes r36356, *only* when times is NULL, both the access and modification timestamps should be set. Thanks to Ingo for reviewing!
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36379 a95241bf-73f2-0310-859d-f6bbb57e9c96
2010-04-20 17:23:57 +00:00
Ingo Weinhold
6e83a6fac9 * VMCache::Resize(): Corrected TODO comment.
* Changed the semantics of VMCache::HasPage(). It was interpreted
  inconsistently by the derived classes. Now it returns whether the backing
  store can provide the page (via Read()). The default implementation returns
  false. VNodeCache::HasPage() only returns true, if the given offset is
  within the cache (i.e. file) bounds. This prevents vm_soft_fault() from
  adding clean pages to vnode caches on faults beyond the file bounds.
  Probably fixes #5473 -- at least mmap_resize_test behaves correctly, now.
* Removed redundant HasPage() and Fault() overrides in VMCache derived
  classes.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36374 a95241bf-73f2-0310-859d-f6bbb57e9c96
2010-04-20 15:10:09 +00:00
Ingo Weinhold
efeca209a1 Made VMCache::Resize() virtual and let VMAnonymousCache override it to free
swap space when the cache shrinks. Currently the implementation stil leaks
swap space of busy pages.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36373 a95241bf-73f2-0310-859d-f6bbb57e9c96
2010-04-20 14:04:18 +00:00
Ingo Weinhold
ba16e4ec61 cut_area(): We should only resize RAM caches.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36372 a95241bf-73f2-0310-859d-f6bbb57e9c96
2010-04-20 13:56:45 +00:00
Ingo Weinhold
1c1d16b344 Adjusted indentation. No functional change.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36360 a95241bf-73f2-0310-859d-f6bbb57e9c96
2010-04-19 20:41:05 +00:00
Jérôme Duval
1276d52122 * fixed utimensat() when times is NULL, both the access and modification timestamps should be set (bug #5759).
* the meaning of AT_SYMLINK_NOFOLLOW was also reversed.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36356 a95241bf-73f2-0310-859d-f6bbb57e9c96
2010-04-19 17:12:44 +00:00
Ingo Weinhold
d78426257a Use SPINLOCK_PAUSE() in the pthread_spin_lock() loop.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36352 a95241bf-73f2-0310-859d-f6bbb57e9c96
2010-04-19 14:17:17 +00:00
Ingo Weinhold
45538a5e31 x86_handle_debug_exception(): The values of dr6 and dr7 are only stored in
the CPU info, if x86_exit_user_debug_at_kernel_entry() was executed before,
i.e. if the debug exception occurred in userlands. In all other cases we need
to read the current register values. Fixes #5742, a regression introduced in
r35951.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36340 a95241bf-73f2-0310-859d-f6bbb57e9c96
2010-04-18 17:06:02 +00:00
Ingo Weinhold
ef1716f81b Patch by Lucian Adrian Grijincu: Added pthread spinlock support.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36333 a95241bf-73f2-0310-859d-f6bbb57e9c96
2010-04-17 19:38:01 +00:00