Fix FreeBSD/PowerPC* issues - #2147

Open
kgotlinux wants to merge 2 commits into
abseil:masterfrom
kgotlinux:fbsd-ppc64-fix
Open

Fix FreeBSD/PowerPC* issues#2147
kgotlinux wants to merge 2 commits into
abseil:masterfrom
kgotlinux:fbsd-ppc64-fix

Conversation

@kgotlinux

Copy link
Copy Markdown
Contributor

This is a cumulative PR for two FreeBSD/PowerPC* changes:

  1. Fix for UnscaledCycleClock::Frequency().
  2. Fix for saved-LR slot on 32-bits.

@google-cla

Copy link
Copy Markdown

Thanks for your pull request! It looks like this may be your first contribution to a Google open source project. Before we can look at your pull request, you'll need to sign a Contributor License Agreement (CLA).

View this failed invocation of the CLA check for more information.

For the most up to date status, view the checks section at the bottom of the pull request.

StacktracePowerPCGetLRPtr() falls back to OS checks when the compiler
does not provide the _CALL_* ABI macros. Clang defines neither
_CALL_SYSV nor _CALL_AIX on any FreeBSD PowerPC target (64-bit gets
only _CALL_ELF=2), so 32-bit powerpc-*-freebsd hits the __FreeBSD__
fallback and reads the LR from sp[2]. The 32-bit SVR4 ABI saves the LR
in the second word of the frame, sp[1]; sp[2] is correct only for the
64-bit ELF ABIs and Darwin/AIX. Verified against clang codegen:
powerpc-unknown-freebsd emits "stwu 1,-16(1); stw 0,20(1)" (old SP + 4)
while powerpc64-unknown-freebsd emits "stdu 1,-48(1); std 0,64(1)"
(old SP + 16).
Key the fallback on the word size instead of the OS: any __PPC64__
target uses sp[2], and 32-bit ELF targets (Linux, FreeBSD) use sp[1].
This is behavior-preserving for Linux and for 64-bit FreeBSD, and fixes
the 32-bit FreeBSD case (currently latent, since stacktrace_config.h
does not select this unwinder on FreeBSD).
The FreeBSD branch reads the kern.timecounter.tc.timebase.frequency
sysctl straight into a double. The kernel registers that OID as
CTLTYPE_U64 (sys/kern/kern_tc.c, tc_init()), so sysctlbyname() fills the
8-byte buffer with the integer 512000000 and the bits are then
interpreted as an IEEE double: Frequency() returns ~2.5e-315 instead of
5.12e+08. The size check cannot catch this because uint64_t and double
are both 8 bytes.
Observed on FreeBSD 15.1 powerpc64le and powerpc64 (POWER9):
- LOG_EVERY_N_SEC / VLOG_EVERY_N_SEC never rate-limit, because
LogEveryNSecState::ShouldLog() computes the next log time as
now + seconds * Frequency() ~= now (1000 of 1000 iterations logged
with a 3600 s period).
- Mutex waiters refresh their pthread_getschedparam() cache on every
block instead of once per second.
Read the sysctl into a uint64_t and convert to double; keep 0.0 if the
sysctl fails.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@kgotlinux@derekmauro@kokoro-team
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Fix FreeBSD/PowerPC* issues - #2147

Open
kgotlinux wants to merge 2 commits into
abseil:masterfrom
kgotlinux:fbsd-ppc64-fix
Open

Fix FreeBSD/PowerPC* issues#2147
kgotlinux wants to merge 2 commits into
abseil:masterfrom
kgotlinux:fbsd-ppc64-fix

Conversation

@kgotlinux

Copy link
Copy Markdown
Contributor

This is a cumulative PR for two FreeBSD/PowerPC* changes:

  1. Fix for UnscaledCycleClock::Frequency().
  2. Fix for saved-LR slot on 32-bits.

@google-cla

Copy link
Copy Markdown

Thanks for your pull request! It looks like this may be your first contribution to a Google open source project. Before we can look at your pull request, you'll need to sign a Contributor License Agreement (CLA).

View this failed invocation of the CLA check for more information.

For the most up to date status, view the checks section at the bottom of the pull request.

