summaryrefslogtreecommitdiff
path: root/Documentation
diff options
context:
space:
mode:
authorOtavio Salvador <otavio@ossystems.com.br>2016-12-17 09:26:18 -0200
committerOtavio Salvador <otavio@ossystems.com.br>2016-12-17 09:26:18 -0200
commit80e3b3c3c85a3a8b70ef6403bc806901628c7446 (patch)
treec52029ec448da3d406bdd307413535cd1ad3c570 /Documentation
parent176c482f56cd9c523829ceb6bce5c28d3cc6d1c0 (diff)
parent8576fa45c10e665bb72931a31461c7310f3c5494 (diff)
Merge tag 'v4.1.36' into 4.1-2.0.x-imx
Linux 4.1.36 * tag 'v4.1.36': (72 commits) Linux 4.1.36 kbuild: add -fno-PIE firewire: net: fix fragmented datagram_size off-by-one firewire: net: guard against rx buffer overflows parisc: Ensure consistent state when switching to kernel stack at syscall entry ovl: fsync after copy-up virtio: console: Unlock vqs while freeing buffers md: be careful not lot leak internal curr_resync value into metadata. -- (all) md: sync sync_completed has correct value as recovery finishes. scsi: arcmsr: Send SYNCHRONIZE_CACHE command to firmware scsi: scsi_debug: Fix memory leak if LBP enabled and module is unloaded drm/radeon/si_dpm: workaround for SI kickers drm/dp/mst: Check peer device type before attempting EDID read drm/dp/mst: add some defines for logical/physical ports drm/dp/mst: Clear port->pdt when tearing down the i2c adapter KVM: MIPS: Precalculate MMIO load resume PC KVM: MIPS: Make ERET handle ERL before EXL drm/radeon: drop register readback in cayman_cp_int_cntl_setup scsi: megaraid_sas: Fix data integrity failure for JBOD (passthrough) devices Revert "drm/radeon: fix DP link training issue with second 4K monitor" ...
Diffstat (limited to 'Documentation')
-rw-r--r--Documentation/x86/exception-tables.txt35
1 files changed, 35 insertions, 0 deletions
diff --git a/Documentation/x86/exception-tables.txt b/Documentation/x86/exception-tables.txt
index 32901aa36f0a..e396bcd8d830 100644
--- a/Documentation/x86/exception-tables.txt
+++ b/Documentation/x86/exception-tables.txt
@@ -290,3 +290,38 @@ Due to the way that the exception table is built and needs to be ordered,
only use exceptions for code in the .text section. Any other section
will cause the exception table to not be sorted correctly, and the
exceptions will fail.
+
+Things changed when 64-bit support was added to x86 Linux. Rather than
+double the size of the exception table by expanding the two entries
+from 32-bits to 64 bits, a clever trick was used to store addresses
+as relative offsets from the table itself. The assembly code changed
+from:
+ .long 1b,3b
+to:
+ .long (from) - .
+ .long (to) - .
+
+and the C-code that uses these values converts back to absolute addresses
+like this:
+
+ ex_insn_addr(const struct exception_table_entry *x)
+ {
+ return (unsigned long)&x->insn + x->insn;
+ }
+
+In v4.6 the exception table entry was expanded with a new field "handler".
+This is also 32-bits wide and contains a third relative function
+pointer which points to one of:
+
+1) int ex_handler_default(const struct exception_table_entry *fixup)
+ This is legacy case that just jumps to the fixup code
+2) int ex_handler_fault(const struct exception_table_entry *fixup)
+ This case provides the fault number of the trap that occurred at
+ entry->insn. It is used to distinguish page faults from machine
+ check.
+3) int ex_handler_ext(const struct exception_table_entry *fixup)
+ This case is used for uaccess_err ... we need to set a flag
+ in the task structure. Before the handler functions existed this
+ case was handled by adding a large offset to the fixup to tag
+ it as special.
+More functions can easily be added.