Message ID | 20241210125847.401222-1-shorne@gmail.com |
---|---|
State | New |
Headers |
Return-Path: <newlib-bounces~patchwork=sourceware.org@sourceware.org> X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 2B9733857C5D for <patchwork@sourceware.org>; Tue, 10 Dec 2024 13:00:52 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 2B9733857C5D Authentication-Results: sourceware.org; dkim=pass (2048-bit key, unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20230601 header.b=gL+691ab X-Original-To: newlib@sourceware.org Delivered-To: newlib@sourceware.org Received: from mail-wr1-x429.google.com (mail-wr1-x429.google.com [IPv6:2a00:1450:4864:20::429]) by sourceware.org (Postfix) with ESMTPS id 4F5E5385801B for <newlib@sourceware.org>; Tue, 10 Dec 2024 12:59:35 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 4F5E5385801B Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 4F5E5385801B Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2a00:1450:4864:20::429 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1733835575; cv=none; b=uQiNXcneBpmwQhIjj2fjg/i2jN43NRrIfevsKmw8Sat1kcDPlN9iUr9MjQTKE6iPK08cAirzIKAgBvRgIxt5yDfE29HJe1+sPzifW2a2gFC3rbavVyMy5M1O/7Y1C8IV+v5xNKMGaSFmOUmkyr4QU19YdZnXK3MwW1sovfwGEJg= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1733835575; c=relaxed/simple; bh=IGy2loM6B/fA1s5sf5I/qB3fKcJpD+yMgTf+jtcA30U=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=tutqCmIeotG1+wAZAM1bCwBfQIINcgWTubVcyNxo7owI9eNO1dYi3gpnF36m8YUCLyR9cmhVWj6iCY2Z0ZCt6jEkBNeHrkRN1F1nllfiEgtBbxoL2rV2M9h7TQLecDIt/MY60iy96qS1ewV2Gz4Suop/83zMP+5cbzCVJHIHHLE= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 4F5E5385801B Received: by mail-wr1-x429.google.com with SMTP id ffacd0b85a97d-3862df95f92so2825024f8f.2 for <newlib@sourceware.org>; Tue, 10 Dec 2024 04:59:35 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1733835573; x=1734440373; darn=sourceware.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=3ll+hjXO4xHE8MVhZBs+LlMtEB7uG99+GgzEZxDtaqE=; b=gL+691abKcpACU5e0HiRr1lGw51y4JfpYju+3HADI3UetcMz+h4q2rAK7nz//Lce5s yazG950ek7aQ8iO1fIHziLDrpO9ABLSfaTxgIGrHDfl2s2Jo8/WzMUTtEbwjjyu4TEd7 Loq5vL8vwguhjMd4wU8Q639tws0IicGM9nQKJIrloZ8wPwoC9J4yakYvqNU0eFnA/nO8 LSQSxnz0llJm2DTNQXZN/0rw8wVFsudPEuMs5Y3BkbwjmnPSM+5jjnYTFB46m10qR9gz FdHCxPK0imfkpW6ekNzEyzRbca5KI4tc3WVUHP4b/cAMTNtZoToOFb2ApdbTjSyfyIW9 i79A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1733835573; x=1734440373; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=3ll+hjXO4xHE8MVhZBs+LlMtEB7uG99+GgzEZxDtaqE=; b=oul2WB8aYbToJAkGJIJtfHEZgwfqHHeDdXfj74rqzsJyfQT0ckkvULFZGbcgV4lXeZ qSfpTxG0UXE2ZG9E6AHYkSC/4auEx00rfQEyRzpKbZJ9XSOpIWBxgfqTVKifCnj9ACNE G4T4IzZkxjB/7S+fvFR6T8l+io8XLwy0m7RojV4Y2OM26F7ChOowLqaUOSD9YI41/iU7 j4awWam1u62wTDiq1B39hESeaJGcI43I+G3J2n+t7nqVjJnre1jIUlW/vWq9Dy18wcsz bxHNqU8LieS/AMtyi6cYvvYe+4q/HTYazmSvLPk7xRJvKnN7cA38GqijrqchgeLnD6k1 eDLg== X-Gm-Message-State: AOJu0Yxe2E/uq+iz9AEFsL0NCp1cTGhpGRIu2cl1L6l1R7a77BIDohTR oeU57tnba7Etpi5FQSnSGrB749VTP98rN1DIfQL3Il53UkCrOTeOZRNkVg== X-Gm-Gg: ASbGncuKEVOTkf2AaLJgjCfVryNuBxcoVgEROFHvbZP4LM95QcSJI1Nln9e4oPVz1eN tazfgZbSPU+Tv8vWZR1a9ld/z+14oRiY0wqiyf8a42FgIWUWjGKLQWpnkuY//4ULSQE+QFlibsV 9vqj+Ec7IimdK92onDxg3b7KaK79k7AKLDLwsxQDkcviMa4jeadGSiTUiyIc6O+z4QKPclpWNNu wzAMxt5wmaq04ljkiY/lFXsWH2B38YG7Cf6MbZptQzCEFE8ihdRZ+pVry01LGwTUPIkfnshOZih 4Z3eo9N3g+mHz9MXgQ== X-Google-Smtp-Source: AGHT+IHxrETMy8+Sk68WONyqE/eAmUrZLvHsnOj0ccd0tztGC8r8rNjjpjG0AdKBvYZ0iDCLZc1dnQ== X-Received: by 2002:a5d:6da5:0:b0:385:f677:859b with SMTP id ffacd0b85a97d-3862b33e5d7mr12898059f8f.10.1733835573234; Tue, 10 Dec 2024 04:59:33 -0800 (PST) Received: from localhost (cpc1-brnt4-2-0-cust862.4-2.cable.virginm.net. [86.9.131.95]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-38637072adasm10083392f8f.81.2024.12.10.04.59.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 10 Dec 2024 04:59:31 -0800 (PST) From: Stafford Horne <shorne@gmail.com> To: Newlib <newlib@sourceware.org> Cc: Linux OpenRISC <linux-openrisc@vger.kernel.org>, Stafford Horne <shorne@gmail.com> Subject: [PATCH] or1k: Fix compiler warnings Date: Tue, 10 Dec 2024 12:58:47 +0000 Message-ID: <20241210125847.401222-1-shorne@gmail.com> X-Mailer: git-send-email 2.47.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-10.8 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: newlib@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Newlib mailing list <newlib.sourceware.org> List-Unsubscribe: <https://sourceware.org/mailman/options/newlib>, <mailto:newlib-request@sourceware.org?subject=unsubscribe> List-Archive: <https://sourceware.org/pipermail/newlib/> List-Post: <mailto:newlib@sourceware.org> List-Help: <mailto:newlib-request@sourceware.org?subject=help> List-Subscribe: <https://sourceware.org/mailman/listinfo/newlib>, <mailto:newlib-request@sourceware.org?subject=subscribe> Errors-To: newlib-bounces~patchwork=sourceware.org@sourceware.org |
Series |
or1k: Fix compiler warnings
|
|
Commit Message
Stafford Horne
Dec. 10, 2024, 12:58 p.m. UTC
In my build the below are treated as error now and causing failures.
CC libc/sys/or1k/libc_a-mlock.o
newlib/libc/sys/or1k/mlock.c: In function ‘__malloc_lock’:
newlib/libc/sys/or1k/mlock.c:56:19: warning: implicit declaration of function ‘or1k_critical_begin’ [-Wimplicit-function-declaration]
56 | restore = or1k_critical_begin();
| ^~~~~~~~~~~~~~~~~~~
newlib/libc/sys/or1k/mlock.c: In function ‘__malloc_unlock’:
newlib/libc/sys/or1k/mlock.c:93:17: warning: implicit declaration of function ‘or1k_critical_end’ [-Wimplicit-function-declaration]
93 | or1k_critical_end(restore);
| ^~~~~~~~~~~~~~~~~
libgloss/or1k/or1k_uart.c: In function ‘or1k_uart_set_read_cb’:
libgloss/or1k/or1k_uart.c:163:25: warning: passing argument 2 of ‘or1k_interrupt_handler_add’ from incompatible pointer type [-Wincompatible-pointer-types]
163 | _or1k_uart_interrupt_handler, 0);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
| |
| void (*)(uint32_t) {aka void (*)(long unsigned int)}
In file included from libgloss/or1k/or1k_uart.c:19:
libgloss/or1k/include/or1k-support.h:97:45: note: expected ‘or1k_interrupt_handler_fptr’ {aka ‘void (*)(void *)’} but argument is of type ‘void (*)(uint32_t)’ {aka ‘void (*)(long unsigned int)’}
97 | or1k_interrupt_handler_fptr handler,
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~
libgloss/or1k/interrupts.c: In function ‘or1k_interrupt_handler_add’:
libgloss/or1k/interrupts.c:41:52: warning: assignment to ‘void *’ from ‘long unsigned int’ makes pointer from integer without a cast [-Wint-conversion]
41 | _or1k_interrupt_handler_data_ptr_table[id] = (uint32_t) data_ptr;
| ^
libgloss/or1k/sbrk.c:23:29: warning: initialization of ‘uint32_t’ {aka ‘long unsigned int’} from ‘uint32_t *’ {aka ‘long unsigned int *’} makes integer from pointer without a cast [-Wint-conversion]
23 | uint32_t _or1k_heap_start = &end;
|
Signed-off-by: Stafford Horne <shorne@gmail.com>
---
libgloss/or1k/interrupts.c | 4 ++--
libgloss/or1k/or1k_uart.c | 2 +-
libgloss/or1k/or1k_uart.h | 2 +-
libgloss/or1k/sbrk.c | 2 +-
newlib/libc/sys/or1k/mlock.c | 3 +++
5 files changed, 8 insertions(+), 5 deletions(-)
Comments
Hi Stafford, I'm not engaged in this stuff, so maybe this is dumb... Changing the parameter from uint32_t to void* sounds like it would have been the right thing from the start, but it's also an ABI change on 64 bit or1k. I could imagine the uint32_t is just a pointer value from the lower 4G space on 64 bit. Do we even support 64 bit or1k? Corinna On Dec 10 12:58, Stafford Horne wrote: > In my build the below are treated as error now and causing failures. > > CC libc/sys/or1k/libc_a-mlock.o > newlib/libc/sys/or1k/mlock.c: In function ‘__malloc_lock’: > newlib/libc/sys/or1k/mlock.c:56:19: warning: implicit declaration of function ‘or1k_critical_begin’ [-Wimplicit-function-declaration] > 56 | restore = or1k_critical_begin(); > | ^~~~~~~~~~~~~~~~~~~ > newlib/libc/sys/or1k/mlock.c: In function ‘__malloc_unlock’: > newlib/libc/sys/or1k/mlock.c:93:17: warning: implicit declaration of function ‘or1k_critical_end’ [-Wimplicit-function-declaration] > 93 | or1k_critical_end(restore); > | ^~~~~~~~~~~~~~~~~ > > libgloss/or1k/or1k_uart.c: In function ‘or1k_uart_set_read_cb’: > libgloss/or1k/or1k_uart.c:163:25: warning: passing argument 2 of ‘or1k_interrupt_handler_add’ from incompatible pointer type [-Wincompatible-pointer-types] > 163 | _or1k_uart_interrupt_handler, 0); > | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ > | | > | void (*)(uint32_t) {aka void (*)(long unsigned int)} > In file included from libgloss/or1k/or1k_uart.c:19: > libgloss/or1k/include/or1k-support.h:97:45: note: expected ‘or1k_interrupt_handler_fptr’ {aka ‘void (*)(void *)’} but argument is of type ‘void (*)(uint32_t)’ {aka ‘void (*)(long unsigned int)’} > 97 | or1k_interrupt_handler_fptr handler, > | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~ > > libgloss/or1k/interrupts.c: In function ‘or1k_interrupt_handler_add’: > libgloss/or1k/interrupts.c:41:52: warning: assignment to ‘void *’ from ‘long unsigned int’ makes pointer from integer without a cast [-Wint-conversion] > 41 | _or1k_interrupt_handler_data_ptr_table[id] = (uint32_t) data_ptr; > | ^ > > libgloss/or1k/sbrk.c:23:29: warning: initialization of ‘uint32_t’ {aka ‘long unsigned int’} from ‘uint32_t *’ {aka ‘long unsigned int *’} makes integer from pointer without a cast [-Wint-conversion] > 23 | uint32_t _or1k_heap_start = &end; > | > > Signed-off-by: Stafford Horne <shorne@gmail.com> > --- > libgloss/or1k/interrupts.c | 4 ++-- > libgloss/or1k/or1k_uart.c | 2 +- > libgloss/or1k/or1k_uart.h | 2 +- > libgloss/or1k/sbrk.c | 2 +- > newlib/libc/sys/or1k/mlock.c | 3 +++ > 5 files changed, 8 insertions(+), 5 deletions(-) > > diff --git a/libgloss/or1k/interrupts.c b/libgloss/or1k/interrupts.c > index 6badc497c..516d74be3 100644 > --- a/libgloss/or1k/interrupts.c > +++ b/libgloss/or1k/interrupts.c > @@ -35,10 +35,10 @@ void or1k_interrupt_handler_add(uint32_t id, > { > #ifdef __OR1K_MULTICORE__ > _or1k_interrupt_handler_table[or1k_coreid()][id] = handler; > - _or1k_interrupt_handler_data_ptr_table[or1k_coreid()][id] = (uint32_t) data_ptr; > + _or1k_interrupt_handler_data_ptr_table[or1k_coreid()][id] = data_ptr; > #else > _or1k_interrupt_handler_table[id] = handler; > - _or1k_interrupt_handler_data_ptr_table[id] = (uint32_t) data_ptr; > + _or1k_interrupt_handler_data_ptr_table[id] = data_ptr; > #endif > } > > diff --git a/libgloss/or1k/or1k_uart.c b/libgloss/or1k/or1k_uart.c > index 0a991e6ba..1391d565c 100644 > --- a/libgloss/or1k/or1k_uart.c > +++ b/libgloss/or1k/or1k_uart.c > @@ -90,7 +90,7 @@ void (*_or1k_uart_read_cb)(char c); > * This is the interrupt handler that is registered for the callback > * function. > */ > -void _or1k_uart_interrupt_handler(uint32_t data) > +void _or1k_uart_interrupt_handler(void *data) > { > uint8_t iir = REG8(IIR); > > diff --git a/libgloss/or1k/or1k_uart.h b/libgloss/or1k/or1k_uart.h > index 4cbb68350..201b7749f 100644 > --- a/libgloss/or1k/or1k_uart.h > +++ b/libgloss/or1k/or1k_uart.h > @@ -30,7 +30,7 @@ extern void (*_or1k_uart_read_cb)(char c); > /** > * The UART interrupt handler > */ > -void _or1k_uart_interrupt_handler(uint32_t data); > +void _or1k_uart_interrupt_handler(void *data); > > /** > * Initialize UART > diff --git a/libgloss/or1k/sbrk.c b/libgloss/or1k/sbrk.c > index 0c3e66e87..ca196d228 100644 > --- a/libgloss/or1k/sbrk.c > +++ b/libgloss/or1k/sbrk.c > @@ -20,7 +20,7 @@ > #include "include/or1k-support.h" > > extern uint32_t end; /* Set by linker. */ > -uint32_t _or1k_heap_start = &end; > +uint32_t _or1k_heap_start = (uint32_t) &end; > uint32_t _or1k_heap_end; > > void * > diff --git a/newlib/libc/sys/or1k/mlock.c b/newlib/libc/sys/or1k/mlock.c > index ccb840161..a0c038335 100644 > --- a/newlib/libc/sys/or1k/mlock.c > +++ b/newlib/libc/sys/or1k/mlock.c > @@ -38,6 +38,9 @@ volatile uint32_t _or1k_malloc_lock_restore; > > extern uint32_t or1k_sync_cas(void *address, uint32_t compare, uint32_t swap); > > +extern uint32_t or1k_critical_begin(); > +extern void or1k_critical_end(uint32_t restore); > + > /** > * Recursive lock of the malloc > */ > -- > 2.47.0
On Wed, Dec 11, 2024 at 02:10:59PM +0100, Corinna Vinschen wrote: > Hi Stafford, > > I'm not engaged in this stuff, so maybe this is dumb... > > Changing the parameter from uint32_t to void* sounds like it would have > been the right thing from the start, but it's also an ABI change on 64 > bit or1k. I could imagine the uint32_t is just a pointer value from the > lower 4G space on 64 bit. Do we even support 64 bit or1k? Hi Corinna, I think it's a good conncern. I put some comments on the patch below with my thoughts. If this is OK, I will send a v2 with a better description of each change. See below: > > On Dec 10 12:58, Stafford Horne wrote: > > In my build the below are treated as error now and causing failures. > > > > CC libc/sys/or1k/libc_a-mlock.o > > newlib/libc/sys/or1k/mlock.c: In function ‘__malloc_lock’: > > newlib/libc/sys/or1k/mlock.c:56:19: warning: implicit declaration of function ‘or1k_critical_begin’ [-Wimplicit-function-declaration] > > 56 | restore = or1k_critical_begin(); > > | ^~~~~~~~~~~~~~~~~~~ > > newlib/libc/sys/or1k/mlock.c: In function ‘__malloc_unlock’: > > newlib/libc/sys/or1k/mlock.c:93:17: warning: implicit declaration of function ‘or1k_critical_end’ [-Wimplicit-function-declaration] > > 93 | or1k_critical_end(restore); > > | ^~~~~~~~~~~~~~~~~ > > > > libgloss/or1k/or1k_uart.c: In function ‘or1k_uart_set_read_cb’: > > libgloss/or1k/or1k_uart.c:163:25: warning: passing argument 2 of ‘or1k_interrupt_handler_add’ from incompatible pointer type [-Wincompatible-pointer-types] > > 163 | _or1k_uart_interrupt_handler, 0); > > | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~ > > | | > > | void (*)(uint32_t) {aka void (*)(long unsigned int)} > > In file included from libgloss/or1k/or1k_uart.c:19: > > libgloss/or1k/include/or1k-support.h:97:45: note: expected ‘or1k_interrupt_handler_fptr’ {aka ‘void (*)(void *)’} but argument is of type ‘void (*)(uint32_t)’ {aka ‘void (*)(long unsigned int)’} > > 97 | or1k_interrupt_handler_fptr handler, > > | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~ > > > > libgloss/or1k/interrupts.c: In function ‘or1k_interrupt_handler_add’: > > libgloss/or1k/interrupts.c:41:52: warning: assignment to ‘void *’ from ‘long unsigned int’ makes pointer from integer without a cast [-Wint-conversion] > > 41 | _or1k_interrupt_handler_data_ptr_table[id] = (uint32_t) data_ptr; > > | ^ > > > > libgloss/or1k/sbrk.c:23:29: warning: initialization of ‘uint32_t’ {aka ‘long unsigned int’} from ‘uint32_t *’ {aka ‘long unsigned int *’} makes integer from pointer without a cast [-Wint-conversion] > > 23 | uint32_t _or1k_heap_start = &end; > > | > > > > Signed-off-by: Stafford Horne <shorne@gmail.com> > > --- > > libgloss/or1k/interrupts.c | 4 ++-- > > libgloss/or1k/or1k_uart.c | 2 +- > > libgloss/or1k/or1k_uart.h | 2 +- > > libgloss/or1k/sbrk.c | 2 +- > > newlib/libc/sys/or1k/mlock.c | 3 +++ > > 5 files changed, 8 insertions(+), 5 deletions(-) > > > > diff --git a/libgloss/or1k/interrupts.c b/libgloss/or1k/interrupts.c > > index 6badc497c..516d74be3 100644 > > --- a/libgloss/or1k/interrupts.c > > +++ b/libgloss/or1k/interrupts.c > > @@ -35,10 +35,10 @@ void or1k_interrupt_handler_add(uint32_t id, > > { > > #ifdef __OR1K_MULTICORE__ > > _or1k_interrupt_handler_table[or1k_coreid()][id] = handler; > > - _or1k_interrupt_handler_data_ptr_table[or1k_coreid()][id] = (uint32_t) data_ptr; > > + _or1k_interrupt_handler_data_ptr_table[or1k_coreid()][id] = data_ptr; > > #else > > _or1k_interrupt_handler_table[id] = handler; > > - _or1k_interrupt_handler_data_ptr_table[id] = (uint32_t) data_ptr; > > + _or1k_interrupt_handler_data_ptr_table[id] = data_ptr; Fix for: - warning: assignment to ‘void *’ from ‘long unsigned int’ makes pointer from integer without a cast [-Wint-conversion] The table _or1k_interrupt_handler_data_ptr_table is an array of void* and data_ptr is void*. There is no need for the cast so remove it. > > #endif > > } > > > > diff --git a/libgloss/or1k/or1k_uart.c b/libgloss/or1k/or1k_uart.c > > index 0a991e6ba..1391d565c 100644 > > --- a/libgloss/or1k/or1k_uart.c > > +++ b/libgloss/or1k/or1k_uart.c > > @@ -90,7 +90,7 @@ void (*_or1k_uart_read_cb)(char c); > > * This is the interrupt handler that is registered for the callback > > * function. > > */ > > -void _or1k_uart_interrupt_handler(uint32_t data) > > +void _or1k_uart_interrupt_handler(void *data) > > { > > uint8_t iir = REG8(IIR); > > > > diff --git a/libgloss/or1k/or1k_uart.h b/libgloss/or1k/or1k_uart.h > > index 4cbb68350..201b7749f 100644 > > --- a/libgloss/or1k/or1k_uart.h > > +++ b/libgloss/or1k/or1k_uart.h > > @@ -30,7 +30,7 @@ extern void (*_or1k_uart_read_cb)(char c); > > /** > > * The UART interrupt handler > > */x > > -void _or1k_uart_interrupt_handler(uint32_t data); > > +void _or1k_uart_interrupt_handler(void *data); These two are fixes for: - ‘or1k_interrupt_handler_fptr’ {aka ‘void (*)(void *)’} but argument is of type ‘void (*)(uint32_t)’ {aka ‘void (*)(long unsigned int)’} The public API is ‘void (*)(void *)' for our interrupt handlers. The symbol _or1k_uart_interrupt_hander is the internal default implementation of the uart IRQ handler and it doen't use the data argument. _There already is an ABI mismatch_ and when the handler is called in libgloss it will pass a void *. void or1k_interrupt_handler_add(uint32_t line, or1k_interrupt_handler_fptr handler, void* data); I agree that if we did have a 64-bit implementation it may be an issue. But there never has been one, or1k is only 32-bit. I think the ABI does not change with this patch. Maybe I am wrong, but I think this is safe because: - There is no ABI change as void* and uint32_t are the same in or1k - There is no API change as or1k_uart.h is not a public API What do you think? > > /** > > * Initialize UART > > diff --git a/libgloss/or1k/sbrk.c b/libgloss/or1k/sbrk.c > > index 0c3e66e87..ca196d228 100644 > > --- a/libgloss/or1k/sbrk.c > > +++ b/libgloss/or1k/sbrk.c > > @@ -20,7 +20,7 @@ > > #include "include/or1k-support.h" > > > > extern uint32_t end; /* Set by linker. */ > > -uint32_t _or1k_heap_start = &end; > > +uint32_t _or1k_heap_start = (uint32_t) &end; > > uint32_t _or1k_heap_end; Fix for: - warning: initialization of ‘uint32_t’ {aka ‘long unsigned int’} from ‘uint32_t *’ {aka ‘long unsigned int *’} makes integer from pointer without a cast [-Wint-conversion] Add a cast, which is safe in or1k as the architecture in 32-bit only. But this code would not be 64-compatible. I could try to convert these _start, _end symbols all to void*. But I will leave it as is for now. > > void * > > diff --git a/newlib/libc/sys/or1k/mlock.c b/newlib/libc/sys/or1k/mlock.c > > index ccb840161..a0c038335 100644 > > --- a/newlib/libc/sys/or1k/mlock.c > > +++ b/newlib/libc/sys/or1k/mlock.c > > @@ -38,6 +38,9 @@ volatile uint32_t _or1k_malloc_lock_restore; > > > > extern uint32_t or1k_sync_cas(void *address, uint32_t compare, uint32_t swap); > > > > +extern uint32_t or1k_critical_begin(); > > +extern void or1k_critical_end(uint32_t restore); > > + Fixes for: - warning: implicit declaration of function ‘or1k_critical_begin’ [-Wimplicit-function-declaration] - warning: implicit declaration of function ‘or1k_critical_end’ [-Wimplicit-function-declaration] Defining these as extern is inline with what we do for or1k_sync_cas. -Stafford
Hi Stafford, On Dec 11 14:39, Stafford Horne wrote: > On Wed, Dec 11, 2024 at 02:10:59PM +0100, Corinna Vinschen wrote: > > Hi Stafford, > > > > I'm not engaged in this stuff, so maybe this is dumb... > > > > Changing the parameter from uint32_t to void* sounds like it would have > > been the right thing from the start, but it's also an ABI change on 64 > > bit or1k. I could imagine the uint32_t is just a pointer value from the > > lower 4G space on 64 bit. Do we even support 64 bit or1k? > > Hi Corinna, > > I think it's a good conncern. I put some comments on the patch below with my > thoughts. > > If this is OK, I will send a v2 with a better description of each change. > > See below: > [...] > I agree that if we did have a 64-bit implementation it may be an > issue. But there never has been one, or1k is only 32-bit. I think > the ABI does not change with this patch. IIUC or1k is designed with 32 bit and 64 bit implementations in mind. However, if there's no existing 64 bit toolchain for or1k yet, my concern doesn't really matter. Even better if the ABI is 64 bit clean before such toolchain is created. > Maybe I am wrong, but I think this is safe because: > > - There is no ABI change as void* and uint32_t are the same in or1k > - There is no API change as or1k_uart.h is not a public API > > What do you think? Sounds good to me. Just go ahead with a v2 as per your suggestion. Thanks, Corinna
On Wed, Dec 11, 2024 at 11:40:06PM +0100, Corinna Vinschen wrote: > Hi Stafford, > > On Dec 11 14:39, Stafford Horne wrote: > > On Wed, Dec 11, 2024 at 02:10:59PM +0100, Corinna Vinschen wrote: > > > Hi Stafford, > > > > > > I'm not engaged in this stuff, so maybe this is dumb... > > > > > > Changing the parameter from uint32_t to void* sounds like it would have > > > been the right thing from the start, but it's also an ABI change on 64 > > > bit or1k. I could imagine the uint32_t is just a pointer value from the > > > lower 4G space on 64 bit. Do we even support 64 bit or1k? > > > > Hi Corinna, > > > > I think it's a good conncern. I put some comments on the patch below with my > > thoughts. > > > > If this is OK, I will send a v2 with a better description of each change. > > > > See below: > > [...] > > I agree that if we did have a 64-bit implementation it may be an > > issue. But there never has been one, or1k is only 32-bit. I think > > the ABI does not change with this patch. > > IIUC or1k is designed with 32 bit and 64 bit implementations in mind. Right, the architecture spec was expanded to include 64-bit but that has never taken off. > However, if there's no existing 64 bit toolchain for or1k yet, my > concern doesn't really matter. Even better if the ABI is 64 bit clean > before such toolchain is created. > > > Maybe I am wrong, but I think this is safe because: > > > > - There is no ABI change as void* and uint32_t are the same in or1k > > - There is no API change as or1k_uart.h is not a public API > > > > What do you think? > > Sounds good to me. Just go ahead with a v2 as per your suggestion. OK, thanks -Stafford
diff --git a/libgloss/or1k/interrupts.c b/libgloss/or1k/interrupts.c index 6badc497c..516d74be3 100644 --- a/libgloss/or1k/interrupts.c +++ b/libgloss/or1k/interrupts.c @@ -35,10 +35,10 @@ void or1k_interrupt_handler_add(uint32_t id, { #ifdef __OR1K_MULTICORE__ _or1k_interrupt_handler_table[or1k_coreid()][id] = handler; - _or1k_interrupt_handler_data_ptr_table[or1k_coreid()][id] = (uint32_t) data_ptr; + _or1k_interrupt_handler_data_ptr_table[or1k_coreid()][id] = data_ptr; #else _or1k_interrupt_handler_table[id] = handler; - _or1k_interrupt_handler_data_ptr_table[id] = (uint32_t) data_ptr; + _or1k_interrupt_handler_data_ptr_table[id] = data_ptr; #endif } diff --git a/libgloss/or1k/or1k_uart.c b/libgloss/or1k/or1k_uart.c index 0a991e6ba..1391d565c 100644 --- a/libgloss/or1k/or1k_uart.c +++ b/libgloss/or1k/or1k_uart.c @@ -90,7 +90,7 @@ void (*_or1k_uart_read_cb)(char c); * This is the interrupt handler that is registered for the callback * function. */ -void _or1k_uart_interrupt_handler(uint32_t data) +void _or1k_uart_interrupt_handler(void *data) { uint8_t iir = REG8(IIR); diff --git a/libgloss/or1k/or1k_uart.h b/libgloss/or1k/or1k_uart.h index 4cbb68350..201b7749f 100644 --- a/libgloss/or1k/or1k_uart.h +++ b/libgloss/or1k/or1k_uart.h @@ -30,7 +30,7 @@ extern void (*_or1k_uart_read_cb)(char c); /** * The UART interrupt handler */ -void _or1k_uart_interrupt_handler(uint32_t data); +void _or1k_uart_interrupt_handler(void *data); /** * Initialize UART diff --git a/libgloss/or1k/sbrk.c b/libgloss/or1k/sbrk.c index 0c3e66e87..ca196d228 100644 --- a/libgloss/or1k/sbrk.c +++ b/libgloss/or1k/sbrk.c @@ -20,7 +20,7 @@ #include "include/or1k-support.h" extern uint32_t end; /* Set by linker. */ -uint32_t _or1k_heap_start = &end; +uint32_t _or1k_heap_start = (uint32_t) &end; uint32_t _or1k_heap_end; void * diff --git a/newlib/libc/sys/or1k/mlock.c b/newlib/libc/sys/or1k/mlock.c index ccb840161..a0c038335 100644 --- a/newlib/libc/sys/or1k/mlock.c +++ b/newlib/libc/sys/or1k/mlock.c @@ -38,6 +38,9 @@ volatile uint32_t _or1k_malloc_lock_restore; extern uint32_t or1k_sync_cas(void *address, uint32_t compare, uint32_t swap); +extern uint32_t or1k_critical_begin(); +extern void or1k_critical_end(uint32_t restore); + /** * Recursive lock of the malloc */