StacktracePowerPCGetLRPtr() falls back to OS checks when the compiler
does not provide the _CALL_* ABI macros. Clang defines neither
_CALL_SYSV nor _CALL_AIX on any FreeBSD PowerPC target (64-bit gets
only _CALL_ELF=2), so 32-bit powerpc-*-freebsd hits the __FreeBSD__
fallback and reads the LR from sp[2]. The 32-bit SVR4 ABI saves the LR
in the second word of the frame, sp[1]; sp[2] is correct only for the
64-bit ELF ABIs and Darwin/AIX. Verified against clang codegen:
powerpc-unknown-freebsd emits "stwu 1,-16(1); stw 0,20(1)" (old SP + 4)
while powerpc64-unknown-freebsd emits "stdu 1,-48(1); std 0,64(1)"
(old SP + 16).
Key the fallback on the word size instead of the OS: any __PPC64__
target uses sp[2], and 32-bit ELF targets (Linux, FreeBSD) use sp[1].
This is behavior-preserving for Linux and for 64-bit FreeBSD, and fixes
the 32-bit FreeBSD case (currently latent, since stacktrace_config.h
does not select this unwinder on FreeBSD).
The FreeBSD branch reads the kern.timecounter.tc.timebase.frequency
sysctl straight into a double. The kernel registers that OID as
CTLTYPE_U64 (sys/kern/kern_tc.c, tc_init()), so sysctlbyname() fills the
8-byte buffer with the integer 512000000 and the bits are then
interpreted as an IEEE double: Frequency() returns ~2.5e-315 instead of
5.12e+08. The size check cannot catch this because uint64_t and double
are both 8 bytes.
Observed on FreeBSD 15.1 powerpc64le and powerpc64 (POWER9):
- LOG_EVERY_N_SEC / VLOG_EVERY_N_SEC never rate-limit, because
LogEveryNSecState::ShouldLog() computes the next log time as
now + seconds * Frequency() ~= now (1000 of 1000 iterations logged
with a 3600 s period).
- Mutex waiters refresh their pthread_getschedparam() cache on every
block instead of once per second.
Read the sysctl into a uint64_t and convert to double; keep 0.0 if the
sysctl fails.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@kgotlinux@derekmauro@kokoro-team
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Fix FreeBSD/PowerPC* issues - #2147

Open
kgotlinux wants to merge 2 commits into
abseil:masterfrom
kgotlinux:fbsd-ppc64-fix
Open

Fix FreeBSD/PowerPC* issues#2147
kgotlinux wants to merge 2 commits into
abseil:masterfrom
kgotlinux:fbsd-ppc64-fix

Conversation

@kgotlinux

Copy link
Copy Markdown
Contributor

This is a cumulative PR for two FreeBSD/PowerPC* changes:

  1. Fix for UnscaledCycleClock::Frequency().
  2. Fix for saved-LR slot on 32-bits.

@google-cla

Copy link
Copy Markdown

Thanks for your pull request! It looks like this may be your first contribution to a Google open source project. Before we can look at your pull request, you'll need to sign a Contributor License Agreement (CLA).

View this failed invocation of the CLA check for more information.

For the most up to date status, view the checks section at the bottom of the pull request.

StacktracePowerPCGetLRPtr() falls back to OS checks when the compiler
does not provide the _CALL_* ABI macros. Clang defines neither
_CALL_SYSV nor _CALL_AIX on any FreeBSD PowerPC target (64-bit gets
only _CALL_ELF=2), so 32-bit powerpc-*-freebsd hits the __FreeBSD__
fallback and reads the LR from sp[2]. The 32-bit SVR4 ABI saves the LR
in the second word of the frame, sp[1]; sp[2] is correct only for the
64-bit ELF ABIs and Darwin/AIX. Verified against clang codegen:
powerpc-unknown-freebsd emits "stwu 1,-16(1); stw 0,20(1)" (old SP + 4)
while powerpc64-unknown-freebsd emits "stdu 1,-48(1); std 0,64(1)"
(old SP + 16).
Key the fallback on the word size instead of the OS: any __PPC64__
target uses sp[2], and 32-bit ELF targets (Linux, FreeBSD) use sp[1].
This is behavior-preserving for Linux and for 64-bit FreeBSD, and fixes
the 32-bit FreeBSD case (currently latent, since stacktrace_config.h
does not select this unwinder on FreeBSD).
The FreeBSD branch reads the kern.timecounter.tc.timebase.frequency
sysctl straight into a double. The kernel registers that OID as
CTLTYPE_U64 (sys/kern/kern_tc.c, tc_init()), so sysctlbyname() fills the
8-byte buffer with the integer 512000000 and the bits are then
interpreted as an IEEE double: Frequency() returns ~2.5e-315 instead of
5.12e+08. The size check cannot catch this because uint64_t and double
are both 8 bytes.
Observed on FreeBSD 15.1 powerpc64le and powerpc64 (POWER9):
- LOG_EVERY_N_SEC / VLOG_EVERY_N_SEC never rate-limit, because
LogEveryNSecState::ShouldLog() computes the next log time as
now + seconds * Frequency() ~= now (1000 of 1000 iterations logged
with a 3600 s period).
- Mutex waiters refresh their pthread_getschedparam() cache on every
block instead of once per second.
Read the sysctl into a uint64_t and convert to double; keep 0.0 if the
sysctl fails.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@kgotlinux@derekmauro@kokoro-team
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Fix FreeBSD/PowerPC* issues - #2147

