summaryrefslogtreecommitdiffstats
path: root/sys/amd64
Commit message (Collapse)AuthorAgeFilesLines
* Use vtopde() instead of pmap_pde() in pmap_kextract(); vtopde() is smalleralc2004-12-211-1/+1
| | | | | and faster in cases, such as pmap_kextract(), where the pde is known to exist.
* In the common case, pmap_enter_quick() completes without sleeping.alc2004-12-151-2/+12
| | | | | | | | | | | | | | | | | | In such cases, the busying of the page and the unlocking of the containing object by vm_map_pmap_enter() and vm_fault_prefault() is unnecessary overhead. To eliminate this overhead, this change modifies pmap_enter_quick() so that it expects the object to be locked on entry and it assumes the responsibility for busying the page and unlocking the object if it must sleep. Note: alpha, amd64, i386 and ia64 are the only implementations optimized by this change; arm, powerpc, and sparc64 still conservatively busy the page and unlock the object within every pmap_enter_quick() call. Additionally, this change is the first case where we synchronize access to the page's PG_BUSY flag and busy field using the containing object's lock rather than the global page queues lock. (Modifications to the page's PG_BUSY flag and busy field have asserted both locks for several weeks, enabling an incremental transition.)
* MFi386: rev 1.12: re-allow fast interrupts to cause preemptionpeter2004-12-061-2/+0
|
* Replace (inlined) pmap_pte() calls with smaller, faster code wherealc2004-12-041-7/+7
| | | | | | possible, such as the inner loop of pmap_copy(). Remove two comments that apply to i386 but not amd64.
* For efficiency eliminate the call to pmap_pte() from pmap_protect()'s andalc2004-12-021-14/+18
| | | | | | | pmap_remove()'s inner loop. Instead, call pmap_pde_to_pte(), a new function, prior to the inner loop. Reviewed by: peter@, tegge@
* Change gdb_cpu_setreg() to not take the value to which to set themarcel2004-12-012-5/+4
| | | | | | | | | | | | | | | | | | | | | specified register, but a pointer to the in-memory representation of that value. The reason for this is twofold: 1. Not all registers can be represented by a register_t. In particular FP registers fall in that category. Passing the new register value by reference instead of by value makes this point moot. 2. When we receive a G or P packet, both are for writing a register, the packet will have the register value in target-byte order and in the memory representation (modulo the fact that bytes are sent as 2 printable hexadecimal numbers of course). We only need to decode the packet to have a pointer to the register value. This change fixes the bug of extracting the register value of the P packet as a hexadecimal number instead of as a bit array. The quick (and dirty) fix to bswap the register value in gdb_cpu_setreg() as it has been added on i386 and amd64 can therefore be removed and has in fact been that. Tested on: alpha, amd64, i386, ia64, sparc64
* Remove unused cnt variable for the SMP case. Trim some excessive blankpeter2004-11-301-5/+1
| | | | lines while here.
* Update the gdb register extraction support to use the pcb whereverpeter2004-11-301-23/+33
| | | | | possible, like on i386. Registers are handled differently for caller vs callee saved registers.
* MFi386: join the %cr0 setup line now that i386 has lost the I386 ifdefs.peter2004-11-291-2/+1
|
* Take advantage of the shutdown processing being wired to the BSP andpeter2004-11-291-45/+3
| | | | | eliminate the evil cpu_reset_proxy code now that it will never be activated. i386 should pick this up as well.
* Don't flag alignment constraints as a reason for bouncing. This fixes thescottl2004-11-291-1/+1
| | | | | trigger for other misbehaviour in the sym driver that was causing freezes at boot. Thanks to phk@ for reporting and testing this.
* Don't include sys/user.h merely for its side-effect of recursivelydas2004-11-275-5/+5
| | | | including other headers.
* Remove an extra #includescottl2004-11-211-1/+0
|
* Consolidate all of the bounce tests into the BUS_DMA_COULD_BOUNCE flag.scottl2004-11-211-29/+45
| | | | | | | Allocate the bounce zone at either tag creation or map creation to help avoid null-pointer derefs later on. Track total pages per zone so that each zone can get a minimum allocation at tag creation time instead of being defeated by mis-behaving tags that suck up the max amount.
* Remove references to U area and garbage collect includes.das2004-11-201-4/+1
| | | | Reviewed by: arch@
* Remove UAREA_PAGES.das2004-11-201-1/+0
| | | | Reviewed by: arch@
* U areas are going away, so don't allocate one for process 0.das2004-11-201-3/+0
| | | | Reviewed by: arch@
* Revert part of rev 1.56. Tag boundaries are handled by splitting segments,scottl2004-11-191-9/+5
| | | | not through bouncing.
* MFi386 rev 1.63-1.64:scottl2004-11-101-37/+142
| | | | Use tag-specific pools of bounce pages instead of a single global pool.
* MFi386 1.238 (jhb): Allow hints to disable cpuspeter2004-11-051-1/+16
|
* MFi386:peter2004-11-051-28/+79
| | | | | rev 1.61 (scottl): Add KTR tracing rev 1.62 (scottl): Optimize (td->pmap, inlines, etc)
* Don't use atomic ops to increment interrupt stats. This was only done onscottl2004-11-031-3/+3
| | | | amd64 and i386 anyways. The stats are only kept for informational purposes.
* Reduce annoying SCSI probing delay from 15 to 5 seconds in all GENRIC kernels.andre2004-11-021-1/+1
| | | | Discussed on: -current
* - Change the ddb paging "support" to use a variable (db_lines_per_page) tojhb2004-11-012-2/+2
| | | | | | | | | | | | | | | | | control the number of lines per page rather than a constant. The variable can be examined and changed in ddb as '$lines'. Setting the variable to 0 will effectively turn off paging. - Change db_putchar() to force out pending whitespace before outputting newlines and carriage returns so that one can rub out content on the current line via '\r \r' type strings. - Change the simple pager to rub out the --More-- prompt explicitly when the routine exits. - Add some aliases to the simple pager to make it more compatible with more(1): 'e' and 'j' do a single line. 'd' does half a page, and 'f' does a full page. MFC after: 1 month Inspired by: kris
* Add TUNABLE_LONG and TUNABLE_ULONG, and use the latter for thedes2004-10-311-4/+3
| | | | | | | hw.pci.host_mem_start tunable. Add comments to TUNABLE_INT and TUNABLE_QUAD recommending against their use. MFC after: 3 weeks
* Whitespace cleanupdes2004-10-311-5/+5
|
* MFi386: preserve dcons buffer passed by loader.simokawa2004-10-281-0/+16
|
* Raise MAXDSIZ from 8G to 32G. The old limit was just an arbitary choicepeter2004-10-271-1/+1
| | | | | | | | that was greater than 4G. I originally used the same values as i386 in order to save opening a new PML4 page slot, but in the day of gigabytes of memory, worrying about a 4K page seems futile. Moving from 8 to 32G moves the page to a different index, it doesn't increase the number of pages used.
* Print flags in the nexus for child devices.njl2004-10-141-0/+2
|
* MFi386: sync with latest updatespeter2004-10-111-3/+36
|
* Move the code for halting the CPU (acpi_cpu_c1) into machdep files.njl2004-10-112-1/+8
| | | | | | This removes the last MD portion of acpi_cpu.c. MFC after: 2 weeks
* Make pte_load_store() an atomic operation in all cases, not just i386 PAE.alc2004-10-082-11/+34
| | | | | | | | | Restructure pmap_enter() to prevent the loss of a page modified (PG_M) bit in a race between processors. (This restructuring assumes the newly atomic pte_load_store() for correct operation.) Reviewed by: tegge@ PR: i386/61852
* Rework how we store process times in the kernel such that we always storejhb2004-10-051-16/+6
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | the raw values including for child process statistics and only compute the system and user timevals on demand. - Fix the various kern_wait() syscall wrappers to only pass in a rusage pointer if they are going to use the result. - Add a kern_getrusage() function for the ABI syscalls to use so that they don't have to play stackgap games to call getrusage(). - Fix the svr4_sys_times() syscall to just call calcru() to calculate the times it needs rather than calling getrusage() twice with associated stackgap, etc. - Add a new rusage_ext structure to store raw time stats such as tick counts for user, system, and interrupt time as well as a bintime of the total runtime. A new p_rux field in struct proc replaces the same inline fields from struct proc (i.e. p_[isu]ticks, p_[isu]u, and p_runtime). A new p_crux field in struct proc contains the "raw" child time usage statistics. ruadd() has been changed to handle adding the associated rusage_ext structures as well as the values in rusage. Effectively, the values in rusage_ext replace the ru_utime and ru_stime values in struct rusage. These two fields in struct rusage are no longer used in the kernel. - calcru() has been split into a static worker function calcru1() that calculates appropriate timevals for user and system time as well as updating the rux_[isu]u fields of a passed in rusage_ext structure. calcru() uses a copy of the process' p_rux structure to compute the timevals after updating the runtime appropriately if any of the threads in that process are currently executing. It also now only locks sched_lock internally while doing the rux_runtime fixup. calcru() now only requires the caller to hold the proc lock and calcru1() only requires the proc lock internally. calcru() also no longer allows callers to ask for an interrupt timeval since none of them actually did. - calcru() now correctly handles threads executing on other CPUs. - A new calccru() function computes the child system and user timevals by calling calcru1() on p_crux. Note that this means that any code that wants child times must now call this function rather than reading from p_cru directly. This function also requires the proc lock. - This finishes the locking for rusage and friends so some of the Giant locks in exit1() and kern_wait() are now gone. - The locking in ttyinfo() has been tweaked so that a shared lock of the proctree lock is used to protect the process group rather than the process group lock. By holding this lock until the end of the function we now ensure that the process/thread that we pick to dump info about will no longer vanish while we are trying to output its info to the console. Submitted by: bde (mostly) MFC after: 1 month
* Undo revision 1.251. This change was a performance pessimizing work-aroundalc2004-10-031-1/+1
| | | | | | | | | | | | | that is no longer required. (In fact, it is not clear that it was ever required in HEAD or RELENG_4, only RELENG_3 required a work-around.) Now, as before revision 1.251, if the preexisting PTE is invalid, pmap_enter() does not call pmap_invalidate_page() to update the TLB(s). Note: Even with this change, the handling of a copy-on-write fault is inefficient, in such cases pmap_enter() calls pmap_invalidate_page() twice. Discussed with: bde@ PR: kern/16568
* The physical address stored in the vm_page is page aligned. There is noalc2004-10-031-1/+1
| | | | | | need to mask off the page offset bits. (This operation made some sense prior to i386/i386/pmap.c revision 1.254 when we passed a physical address rather than a vm_page pointer to pmap_enter().)
* Eliminate unnecessary uses of PHYS_TO_VM_PAGE() from pmap_enter(). Thesealc2004-10-021-5/+2
| | | | | | | uses predate the change in the pmap_enter() interface that replaced the page's physical address by the address of its vm_page structure. The PHYS_TO_VM_PAGE() was being used to compute the address of the same vm_page structure that was being passed in.
* Remove an unused declaration. (I should have included this change inalc2004-10-021-1/+0
| | | | revision 1.486.)
* Prevent the unexpected deallocation of a page table page while performingalc2004-09-292-22/+45
| | | | | | | | | | | | | pmap_copy(). This entails additional locking in pmap_copy() and the addition of a "flags" parameter to the page table page allocator for specifying whether it may sleep when memory is unavailable. (Already, pmap_copy() checks the availability of memory, aborting if it is scarce. In theory, another CPU could, however, allocate memory between pmap_copy()'s check and the call to the page table page allocator, causing the current thread to release its locks and sleep. This change makes this scenario impossible.) Reviewed by: tegge@
* MFi386: rev 1.239 - invalidate tlb after pte updatepeter2004-09-291-2/+4
|
* MFi386: rev 1.236 - improve panic message for a busted mptablepeter2004-09-291-1/+3
|
* Like on i386, use the definition of struct bios_smap from machine/pc/bios.hpeter2004-09-241-6/+1
| | | | again.
* Converge towards i386. I originally resisted creating <machine/pc/bios.h>peter2004-09-241-1/+4
| | | | | | | | | | | | because it was mostly irrelevant - except for the silly BIOS_PADDRTOVADDR etc macros. Along the way of working around this, I missed a few things. * Make syscons properly inherit the bios capslock/shiftlock/etc state like i386 does. Note that we cannot inherit the bios key repeat rate because that requires a bios call (which is impossible for us). * Give syscons the ability to beep on amd64. Oops. While here, make bios.c compile and add it to files.amd64.
* Severely strip down the repocopied i386/bios.c and bios.h files. It turnspeter2004-09-242-823/+3
| | | | out that bios_sigsearch() etc is useful for finding tables in roms.
* Correct a long-standing error in _pmap_unwire_pte_hold() affectingalc2004-09-221-7/+6
| | | | | | | | | | | | | | | | | | | | | | | | | multiprocessors. Specifically, the error is conditioning the call to pmap_invalidate_page() on whether the pmap is active on the current CPU. This call must be unconditional. Regardless of whether the pmap is active on the CPU performing _pmap_unwire_pte_hold(), it could be active on another CPU. For example, a call to pmap_remove_all() by the page daemon could result in a call to _pmap_unwire_pte_hold() with the pmap inactive on the current CPU and active on another CPU. In such circumstances, failing to call pmap_invalidate_page() results in a stale TLB entry on the other CPU that still maps the now deallocated page table page. What happens next is typically a mysterious panic in pmap_enter() by the other CPU, either "pmap_enter: attempted pmap_enter on 4MB page" or "pmap_enter: pte vanished, va: 0x%lx". Both occur because the former page table page has been recycled and allocated to a new purpose. Consequently, it no longer contains zeroes. See also Peter's i386/i386/pmap.c revision 1.448 and the related e-mail thread last year. Many thanks to the engineers at Sandvine for providing clear and concise information until all of the pieces of the puzzle fell into place and for testing an earlier patch. MT5 Candidate
* MFi386: adapt rev 1.19 (debugger fixes)peter2004-09-221-2/+10
|
* Minor sync-up with i386. Catch up on de-quoting and de-counting afterpeter2004-09-221-14/+23
| | | | config changes.
* MFi386: add ispfw (except using correct device<tab><tab>ispfw format,peter2004-09-221-0/+1
| | | | <space><tab> is for the options line)
* - Add support for "paging" in stack trace output. That is, when you dojhb2004-09-201-2/+4
| | | | | | | | | | | | | a stack trace from ddb, the output will pause with a '--More--' prompt every 18 lines. If you hit Enter, it will print another line and prompt again. If you hit space it will output another page and then prompt. If you hit 'q' or 'x' it will abort the rest of the stack trace. - Fix the sparc64 userland stack trace to honor the total count of lines to print. This is useful if your trace happens to walk back onto 0xdeadc0de and gets stuck in an endless loop. MFC after: 1 month Tested on: i386, alpha, sparc64
* Simplify the reference counting of page table pages. Specifically, usealc2004-09-191-27/+15
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | the page table page's wired count rather than its hold count to contain the reference count. My rationale for this change is based on several factors: 1. The machine-independent and pmap layers used the same hold count field in subtly different ways. The machine-independent layer uses the hold count to implement a form of ephemeral wiring that is used by pipes, physio, etc. In other words, subsystems where we wish to temporarily block a page from being swapped out while it is mapped into the kernel's address space. Such pages are never removed from the page queues. Instead, the page daemon recognizes a non-zero hold count to mean "hands off this page." In contrast, page table pages are never in the page queues; they are wired from birth to death. The hold count was being used as a kind of reference count, specifically, the number of valid page table entries within the page. Not surprisingly, these two different uses imply different synchronization rules: in the machine- independent layer access to the hold count requires the page queues lock; whereas in the pmap layer the pmap lock is required. Thus, continued use by the pmap layer of vm_page_unhold(), which asserts that the page queues lock is held, made no sense. 2. _pmap_unwire_pte_hold() was too forgiving in its handling of the wired count. An unexpected wired count on a page table page was ignored and the underlying page leaked. 3. In a word, microoptimization. Using the wired count exclusively, rather than a combination of the wired and hold counts, makes the code slightly smaller and faster. Reviewed by: tegge@
* Remove an outdated assertion from _pmap_allocpte(). (When vm_page_alloc()alc2004-09-191-3/+0
| | | | | succeeds, the page's queue field is unconditionally set to PQ_NONE by vm_pageq_remove_nowakeup().)
OpenPOWER on IntegriCloud