Open
kgotlinux wants to merge 2 commits into
abseil:masterfrom
kgotlinux:fbsd-ppc64-fix
Open

Fix FreeBSD/PowerPC* issues#2147
kgotlinux wants to merge 2 commits into
abseil:masterfrom
kgotlinux:fbsd-ppc64-fix

Conversation

@kgotlinux

Copy link
Copy Markdown
Contributor

This is a cumulative PR for two FreeBSD/PowerPC* changes:

  1. Fix for UnscaledCycleClock::Frequency().
  2. Fix for saved-LR slot on 32-bits.

@google-cla

Copy link
Copy Markdown

Thanks for your pull request! It looks like this may be your first contribution to a Google open source project. Before we can look at your pull request, you'll need to sign a Contributor License Agreement (CLA).

View this failed invocation of the CLA check for more information.

For the most up to date status, view the checks section at the bottom of the pull request.

StacktracePowerPCGetLRPtr() falls back to OS checks when the compiler
does not provide the _CALL_* ABI macros. Clang defines neither
_CALL_SYSV nor _CALL_AIX on any FreeBSD PowerPC target (64-bit gets
only _CALL_ELF=2), so 32-bit powerpc-*-freebsd hits the __FreeBSD__
fallback and reads the LR from sp[2]. The 32-bit SVR4 ABI saves the LR
in the second word of the frame, sp[1]; sp[2] is correct only for the
64-bit ELF ABIs and Darwin/AIX. Verified against clang codegen:
powerpc-unknown-freebsd emits "stwu 1,-16(1); stw 0,20(1)" (old SP + 4)
while powerpc64-unknown-freebsd emits "stdu 1,-48(1); std 0,64(1)"
(old SP + 16).
Key the fallback on the word size instead of the OS: any __PPC64__
target uses sp[2], and 32-bit ELF targets (Linux, FreeBSD) use sp[1].
This is behavior-preserving for Linux and for 64-bit FreeBSD, and fixes
the 32-bit FreeBSD case (currently latent, since stacktrace_config.h
does not select this unwinder on FreeBSD).
The FreeBSD branch reads the kern.timecounter.tc.timebase.frequency
sysctl straight into a double. The kernel registers that OID as
CTLTYPE_U64 (sys/kern/kern_tc.c, tc_init()), so sysctlbyname() fills the
8-byte buffer with the integer 512000000 and the bits are then
interpreted as an IEEE double: Frequency() returns ~2.5e-315 instead of
5.12e+08. The size check cannot catch this because uint64_t and double
are both 8 bytes.
Observed on FreeBSD 15.1 powerpc64le and powerpc64 (POWER9):
- LOG_EVERY_N_SEC / VLOG_EVERY_N_SEC never rate-limit, because
LogEveryNSecState::ShouldLog() computes the next log time as
now + seconds * Frequency() ~= now (1000 of 1000 iterations logged
with a 3600 s period).
- Mutex waiters refresh their pthread_getschedparam() cache on every
block instead of once per second.
Read the sysctl into a uint64_t and convert to double; keep 0.0 if the
sysctl fails.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@kgotlinux@derekmauro@kokoro-team
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Fix FreeBSD/PowerPC* issues - #2147

Open
kgotlinux wants to merge 2 commits into
abseil:masterfrom
kgotlinux:fbsd-ppc64-fix
Open

Fix FreeBSD/PowerPC* issues#2147
kgotlinux wants to merge 2 commits into
abseil:masterfrom
kgotlinux:fbsd-ppc64-fix

Conversation

@kgotlinux

Copy link
Copy Markdown
Contributor

This is a cumulative PR for two FreeBSD/PowerPC* changes:

  1. Fix for UnscaledCycleClock::Frequency().
  2. Fix for saved-LR slot on 32-bits.

@google-cla

Copy link
Copy Markdown

Thanks for your pull request! It looks like this may be your first contribution to a Google open source project. Before we can look at your pull request, you'll need to sign a Contributor License Agreement (CLA).

View this failed invocation of the CLA check for more information.

For the most up to date status, view the checks section at the bottom of the pull request.

StacktracePowerPCGetLRPtr() falls back to OS checks when the compiler
does not provide the _CALL_* ABI macros. Clang defines neither
_CALL_SYSV nor _CALL_AIX on any FreeBSD PowerPC target (64-bit gets
only _CALL_ELF=2), so 32-bit powerpc-*-freebsd hits the __FreeBSD__
fallback and reads the LR from sp[2]. The 32-bit SVR4 ABI saves the LR
in the second word of the frame, sp[1]; sp[2] is correct only for the
64-bit ELF ABIs and Darwin/AIX. Verified against clang codegen:
powerpc-unknown-freebsd emits "stwu 1,-16(1); stw 0,20(1)" (old SP + 4)
while powerpc64-unknown-freebsd emits "stdu 1,-48(1); std 0,64(1)"
(old SP + 16).
Key the fallback on the word size instead of the OS: any __PPC64__
target uses sp[2], and 32-bit ELF targets (Linux, FreeBSD) use sp[1].
This is behavior-preserving for Linux and for 64-bit FreeBSD, and fixes
the 32-bit FreeBSD case (currently latent, since stacktrace_config.h
does not select this unwinder on FreeBSD).
The FreeBSD branch reads the kern.timecounter.tc.timebase.frequency
sysctl straight into a double. The kernel registers that OID as
CTLTYPE_U64 (sys/kern/kern_tc.c, tc_init()), so sysctlbyname() fills the
8-byte buffer with the integer 512000000 and the bits are then
interpreted as an IEEE double: Frequency() returns ~2.5e-315 instead of
5.12e+08. The size check cannot catch this because uint64_t and double
are both 8 bytes.
Observed on FreeBSD 15.1 powerpc64le and powerpc64 (POWER9):
- LOG_EVERY_N_SEC / VLOG_EVERY_N_SEC never rate-limit, because
LogEveryNSecState::ShouldLog() computes the next log time as
now + seconds * Frequency() ~= now (1000 of 1000 iterations logged
with a 3600 s period).
- Mutex waiters refresh their pthread_getschedparam() cache on every
block instead of once per second.
Read the sysctl into a uint64_t and convert to double; keep 0.0 if the
sysctl fails.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@kgotlinux@derekmauro@kokoro-team
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Fix FreeBSD/PowerPC* issues - #2147

Open
kgotlinux wants to merge 2 commits into
abseil:masterfrom
kgotlinux:fbsd-ppc64-fix
Open

Fix FreeBSD/PowerPC* issues#2147
kgotlinux wants to merge 2 commits into
abseil:masterfrom
kgotlinux:fbsd-ppc64-fix

Conversation

@kgotlinux

Copy link
Copy Markdown
Contributor

This is a cumulative PR for two FreeBSD/PowerPC* changes:

  1. Fix for UnscaledCycleClock::Frequency().
  2. Fix for saved-LR slot on 32-bits.

@google-cla

Copy link
Copy Markdown

Thanks for your pull request! It looks like this may be your first contribution to a Google open source project. Before we can look at your pull request, you'll need to sign a Contributor License Agreement (CLA).

View this failed invocation of the CLA check for more information.

For the most up to date status, view the checks section at the bottom of the pull request.

StacktracePowerPCGetLRPtr() falls back to OS checks when the compiler
does not provide the _CALL_* ABI macros. Clang defines neither
_CALL_SYSV nor _CALL_AIX on any FreeBSD PowerPC target (64-bit gets
only _CALL_ELF=2), so 32-bit powerpc-*-freebsd hits the __FreeBSD__
fallback and reads the LR from sp[2]. The 32-bit SVR4 ABI saves the LR
in the second word of the frame, sp[1]; sp[2] is correct only for the
64-bit ELF ABIs and Darwin/AIX. Verified against clang codegen:
powerpc-unknown-freebsd emits "stwu 1,-16(1); stw 0,20(1)" (old SP + 4)
while powerpc64-unknown-freebsd emits "stdu 1,-48(1); std 0,64(1)"
(old SP + 16).
Key the fallback on the word size instead of the OS: any __PPC64__
target uses sp[2], and 32-bit ELF targets (Linux, FreeBSD) use sp[1].
This is behavior-preserving for Linux and for 64-bit FreeBSD, and fixes
the 32-bit FreeBSD case (currently latent, since stacktrace_config.h
does not select this unwinder on FreeBSD).
The FreeBSD branch reads the kern.timecounter.tc.timebase.frequency
sysctl straight into a double. The kernel registers that OID as
CTLTYPE_U64 (sys/kern/kern_tc.c, tc_init()), so sysctlbyname() fills the
8-byte buffer with the integer 512000000 and the bits are then
interpreted as an IEEE double: Frequency() returns ~2.5e-315 instead of
5.12e+08. The size check cannot catch this because uint64_t and double
are both 8 bytes.
Observed on FreeBSD 15.1 powerpc64le and powerpc64 (POWER9):
- LOG_EVERY_N_SEC / VLOG_EVERY_N_SEC never rate-limit, because
LogEveryNSecState::ShouldLog() computes the next log time as
now + seconds * Frequency() ~= now (1000 of 1000 iterations logged
with a 3600 s period).
- Mutex waiters refresh their pthread_getschedparam() cache on every
block instead of once per second.
Read the sysctl into a uint64_t and convert to double; keep 0.0 if the
sysctl fails.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@kgotlinux@derekmauro@kokoro-team
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Fix FreeBSD/PowerPC* issues - #2147

Open
kgotlinux wants to merge 2 commits into
abseil:masterfrom
kgotlinux:fbsd-ppc64-fix
Open

Fix FreeBSD/PowerPC* issues#2147
kgotlinux wants to merge 2 commits into
abseil:masterfrom
kgotlinux:fbsd-ppc64-fix

Conversation

@kgotlinux

Copy link
Copy Markdown
Contributor

This is a cumulative PR for two FreeBSD/PowerPC* changes:

  1. Fix for UnscaledCycleClock::Frequency().
  2. Fix for saved-LR slot on 32-bits.

@google-cla

Copy link
Copy Markdown

Thanks for your pull request! It looks like this may be your first contribution to a Google open source project. Before we can look at your pull request, you'll need to sign a Contributor License Agreement (CLA).

View this failed invocation of the CLA check for more information.

For the most up to date status, view the checks section at the bottom of the pull request.

StacktracePowerPCGetLRPtr() falls back to OS checks when the compiler
does not provide the _CALL_* ABI macros. Clang defines neither
_CALL_SYSV nor _CALL_AIX on any FreeBSD PowerPC target (64-bit gets
only _CALL_ELF=2), so 32-bit powerpc-*-freebsd hits the __FreeBSD__
fallback and reads the LR from sp[2]. The 32-bit SVR4 ABI saves the LR
in the second word of the frame, sp[1]; sp[2] is correct only for the
64-bit ELF ABIs and Darwin/AIX. Verified against clang codegen:
powerpc-unknown-freebsd emits "stwu 1,-16(1); stw 0,20(1)" (old SP + 4)
while powerpc64-unknown-freebsd emits "stdu 1,-48(1); std 0,64(1)"
(old SP + 16).
Key the fallback on the word size instead of the OS: any __PPC64__
target uses sp[2], and 32-bit ELF targets (Linux, FreeBSD) use sp[1].
This is behavior-preserving for Linux and for 64-bit FreeBSD, and fixes
the 32-bit FreeBSD case (currently latent, since stacktrace_config.h
does not select this unwinder on FreeBSD).
The FreeBSD branch reads the kern.timecounter.tc.timebase.frequency
sysctl straight into a double. The kernel registers that OID as
CTLTYPE_U64 (sys/kern/kern_tc.c, tc_init()), so sysctlbyname() fills the
8-byte buffer with the integer 512000000 and the bits are then
interpreted as an IEEE double: Frequency() returns ~2.5e-315 instead of
5.12e+08. The size check cannot catch this because uint64_t and double
are both 8 bytes.
Observed on FreeBSD 15.1 powerpc64le and powerpc64 (POWER9):
- LOG_EVERY_N_SEC / VLOG_EVERY_N_SEC never rate-limit, because
LogEveryNSecState::ShouldLog() computes the next log time as
now + seconds * Frequency() ~= now (1000 of 1000 iterations logged
with a 3600 s period).
- Mutex waiters refresh their pthread_getschedparam() cache on every
block instead of once per second.
Read the sysctl into a uint64_t and convert to double; keep 0.0 if the
sysctl fails.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@kgotlinux@derekmauro@kokoro-team
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Fix FreeBSD/PowerPC* issues - #2147

Open
kgotlinux wants to merge 2 commits into
abseil:masterfrom
kgotlinux:fbsd-ppc64-fix
Open

Fix FreeBSD/PowerPC* issues#2147
kgotlinux wants to merge 2 commits into
abseil:masterfrom
kgotlinux:fbsd-ppc64-fix

Conversation

@kgotlinux

Copy link
Copy Markdown
Contributor

This is a cumulative PR for two FreeBSD/PowerPC* changes:

  1. Fix for UnscaledCycleClock::Frequency().
  2. Fix for saved-LR slot on 32-bits.

@google-cla

Copy link
Copy Markdown

Thanks for your pull request! It looks like this may be your first contribution to a Google open source project. Before we can look at your pull request, you'll need to sign a Contributor License Agreement (CLA).

View this failed invocation of the CLA check for more information.

For the most up to date status, view the checks section at the bottom of the pull request.

StacktracePowerPCGetLRPtr() falls back to OS checks when the compiler
does not provide the _CALL_* ABI macros. Clang defines neither
_CALL_SYSV nor _CALL_AIX on any FreeBSD PowerPC target (64-bit gets
only _CALL_ELF=2), so 32-bit powerpc-*-freebsd hits the __FreeBSD__
fallback and reads the LR from sp[2]. The 32-bit SVR4 ABI saves the LR
in the second word of the frame, sp[1]; sp[2] is correct only for the
64-bit ELF ABIs and Darwin/AIX. Verified against clang codegen:
powerpc-unknown-freebsd emits "stwu 1,-16(1); stw 0,20(1)" (old SP + 4)
while powerpc64-unknown-freebsd emits "stdu 1,-48(1); std 0,64(1)"
(old SP + 16).
Key the fallback on the word size instead of the OS: any __PPC64__
target uses sp[2], and 32-bit ELF targets (Linux, FreeBSD) use sp[1].
This is behavior-preserving for Linux and for 64-bit FreeBSD, and fixes
the 32-bit FreeBSD case (currently latent, since stacktrace_config.h
does not select this unwinder on FreeBSD).
The FreeBSD branch reads the kern.timecounter.tc.timebase.frequency
sysctl straight into a double. The kernel registers that OID as
CTLTYPE_U64 (sys/kern/kern_tc.c, tc_init()), so sysctlbyname() fills the
8-byte buffer with the integer 512000000 and the bits are then
interpreted as an IEEE double: Frequency() returns ~2.5e-315 instead of
5.12e+08. The size check cannot catch this because uint64_t and double
are both 8 bytes.
Observed on FreeBSD 15.1 powerpc64le and powerpc64 (POWER9):
- LOG_EVERY_N_SEC / VLOG_EVERY_N_SEC never rate-limit, because
LogEveryNSecState::ShouldLog() computes the next log time as
now + seconds * Frequency() ~= now (1000 of 1000 iterations logged
with a 3600 s period).
- Mutex waiters refresh their pthread_getschedparam() cache on every
block instead of once per second.
Read the sysctl into a uint64_t and convert to double; keep 0.0 if the
sysctl fails.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@kgotlinux@derekmauro@kokoro-team